Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Альтернативы
Недавние
Show all languages
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Межпроцедурная оптимизация

Из Википедии — свободной энциклопедии

Межпроцедурная оптимизация (англ. Interprocedural Optimization, IPO), или полнопрограммная оптимизация программ (англ. whole program optimization) — оптимизация компилятора, которая использует глобальный анализ потока управления и затрагивает множество процедур, даже находящихся в разных модулях, за счёт чего может достигаться существенный прирост быстродействия.

С ростом объёма программ разработчики стали делать свой код всё более удобочитаемым и повторно используемым. Зачастую это приводит к тому, что процедуры становятся предельно общими, в то время как в конкретной программе можно обойтись и частным случаем. Задача межпроцедурной оптимизации — именно генерация таких частных случаев.

Межпроцедурная оптимизация выполняется компилятором автоматически (иногда с указанием специальных директив). Её активация может приводить к существенному увеличению времени компиляции. К компиляторам, умеющим выполнять указанную оптимизацию, относятся MLton и MLKit для Standard ML, Stalin[en] для Scheme, JHC для Haskell, Intel C++ Compiler.

Примеры

Замена параметра функции константой

Пройдя по коду, компилятор убеждается, что один из параметров всегда константа, и уничтожает его.

Было

void DoSomething(Object* aObj, int aParam)
{
  if (aObj==NULL)
    throw logic_error("aObj==NULL");
  cout << "DoSomething(" << aObj->name() << "," << aParam << ")" << endl;
}

int main()
{
  Object obj1, obj2;

  DoSomething(&obj1, 1);
  DoSomething(&obj2, 1);

  return 0;
}

Стало

void DoSomething(Object* aObj)
{
  if (aObj==NULL)
    throw logic_error("aObj==NULL");
  cout << "DoSomething(" << aObj->name() << "," << 1 << ")" << endl;
}

int main()
{
  Object obj1, obj2;

  DoSomething(&obj1);
  DoSomething(&obj2);

  return 0;
}

Замена виртуального вызова статическим

Здесь компилятор убеждается, что все реально выполняющиеся виртуальные вызовы ведут к вызову одной и той же функции. Вместо того, чтобы обращаться к таблице виртуальных методов, компилятор делает прямой вызов функции.

В том же примере, если Object::name() — виртуальный метод, оптимизированная функция будет выглядеть так.

void DoSomething(Object* aObj)
{
  if (aObj==NULL)
    throw logic_error("aObj==NULL");
  cout << "DoSomething(" << Object::name(aObj) << "," << 1 << ")" << endl;
}

Удаление незадействованного кода

После удаления получится:

void DoSomething(Object* aObj)
{
  cout << "DoSomething(" << Object::name(aObj) << "," << 1 << ")" << endl;
}

Заодно может происходить чистка таблиц виртуальных методов.

Инлайнинг

Если функция используется однократно, она напрямую включается в то место, из которого она вызывается.

Небольшие функции также можно напрямую включать в вызывающий код.

Многие языки программирования (Паскаль, Java, D) не имеют ключевого слова inline, и решение инлайнировать функцию принимается оптимизатором (в случае Java — обфускатором).

Было

inline int DoSomething(int aParam)
{
  return aParam * aParam;
}

int main()
{
  int x = 2;
  int y = 3;
  
  cout << x << "^2=" << DoSomething(x) << ", " << y << "^2=" << DoSomething(y) << endl;

  return 0;
}

Стало

int main()
{
  int x = 2;
  int y = 3;
  
  cout << x << "^2=" << x*x << ", " << y << "^2=" << y*y << endl;

  return 0;
}

Ссылки

  • Thomas C. Spillman, «Exposing side effects in a PL/I optimizing compiler», in Proceedings of IFIPS 1971, North-Holland Publishing Company, pages 376—381.
  • Frances E. Allen, «Interprocedural Data Flow Analysis», IFIPS Proceedings, 1974.
  • Frances E. Allen, and Jack Schwartz, «Determining the Data Flow Relationships in a Collection of Procedures», IBM Research Report RC 4989, Aug. 1974.
  • Philip Abrams, «An APL Machine», Stanford University Computer Science Department, Report STAN-CS-70-158, February, 1970.
  • Terrence C. Miller, «Tentative Compilation: A Design for an APL Compiler», Ph.D. Thesis, Yale University, 1978.
Эта страница в последний раз была отредактирована 23 июля 2022 в 09:06.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).