Używam własnej wersji funkcji Pythona time_it
. Zaletą tej funkcji jest to, że powtarza ona obliczenia tyle razy, ile potrzeba, aby uzyskać znaczące wyniki. Jeśli obliczenia są bardzo szybkie, będą powtarzane wiele razy. Na koniec uzyskasz średni czas wszystkich powtórzeń. Nie używa żadnych niestandardowych funkcjonalności:
#include <ctime>
double clock_diff_to_sec(long clock_diff)
{
return double(clock_diff)/CLOCKS_PER_SEC;
}
template<class Proc>
double time_it(Proc proc, int N=1) // returns time in microseconds
{
std::clock_t const start = std::clock();
for(int i = 0; i < N; ++i)
proc();
std::clock_t const end = std::clock();
if(clock_diff_to_sec(end - start) < .2)
return time_it(proc, N * 5);
return clock_diff_to_sec(end - start) * (1e6/N);
}
Poniższy przykład wykorzystuje funkcję time_it
mierzyć skuteczność różnych pojemnikach STL:
void dummy_op(int i)
{
if(i == -1)
std::cout << i << "\n";
}
template<class Container>
void test(Container const & c)
{
std::for_each(c.begin(), c.end(), &dummy_op);
}
template<class OutIt>
void init(OutIt it)
{
for(int i = 0; i < 1000; ++i)
*it = i;
}
int main(int argc, char ** argv)
{
{
std::vector<int> c;
init(std::back_inserter(c));
std::cout << "vector: "
<< time_it(boost::bind(&test<std::vector<int> >, c)) << "\n";
}
{
std::list<int> c;
init(std::back_inserter(c));
std::cout << "list: "
<< time_it(boost::bind(&test<std::list<int> >, c)) << "\n";
}
{
std::deque<int> c;
init(std::back_inserter(c));
std::cout << "deque: "
<< time_it(boost::bind(&test<std::deque<int> >, c)) << "\n";
}
{
std::set<int> c;
init(std::inserter(c, c.begin()));
std::cout << "set: "
<< time_it(boost::bind(&test<std::set<int> >, c)) << "\n";
}
{
std::tr1::unordered_set<int> c;
init(std::inserter(c, c.begin()));
std::cout << "unordered_set: "
<< time_it(boost::bind(&test<std::tr1::unordered_set<int> >, c)) << "\n";
}
}
W przypadku gdy ktoś jest ciekawy tutaj jest wyjście I get (skompilowany z VS2008 w trybie uwalniania):
wektor: 8,7168
lista: 27,776
deque: 91,52
zestaw: 103,04
unordered_set: 29.76
Does GetTickCount()() użyć QueryPerformanceCounter pod maską lub? – Mithrax
Tego nie wiem. Dodałem link do strony GetTickCount() i wygląda na to, że masz inne, prawdopodobnie lepsze opcje oparte na tym, co tam jest. – John
Nie. GetTickCount() jest niedokładny. Jeśli chcesz dokładnej liczby, należy użyć QueryPerformanceCounter() (EDIT: przez niedokładne Znaczy +/- 10ms) –