用C ++(gettimeofday)测量时间,给出重复的结果

时间:2018-05-01 23:31:20

标签: c++ plot time benchmarking

我正在尝试在哈希表中插入多个项目,并以毫秒为单位测量插入时间。基本上,它的工作原理如下(此函数属于我的哈希表的类):

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;
}

问题是插入时间看起来像这样,显然显示出明显的时间进度,插入的项目越多: enter image description here

但现在,我注意到插入时间在相同值之间交替出现(大约为15.625的倍数),从而产生极不准确的结果: enter image description here

它刚刚开始发生,即使我的代码的旧版本我知道输出正确的时间。这是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;
}

2 个答案:

答案 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不是最可靠的时钟。