Вот код, который я написал, скомпилированный в Code :: Blocks v12.11, с использованием компилятора mingw по умолчанию.
Это создает огромный вектор, а затем обращается к каждому элементу с помощью итераторов, at () и index.
Каждый зацикливается один раз, вызывая последний элемент по функции, и один раз, сохраняя последний элемент во временной памяти.
Синхронизация выполняется с использованием GetTickCount.
#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
int main()
{
cout << "~~ Vector access speed test ~~" << endl << endl;
cout << "~ Initialization ~" << endl;
long long t;
int a;
vector <int> test (0);
for (int i = 0; i < 100000000; i++)
{
test.push_back(i);
}
cout << "~ Initialization complete ~" << endl << endl;
cout << " iterator test: ";
t = GetTickCount();
for (vector<int>::iterator it = test.begin(); it < test.end(); it++)
{
a = *it;
}
cout << GetTickCount() - t << endl;
cout << "Optimised iterator: ";
t=GetTickCount();
vector<int>::iterator endofv = test.end();
for (vector<int>::iterator it = test.begin(); it < endofv; it++)
{
a = *it;
}
cout << GetTickCount() - t << endl;
cout << " At: ";
t=GetTickCount();
for (int i = 0; i < test.size(); i++)
{
a = test.at(i);
}
cout << GetTickCount() - t << endl;
cout << " Optimised at: ";
t = GetTickCount();
int endof = test.size();
for (int i = 0; i < endof; i++)
{
a = test.at(i);
}
cout << GetTickCount() - t << endl;
cout << " Index: ";
t=GetTickCount();
for (int i = 0; i < test.size(); i++)
{
a = test[i];
}
cout << GetTickCount() - t << endl;
cout << " Optimised Index: ";
t = GetTickCount();
int endofvec = test.size();
for (int i = 0; i < endofvec; i++)
{
a = test[i];
}
cout << GetTickCount() - t << endl;
cin.ignore();
}
Исходя из этого, я лично понял, что "оптимизированные" версии работают быстрее, чем "неоптимизированные". Итераторы медленнее, чем vector.at (), который медленнее, чем прямые индексы.
Я предлагаю вам скомпилировать и запустить код для себя.
РЕДАКТИРОВАТЬ : Этот код был переписан, когда у меня было меньше опыта работы с C / C ++. Еще одним тестовым примером должно быть использование префиксных операторов приращения вместо постфикса. Это должно улучшить время работы.