Какие известные различия в производительности обнаруживаются при использовании -std = gnu ++ 11

Я работал над генетическим алгоритмом, который я ранее компилировал с использованием 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

Ответы

Ответ 1

Я не уверен, почему использование -std = gnu ++ 11 сделает части кода более медленными. Я не использую это лично (вместо этого я использую -std = С++ 11). Возможно, дополнительные функции GNU замедляют работу? Скорее всего, оптимизация еще не догнала новые языковые возможности.

Что касается того, почему часть сортировки выполняется быстрее, у меня есть правдоподобное объяснение:

Вы включили семантику перемещения. Даже если вы явно не пишете их самостоятельно, если ваши классы разумно сконструированы, они будут сгенерированы. Алгоритм сортировки, вероятно, использует их.

Однако класс, указанный выше, похоже, не имеет большого объема памяти. Однако он не имеет метода "своп", поэтому без семантики перемещения С++ 11 процедура сортировки должна выполнять больше работы. Вы можете посмотреть этот вопрос и ответы для получения дополнительной информации о сортировке и перемещении семантики и взаимодействии с параметрами компилятора.

Ответ 2

Был большой интерес к тому, почему метод сортировки имел такое снижение производительности.

Меня больше интересует, почему в остальном коде было хорошее улучшение, но чтобы помочь в разговоре, ниже - это единственная часть моего кода, которая была быстрее, чем -std = gnu ++ 11

Его просто сравнение двойника на члене векторных объектов.

class TvectorPM {
public:
    pthread_mutex_t lock;
    std::vector<PopulationMember> v; 
    void add(PopulationMember p);
};

void TvectorPM::add(PopulationMember p) {
    pthread_mutex_lock(&lock);
    v.push_back(p);
    pthread_mutex_unlock(&lock);
}


class PopulationManager {
public:
    TvectorPM populationlist;
}


void PopulationManager::sortByScore() {
    // Have overloaded operator< to make this fast
    sort(populationlist.v.begin(),populationlist.v.end());
}


class PopulationMember {
public:
    bool hasChanged;
    double score;

    inline bool operator< (const PopulationMember& rhs) const{
        return this->score < rhs.score;
    }

Ответ 3

Я считаю, что это связано с особенностями GNU, добавляет (документация по расширениям GNU).

Эти расширения могут довольно разумно оптимизировать некоторые функции и предоставлять дополнительные накладные расходы для других, поскольку производительность зависит от формы кода.

К сожалению, я не могу обеспечить специфику.

Ответ 4

C++11 отличается от старых версий несколькими аспектами. Многие улучшения были внесены и в исходное ядро ​​языка.
Кроме того, добавлены некоторые дополнительные функции. Вы можете посетить эту веб-страницу и посмотреть элементы с тегом C++11.
Некоторые из второстепенных, но сильно используемых функций -

1. initializer list for `vectors`<br>
2. range based `for` loop<br>
3. the `auto` keyword, for declaring data types, <br>
4. the 'uniform initialization syntax', in its full glory

а также флаг -std=c++11, который должен использоваться для использования любой из вышеперечисленных функций.

Что касается проблем с производительностью, возможно, это было просто совпадение. Но, конечно, запустите компиляции несколько раз.