Улучшения производительности при переходе с g++/gcc 3.2.3 на 4.2.4.

StackOverflow https://stackoverflow.com/questions/119887

  •  02-07-2019
  •  | 
  •  

Вопрос

Мы рассмотрели версии g++ 3.2.3 и 4.2.4.В версии 4.2.4 производительность некоторых элементов нашей кодовой базы значительно улучшилась.

Я пробовал искать база данных GCC Buzilla чтобы найти подсказки относительно того, какие ошибки могли иметь такое значительное улучшение, но я не нашел ни одной отдельной ошибки, которая бы выделялась в качестве кандидата.

Являются ли улучшения результатом множества небольших изменений, которые постепенно оказали влияние?Или, скажем, существует топ-5 улучшений, которые могли бы изменить ситуацию?

В нашей кодовой базе эффективно используются контейнеры и алгоритмы STL, а также функции C++, такие как ключевое слово inline.

Это было полезно?

Решение

По моему опыту, именно в версии 3.4 производительность достигает максимума;4.2 на самом деле медленнее, чем 3.4 в моем проекте, причем 4.3 является первой версией, которая примерно равна производительности 3.4.4.4 немного быстрее 3.4.

Я обнаружил несколько конкретных случаев, когда старые версии gcc выполняли в коде какие-то невероятно медленные вещи - была определенная функция, которая переходила со 128 на 21 такт с 3,4 на 4,3, но это, очевидно, был особый случай (это был короткий цикл, в котором добавление всего лишь нескольких ненужных инструкций сильно ухудшало производительность).

Лично я использую версию 3.4 только потому, что она компилируется намного быстрее, что значительно ускоряет тестирование.Я также стараюсь избегать последних версий, потому что у них, похоже, есть неприятная привычка к неправильной компиляции кода;--march core2 в последних версиях gcc вызывает, например, сбои сегментирования в моей программе, потому что он генерирует автовекторизованный код, который пытается выполнить выровненный доступ к невыровненным адресам.

Однако в целом различия редко бывают большими;3-5% это абсолют большинство Я видел изменения в производительности.

Обратите внимание: это C;В C++ все может быть по-другому.

Другие советы

Я считаю, что оптимизатор был полностью переработан в серии gcc4.См., например, эту страницу о векторизации:

http://gcc.gnu.org/projects/tree-ssa/vectorization.html

Для информации: однажды я провел тест c[i] = a[i] + b[i] с динамическими массивами, статическими массивами и std::vector, и именно std::vector был самым быстрым (с gcc 4.1).Разница в производительности 30%.

Потоки были очень медленными в версии 3.3 и стали намного быстрее в версии 3.4.(сообщение в списке рассылки gccБьюсь об заклад, другие вещи тоже улучшились.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top