Контейнеры в 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
, делайте сами :)
08.04.2019, 16:55 [1973 просмотра]