Моя проблема связана со временем выполнения приложения .exe. Мне дали очень большой код (который я знаю, что он не содержит ошибок), но для его запуска требуется слишком много времени. Я скомпилировал его с GNU, и я не могу использовать параллельное программирование, так как на моем компьютере только два процессора.
Проблема связана с одной подпрограммой из 2000 строк. Я заметил, что это в основном состоит из петель, где я думаю, что проблема в этом. Также он вызывается как 20000 раз основной программой.
Сначала я использовал флаги -O (лучшее время выполнения было с -Ofast). После этого я попытался улучшить производительность циклов с помощью -fforce-addr, но никакого ощутимого ускорения не произошло. В последнее время я использую другие флаги, такие как -mtune, для создания кода, оптимизированного для локальной машины.
Вот мои основные тесты и результаты:
- Оригинальная программа (31 с)
COMPOPTS= -pthread -finline-functions -fbacktrace -fzero-initialized-in-bss -fno-automatic -frecord-marker=4
LINKOPTS= -l unlimit -s unlimited
- Использование -Ofast (25 с)
COMPOPTS= -pthread -finline-functions -fbacktrace -fzero-initialized-in-bss -fno-automatic -frecord-marker=4 -cpp
LINKOPTS= -l unlimit -s unlimited
- Последняя ситуация (24 с)
COMPOPTS= -mtune=native -pthread -finline-functions -fbacktrace -fzero-initialized-in-bss -fno-automatic -frecord-marker=4 -cpp -fforce-addr -fschedule-insns2 -ffp-contract=off
LINKOPTS=-l ulimit -s unlimited
У меня есть версия .exe, скомпилированная с Intel, и время ее работы - 7 с. Я знаю, что Intel обычно работает на 20-40% быстрее, чем GNU, поэтому я думаю, что есть место для улучшений.