Я работал над генетическим алгоритмом, который я ранее компилировал с использованием g++ 4.8.1 с аргументами
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11
Я не использовал многие функции С++ 11 и имел разумную систему профилирования, поэтому я заменил буквально 3-4 строки кода и скомпилировал ее без -std = gnu ++ 11
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native
Когда я снова запустил свой профилировщик, я заметил, что почти везде вижу улучшение производительности на 5%, за исключением моей функции сортировки, которая теперь занимает примерно вдвое больше. (Это перегруженный оператор < на объекте)
Мои вопросы:
Какие различия в производительности существуют между двумя версиями, и ожидается ли, что С++ 11 будет быстрее в новых компиляторах?
Я также ожидаю, что я использую -Ofast играет роль, правильно ли я в своем предположении?
UPDATE:
Как было предложено в комментариях, я снова запускал тесты с использованием и без -march = native
// Fast sort, slightly slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11
// Fast sort, slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -std=gnu++11
// Slow sort, slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse
// Slow sort, fastest in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native
Заключение похоже на то, что -std = gnu ++ 11 ускоряет сортировку резко с небольшим штрафом почти везде. -march = native speed up program всякий раз, когда используется.
Учитывая, что сортировка вызывается только один раз за поколение, я получаю преимущество в скорости не компиляции с -std = gnu ++ 11, но мне все еще очень интересно то, что вызывает эти результаты.
Я использую //std:: sort из #include