Для повышения производительности в наших приложениях мы должны рассмотреть методы оптимизации цепей на этапе разработки.Методы оптимизации петли в C++
Я покажу вам несколько различных способов перебирать простой std::vector<uint32_t> v
:
неоптимизированного цикл с индексом:
uint64_t sum = 0; for (unsigned int i = 0; i < v.size(); i++) sum += v[i];
неоптимизированного цикл с итератором:
uint64_t sum = 0; std::vector<uint32_t>::const_iterator it; for (it = v.begin(); it != v.end(); it++) sum += *it;
Сохраненная
std::vector::end
итераторов:uint64_t sum = 0; std::vector<uint32_t>::const_iterator it, end(v.end()); for (it = v.begin(); it != end; it++) sum += *it;
Преинкремент итераторы:
uint64_t sum = 0; std::vector<uint32_t>::const_iterator it, end(v.end()); for (it = v.begin(); it != end; ++it) sum += *it;
Range на основе цикла:
uint64_t sum = 0; for (auto const &x : v) sum += x;
Существуют также другие способы построения цикла в C++; например, используя std::for_each
, BOOST_FOREACH
и т. д.
Какое из лучших решений для повышения производительности? И почему?
Кроме того, в приложениях с критическими характеристиками может быть полезно развернуть петли: как я мог это сделать?
'Какое лучшее решение для сохранения наших выступлений? И почему? Вы скажете мне. _Benchmark it._ –
Развертка Loop обычно выполняется компилятором. Кроме того, всегда используйте оператор pre-increment (в случае, аналогичном этому). – Xaqq
Хорошие компиляторы с приличной оптимизацией должны давать одну и ту же сборку для всех этих. Если ваш компилятор поддерживает ключевое слово 'restrict', вы можете получить чуть более высокую производительность, захватив массив вектора и суммируя его в for-loop (более C-подход). Вы не можете. Посмотрите на сборку под оптимизацией и посмотрите, есть ли вообще разница. – sfstewman