Tôi sử dụng phiên bản Python của riêng mình time_it
chức năng. Ưu điểm của hàm này là nó lặp lại một phép tính nhiều lần khi cần thiết để thu được các kết quả có ý nghĩa. Nếu tính toán rất nhanh, nó sẽ được lặp lại nhiều lần. Cuối cùng, bạn có được thời gian trung bình của tất cả các lần lặp lại. Nó không sử dụng bất kỳ chức năng phi tiêu chuẩn:
#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);
}
Ví dụ sau đây sử dụng time_it
chức năng để đo hiệu suất của STL container khác nhau:
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";
}
}
Trong trường hợp bất cứ ai là tò mò đây là sản phẩm tôi được (biên soạn với VS2008 trong chế độ phát hành):
vector: 8,7168
danh sách: 27,776
deque: 91,52
bộ: 103,04
unordered_set: 29.76
Liệu GetTickCount() sử dụng QueryPerformanceCounter() bên dưới nắp ca-pô hay? – Mithrax
Điều đó tôi không biết. Tôi đã thêm một liên kết đến trang GetTickCount() và có vẻ như bạn có các tùy chọn khác, có lẽ tốt hơn dựa trên những gì có ở đó. – John
No. GetTickCount() không chính xác. Nếu bạn muốn đếm chính xác, bạn phải sử dụng QueryPerformanceCounter() (EDIT: bởi không chính xác tôi có nghĩa là +/- 10ms) –