Стало интересно, насколько много мы теряем, когда с дуру и не к месту перебираем элементы вектора не по индексу, а используя итератор.
Вариант 1 - доступ к значениям элементов вектора по индексу.
#include <iostream>
#include <vector>
using namespace std;
int main() {
size_t vsize = 200000000;
vector<double> v;
v.resize(vsize, 0);
for ( size_t i=0; i<vsize; i++ ) {
v[i] = i/0.23;
}
double x = 0;
for ( size_t i=0; i<vsize; i++ ) {
x = v[i] / 283746.40596837 * 0.92386936827364;
}
return 0;
}
Среднее по 5-ти замерам время работы программы составило
4.7136 сек.
Вариант 2 - доступ к значениям элементов вектора с использованием итератора.
#include <iostream>
#include <vector>
using namespace std;
int main() {
size_t vsize = 200000000;
vector<double> v;
v.resize(vsize, 0);
for ( size_t i=0; i<vsize; i++ ) {
v[i] = i/0.23;
}
double x = 0;
for ( vector<double>::iterator it=v.begin(); it!=v.end(); ++it ) {
x = *it / 283746.40596837 * 0.92386936827364;
}
return 0;
}
Среднее по 5-ти замерам время работы программы составило
7.196 сек.
Итак, производительность во втором случае упала почти на 34.5%...
Честно говоря, я не думал, что итераторы настолько круто снижают производительность.
Для справки: компиляция осуществлялась с флагом
-O0.
UPD: 09.01.2013
А теперь вариант 3 (с использованием возможностей C++11).
#include <iostream>
#include <vector>
using namespace std;
int main() {
size_t vsize = 200000000;
vector<double> v;
v.resize(vsize, 0);
for ( size_t i=0; i<vsize; i++ ) {
v[i] = i/0.23;
}
double x = 0;
for ( size_t z : v ) {
x = z / 283746.40596837 * 0.92386936827364;
}
return 0;
}
Производительность практически та же, что и в варианте 2.