我正在尝试在哈希表中插入多个项目,并以毫秒为单位测量插入时间。基本上,它的工作原理如下(此函数属于我的哈希表的类):
double benchmark(int amountOfInsertions){
int valueToInsert;
timeval tv_timeStart, tv_timeEnd;
double totalTime = 0;
double db_timeStart, db_timeEnd;
for (int i = 0; i < amountOfInsertions; i++){
valueToInsert = generateRandomVariable();
gettimeofday(&tv_timeStart, NULL);
insert(valueToInsert);
gettimeofday(&tv_timeEnd, NULL);
db_timeStart = tv_timeStart.tv_sec*1000 + tv_timeStart.tv_usec/1000.0;
db_timeEnd = tv_timeEnd.tv_sec*1000 + tv_timeEnd.tv_usec/1000.0;
totalTime += (db_timeEnd - db_timeStart);
}
return totalTime;
}
问题是插入时间看起来像这样,显然显示出明显的时间进度,插入的项目越多:
但现在,我注意到插入时间在相同值之间交替出现(大约为15.625的倍数),从而产生极不准确的结果:
它刚刚开始发生,即使我的代码的旧版本我知道输出正确的时间。这是gettimeofday()的一个特殊问题吗?如果没有,它会是什么?
这个问题对我来说是如此神秘,甚至怀疑这是否是正确询问它的正确方法。
更新:我也尝试过使用clock()和std :: chrono :: steady_clock,以及测量整个循环的时间而不是每次插入(下面的例子),并且仍然有相同的行为:
double benchmark(int amountOfInsertions){
int valueToInsert;
double totalTime = 0;
steady_clock::time_point t1 = steady_clock::now();
for (int i = 0; i < amountOfInsertions; i++){
valueToInsert = generateRandomVariable();
insert(valueToInsert);
}
steady_clock::time_point t2 = steady_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
totalTime = time_span.count()*1000;
return totalTime;
}
答案 0 :(得分:4)
我不知道是什么导致gettimeofday
的计时器分辨率突然发生了变化,但据我所知should not be used to measure time anyway。即使gettimeofday
的{{3}}也是如此。
请改用man page。或者,如果您可以使用花哨的C ++ 11功能:clock_gettime
答案 1 :(得分:0)
如果要真正进行基准测试,则需要查看正在使用的优化标志,已优化的东西,在后台运行的东西,超线程的上下文切换对您的影响等等。能否使用Celero或Hayai取决于您需要的精度。然后执行至少5次测试,并在测试中试用样本数量。
我发现,如果您正在进行基准测试并尝试定义基准测试,则std chrono不是最可靠的时钟。