Chyba gdybym zamiar przetestować coś takiego, to bym chyba zacząć z kodem coś w tej kolejności:
#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;
}
Ponieważ używa clock
, powinno to dać czas procesora nie ściennych czasu (choć niektóre kompilatory takie jak MS VC++ źle to rozumieją). Nie próbuje zmierzyć czasu wstawienia poza czasem, aby znaleźć punkt wstawienia, ponieważ 1) wymagałoby nieco więcej pracy i 2) nadal nie mogę się dowiedzieć, co by to miało miejsce. Z pewnością jest to bardzo dokładne, ale biorąc pod uwagę różnicę, jaką widzę z tego, byłbym nieco zaskoczony, widząc znaczącą różnicę w porównaniu z bardziej uważnym testowaniem. Na przykład, z MS VC++, dostaję:
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
z gcc uzyskać:
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
Faktoring się czas wyszukiwania byłoby nieco nietrywialne, ponieważ trzeba by raz każda iteracja osobno . Aby uzyskać znaczące wyniki, potrzebujesz czegoś bardziej precyzyjnego niż clock
(więcej informacji na temat zamówienia lub odczytywania rejestru cyklu zegara). Możesz to zmienić, jeśli uznasz to za stosowne - jak wspomniałem powyżej, brakuje mi motywacji, ponieważ nie widzę, jak to jest rozsądne.
Nie jest jasne, co masz na myśli mówiąc "...Wstawianie i usuwanie elementów, które można zrobić wcześniej, tak aby nie wpłynęły na czasy? "Jeśli chcesz wstawić i usunąć czas, wyraźnie chcesz wstawienia i usunięcia, aby wpłynąć na czas .. –
Mam, ale nie chcę determinacji gdzie punkt wstawienia/usunięcia będzie częścią czasu .. – soandos
Aha, widzę, i nie tylko staram się, aby lista wyglądała na bardziej konkurencyjną, dlaczego dokładnie chciałbyś to zrobić? Na pewno nie powie ci wszystko, co jest związane z używaniem w realnym świecie: –