У меня есть два алгоритма, написанные на C ++. Насколько я знаю, это нормально для компиляции с
-O0 -NDEBUG (g ++) при сравнении производительности двух алгоритмов (бессимптомно они одинаковы).
Но я думаю, что уровень оптимизации несправедлив по отношению к одному из них, потому что он использует STL в каждом случае. Программа, использующая обычный массив, превосходит алгоритм STL-Heavy в 5 раз быстрее, в то время как она компилируется с опциями -O0. Но разница в производительности не сильно отличается, когда я компилирую их с -O2 -NDEBUG.
Есть ли какой-нибудь способ получить лучшее от STL (я получаю сильный удар по производительности в операторе vector []) на уровне оптимизации -O0?
Какой уровень оптимизации (и, возможно, такие переменные, как -NDEBUG) вы используете при сравнении двух алгоритмов?
Также будет очень полезно, если кто-то может дать некоторое представление о тенденции в академических исследованиях по сравнению производительности алгоритмов, написанных на C ++?
EDIT:
Хорошо, чтобы изолировать проблему уровня оптимизации, я сейчас использую один алгоритм, но две разные реализации.
Я изменил одну из функций с необработанными указателями (int и boolean) на std :: vector и std :: vector ... С -O0 -NDEBUG производительность составляет 5,46 с (необработанный указатель) и 11,1 с (стандартное указание) ::вектор). А с -O2 -NDEBUG производительность составляет 2,02 с (необработанный указатель) и 2,21 с (std :: vector). Тот же алгоритм, одна реализация использует 4/5 динамических массивов int и boolean. А другой использует вместо этого std :: vector и std :: vector. Они одинаковы в любом другом случае
Вы можете видеть, что в -O0 std :: vector превосходит в два раза быстрее указатели. Хотя в -O2 они практически одинаковы.
Но я действительно сбит с толку, потому что в академических областях, когда они публикуют результаты алгоритмов во время выполнения, они компилируют программы с -O0.
Есть ли какие-то опции компилятора, которые мне не хватает?