Я пишу трассировщик лучей.
Недавно я добавил в программу многопоточность, чтобы использовать дополнительные ядра на моем i5 Quad Core.
При странном повороте событий отладочная версия приложения теперь работает медленнее, но оптимизированная сборка работает быстрее, чем до того, как я добавил многопоточность.
Я передаю флаги "-g -pg" в gcc для отладочной сборки и флаг "-O3" для оптимизированной сборки.
Хост-система: Ubuntu Linux 10.4 AMD64.
Я знаю, что символы отладки значительно увеличивают нагрузку на программу, но относительная производительность всегда поддерживалась. То есть более быстрый алгоритм всегда будет работать быстрее в сборках отладки и оптимизации.
Есть идеи, почему я вижу это поведение?
Отладочная версия скомпилирована с "-g3 -pg". Оптимизированная версия с "-O3".
Optimized no threading: 0m4.864s
Optimized threading: 0m2.075s
Debug no threading: 0m30.351s
Debug threading: 0m39.860s
Debug threading after "strip": 0m39.767s
Debug no threading (no-pg): 0m10.428s
Debug threading (no-pg): 0m4.045s
Это убеждает меня в том, что «-g3» не виноват в странной дельте производительности, а в том, что это скорее ключ «-pg». Вероятно, опция -pg добавляет какой-то механизм блокировки для измерения производительности потока.
Так как "-pg" не работает на многопоточных приложениях, я просто удалю его.