БлогNot. Контейнеры в QT: квадратные скобки или итератор?

Контейнеры в QT: квадратные скобки или итератор?

Создав консольный проект в QT, реализуем в трёх видах суммирование достаточно большого количества элементов контейнера QList <int> с измерением времени выполнения этого процесса при помощи объекта QElapsedTimer. А три вида - это доступ к элементам одного и того же контейнера посредством 1) квадратных скобок, 2) итератора и 3) цикла foreach. Теоретически, конечно, второй и третий способы должны давать одно и то же, если слинковать правильно :)

Листинг этой несложной программки приводится ниже.

#include <QtCore>
#include <iostream>
using namespace std;

int main() {
 QElapsedTimer timer;
 QList <int> list;
 int size = 1e8;
 list.reserve(size);
 qsrand(QTime(0,0).secsTo(QTime::currentTime()));
 for (int i=0; i<size; i++) list.push_back(qrand()%100);
 long sum = 0;
 //доступ по []
 timer.start();
 for (int i=0; i<size; i++) sum += list[i];
 int t1 = timer.elapsed();
 cout << "[]: " << t1 << endl;
 //доступ через итератор
 sum = 0; timer.start();
 QList <int>::const_iterator i;
 for (i=list.constBegin(); i!=list.constEnd(); ++i)
     sum += *i;
 t1 = timer.elapsed();
 cout << "it: " << t1 << endl;
 //доступ через foreach (теоретически как п.2)
 sum = 0; timer.start();
 foreach (const int i, list) sum += i;
 t1 = timer.elapsed();
 cout << "foreach: " << t1 << endl;
 return 0;
}

Вот что у нас вышло в QT 5.5 и 5.10.X:

[]: 2308
it: 2074
foreach: 1313

и на другом компе, кстати, с 16 Гб оперативки вместо 4 и более новым QT:

[]: 2486
it: 1663
foreach: 1099

Но! Нужно понимать, что в Debug-конфигурациях сравнение по быстродействию вообще некорректно.

Кто меньше насовал отладочной инфы и другого мусора в код, тот и "быстрее".

Включив "оптимизацию на скорость" -O2 (предполагается, что компилируем через MinGW), то есть, добавив в файл .pro проекта строчку

QMAKE_CXXFLAGS += -O2

повторим эксперимент. Только перед запуском выполним команду меню Сборка - Пересобрать проект, чтобы изменения наверняка учлись в исполняемом коде.

[]: 138
it: 0
foreach: 0

и на другом компе:

[]: 114
it: 0
foreach: 0

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

Выводы о том, медленнее ли квадратные скобки, чем рекомендуемые средства, то есть, итераторы и foreach, делайте сами :)


теги: список программирование время c++ qt

08.04.2019, 16:55; рейтинг: 172