Полагаю, если бы я собирался протестировать что-то подобное, я бы, вероятно, начал с кода чего-то такого:
#include <list>
#include <vector>
#include <algorithm>
#include <deque>
#include <time.h>
#include <iostream>
#include <iterator>
static const int size = 30000;
template <class T>
double insert(T &container) {
srand(1234);
clock_t start = clock();
for (int i=0; i<size; ++i) {
int value = rand();
T::iterator pos = std::lower_bound(container.begin(), container.end(), value);
container.insert(pos, value);
}
// uncomment the following to verify correct insertion (in a small container).
// std::copy(container.begin(), container.end(), std::ostream_iterator<int>(std::cout, "\t"));
return double(clock()-start)/CLOCKS_PER_SEC;
}
template <class T>
double del(T &container) {
srand(1234);
clock_t start = clock();
for (int i=0; i<size/2; ++i) {
int value = rand();
T::iterator pos = std::lower_bound(container.begin(), container.end(), value);
container.erase(pos);
}
return double(clock()-start)/CLOCKS_PER_SEC;
}
int main() {
std::list<int> l;
std::vector<int> v;
std::deque<int> d;
std::cout << "Insertion time for list: " << insert(l) << "\n";
std::cout << "Insertion time for vector: " << insert(v) << "\n";
std::cout << "Insertion time for deque: " << insert(d) << "\n\n";
std::cout << "Deletion time for list: " << del(l) << '\n';
std::cout << "Deletion time for vector: " << del(v) << '\n';
std::cout << "Deletion time for deque: " << del(d) << '\n';
return 0;
}
Поскольку он использует clock
, это должно дать время процессора, а не время стены (хотя некоторые компиляторы, такие как MS VC ++, ошибаются). Он не пытается измерить время для вставки, исключая время, чтобы найти точку вставки, поскольку 1) это заняло бы немного больше работы и 2) я до сих пор не могу понять, чего он достигнет. Это, конечно, не 100% строго, но учитывая несоответствие, которое я вижу из этого, я был бы немного удивлен, увидев существенное отличие от более тщательного тестирования. Например, с MS VC ++ я получаю:
Insertion time for list: 6.598
Insertion time for vector: 1.377
Insertion time for deque: 1.484
Deletion time for list: 6.348
Deletion time for vector: 0.114
Deletion time for deque: 0.82
С gcc я получаю:
Insertion time for list: 5.272
Insertion time for vector: 0.125
Insertion time for deque: 0.125
Deletion time for list: 4.259
Deletion time for vector: 0.109
Deletion time for deque: 0.109
Вычисление времени поиска было бы несколько нетривиальным, потому что вам приходилось бы рассчитывать каждую итерацию отдельно. Вам нужно что-то более точное, чем clock
(обычно это так), чтобы получить значимые результаты из этого (подробнее о порядке или чтении регистра тактового цикла). Не стесняйтесь вносить изменения, если считаете нужным - как я упоминал выше, у меня нет мотивации, потому что я не понимаю, как это разумно делать.