Одна старая история про компиляторы.
Дело было в 2007-2010-х годах, в бытность моей работы в Intel. Пролетал тогда знатный вой, что, дескать, берём тесты для компиляторов, которыми все меряются (у них тоже, как у мальчиков свои линейки и свои сантиметры). Берём интеловский компилятор и видим, как он невероятно хорош. Чуть-чуть модифицируем тесты, и интеловский компилятор уже показывает такую же производительность, как и открытый конкурент - GCC. А всё потому что Intel свой компилятор заточил под тесты и маркетинг, а не для боевых задач.
Тогда над этой историей все залихватски посмеялись. "И так понятно", что при капитализме красивый отчёт в рекламном буклете важнее чем работающий продукт.
Прошло больше десяти лет. Начал постигать компиляторы, и теперь имею что сказать.
"Чуть-чуть модифицируем тесты" - как много в этом звуке.
Не буду повторять про заезженные всеми неопрятно вставленные call и branch посреди вычислений, провожающие ваш компилятор с пляжа под улюлюканье конкурентов (которые сами тайком молятся, чтобы им этот call/branch не прописали). А расскажу про менее очевидную вещь.
Например, есть многомерные массивы, а есть их моделирование через одномерные, которое эквивалентно по вычислениям и доступам к памяти:
aij и ai * n + j
С точки зрения программиста-обывателя, это одно и то же. Но с точки зрения компилятора...
Рассмотрим задачу анализа зависимостей по данным в операциях. Анализ зависимостей нужен, чтобы принять решение о применении таких сильных оптимизаций как анроллинг и векторизация. Если анализ возможен и даёт ответ "независимы", оптимизации применяются, код ускоряется в разы. Иначе оптимизации отклоняются.
Например, компилятор должен провести анализ зависимостей для такой задачи (частый случай):
многомерный массив:
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
aC * i + DE * j + F = aG * i + HK * j + L;
"эквивалентная" одномерная имитация:
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
a(C * i + D) * n + E * j + F = a(G * i + H) * n + K * j + L;
где C, D, E, E, F, G, H, K, L - константы.
Задача анализа с многомерным массивом сводится к вопросу: имеет ли система линейных диофантовых уравнений с _постоянными_ коэффициентами решение при заданных ограничениях:
C * i_1 + D = G * i_2 + H
E * j_1 + F = K * j_2 + L
Эта задача хорошо изучена, во многих случаях она даёт точный ответ, и не только наличие решения, но и минимальные по модулю i_2 - i_1 и j_2 - j_1, что тоже важно, т.к. при некоторых их значениях оптимизации всё равно допустимы, но детали опущу.
А вот для "эквивалентной" одномерной имитации нужно ответить на аналогичный вопрос для линейного диофантова уравнения с _неизвестными_ коэффициентами (число n компилятору неизвестно):
(C * i_1 + D) * n + E * j _1+ F = (G * i_2 + H) * n + K * j_2 + L
Такого рода уравнения анализируются значительно хуже. Можно сказать, что в большинстве случаев компилятор откажется от его анализа.
Это был не самый очевидный пример про то как "чуть-чуть" поправили код на "эквивалентный", всем же очевидно, и получили просад по производительности в разы.
Надо будет, наверное, этот пример на конференцию вытащить, очень уж красив.