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

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

Межпроцедурная оптимизация выполняется компилятором автоматически (иногда с указанием специальных директив). Её активация может приводить к существенному увеличению времени компиляции. К компиляторам, умеющим выполнять указанную оптимизацию, относятся MLton и MLKit для Standard ML, Stalin[англ.] для 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.

📚 Artikel Terkait di Wikipedia

Встраивание функций

Джон Р. Левин[англ.] «Полная оптимизация программы на Visual C++ .NET (Whole Program Optimization with Visual C++ .NET)», Брэндон Брэй(Brandon Bray)

Стохастический градиентный спуск

Mathematical Optimization - Basic Optimization Theory and Gradient-Based Algorithms. — 2. — Springer, 2018. — С. xxvi+372. — (Springer Optimization and Its

C&C Prize

Industry by Creation of the Reduced Instruction Set Computer (RISC) and Program Optimization Technology» Ясухару Суэмацу[англ.] Takanori Okoshi[англ.] Оригинальный

Solar X

редакционной коллегии журнала Optimization Letters издательства Springer, а также книжной серии Springer Optimization and Its Applications. С 2002 года

Таксономия Флинна

Severance, Kevin Dowd. High Performance Computing (RISC Architectures, Optimization & Benchmarks), 2nd Edition (англ.). — O'Reilly Media, 1998. — 466 p. —

Интерферометр Уайта — Джудэя

Bibcode:2003GReGr..35.2025W. White, Harold. Warp Field Mechanics 102: Energy Optimization . NASA Johnson Space Center (январь 2013). Дата обращения: 2013-29-07

Unreal Engine

Архивировано из Legacy:Zone Portal оригинала 4 сентября 2011 года. Level Optimization — Antiportals (англ.). Unreal Developer Network. Дата обращения: 12 февраля

Иттрий-90

года. Rault, E.; Vandenberghe, S.; Staelens, S.; Lemahieu, I. (2009). Optimization of Yttrium-90 Bremsstrahlung Imaging with Monte Carlo Simulations. 4th