Чтобы получить справедливое сравнение, я думаю, что должно подойти что-то вроде следующего:
#include <sys/time.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <numeric>
int main()
{
static size_t const size = 7e6;
timeval start, end;
int sum;
gettimeofday(&start, 0);
{
std::vector<int> v(size, 1);
sum = std::accumulate(v.begin(), v.end(), 0);
}
gettimeofday(&end, 0);
std::cout << "= vector =" << std::endl
<< "(" << end.tv_sec - start.tv_sec
<< " s, " << end.tv_usec - start.tv_usec
<< " us)" << std::endl
<< "sum = " << sum << std::endl << std::endl;
gettimeofday(&start, 0);
int * const arr = new int[size];
std::fill(arr, arr + size, 1);
sum = std::accumulate(arr, arr + size, 0);
delete [] arr;
gettimeofday(&end, 0);
std::cout << "= Simple array =" << std::endl
<< "(" << end.tv_sec - start.tv_sec
<< " s, " << end.tv_usec - start.tv_usec
<< " us)" << std::endl
<< "sum = " << sum << std::endl << std::endl;
}
В обоих случаях выполняется динамическое распределение и освобождение, а также доступ к элементам.
На моей Linux-коробке:
$ g++ -O2 foo.cpp
$ ./a.out
= vector =
(0 s, 21085 us)
sum = 7000000
= Simple array =
(0 s, 21148 us)
sum = 7000000
Оба варианта std::vector<>
и массива имеют сопоставимую производительность. Дело в том, что std::vector<>
может быть таким же быстрым, как простой массив, если ваш код структурирован надлежащим образом.
Для связанной заметки оптимизация отключения имеет огромное значение в этом случае:
$ g++ foo.cpp
$ ./a.out
= vector =
(0 s, 120357 us)
sum = 7000000
= Simple array =
(0 s, 60569 us)
sum = 7000000
Многие из утверждений об оптимизации, сделанных такими людьми, как Нил и Джалф, полностью верны.
НТН!
РЕДАКТИРОВАТЬ : исправленный код для принудительного включения вектора разрушения в измерения времени.