时间没有计算

时间:2015-01-18 19:17:13

标签: c++ time benchmarking

我想看看哪个会更快,一个结构或一个元组,所以我写了一个小程序。但是,当它完成运行时,两者的记录时间均为0.000000。我很确定程序没有快速完成(因为我不在家,所以在线编译器上运行)

#include <iostream>
#include <time.h>
#include <tuple>
#include <cstdlib>
using namespace std;

struct Item
{
    int x;
    int y;
};

typedef tuple<int, int> dTuple;

int main() {

    printf("Let's see which is faster...\n");
    //Timers
    time_t startTime;
    time_t currentTimeTuple;
    time_t currentTimeItem;

    //Delta times
    double deltaTimeTuple;
    double deltaTimeItem;

    //Collections
    dTuple tupleArray[100000];
    struct Item itemArray[100000];

    //Seed random number
    srand(time(NULL));
    printf("Generating tuple array...\n");
    //Initialize an array of tuples with random ints
    for(int i = 0; i < 100000; ++i)
    {
        tupleArray[i] = dTuple(rand() % 1000,rand() % 1000);
    }

    printf("Generating Item array...\n");
    //Initialize an array of Items
    for(int i = 0; i < 100000; ++i)
    {
        itemArray[i].x = rand() % 1000;
        itemArray[i].y = rand() % 1000;
    }

    //Begin timer for tuple array
    time(&startTime);
    //Iterate through the array of tuples and print out each value, timing how long it takes
    for(int i = 0; i < 100000; ++i)
    {
        printf("%d: %d", get<0>(tupleArray[i]), get<1>(tupleArray[i]));
    }
    //Get the time it took to go through the tuple array
    time(&currentTimeTuple);
    deltaTimeTuple = difftime(startTime, currentTimeTuple);

    //Start the timer for the array of Items
    time(&startTime);
    //Iterate through the array of Items and print out each value, timing how long it takes
    for(int i = 0; i < 100000; ++i)
    {
        printf("%d: %d", itemArray[i].x, itemArray[i].y);
    }
    //Get the time it took to go through the item array
    time(&currentTimeItem);
    deltaTimeItem = difftime(startTime, currentTimeItem);
    printf("\n\n");
    printf("It took %f seconds to go through the tuple array\nIt took %f seconds to go through the struct Item array\n", deltaTimeTuple, deltaTimeItem);
    return 0;
}

根据www.cplusplus.com/reference/ctime/time/,difftime应该返回两个time_t之间的差异。

3 个答案:

答案 0 :(得分:2)

time()通常返回自UTC时间1970年1月1日00:00(即当前的unix时间戳)以来的秒数。因此,根据您的库实现,低于1秒的任何内容都可能显示为0.

您应该更喜欢使用<chrono>进行基准测试:

chrono::high_resolution_clock::time_point t;
t = high_resolution_clock::now();
// do something to benchmark 
chrono::high_resolution_clock::time_point t2 = chrono::high_resolution_clock::now();
cout <<"Exec in ms: "<< chrono::duration_cast<milliseconds>(t2 - t).count() <<endl;

然而,您必须考虑时钟分辨率。例如,对于Windows,它是15毫秒,所以如果你接近15毫秒,甚至更低,你应该增加迭代次数。

答案 1 :(得分:1)

我建议您在开始演奏时间之前检查汇编语言列表。

要检查的第一件事是汇编语言在访问tuple与访问您的结构之间存在显着差异。您可以通过计算不同指令的数量来粗略估计时序差异。

其次,我建议查看Tuple的定义。有些东西告诉我,这是一个与你的相似的结构。因此,我预测你的时间应该接近平等。

第三,您还应该比较std::pair,因为tuple中只有2个项目,std::pair有两个元素。同样,它应该与您的结构相同。

最后,请为数据中的“噪音”做好准备。噪声可能来自数据高速缓存未命中,使用数据高速缓存的其他程序,内核之间的代码委托以及任何I / O.您可以越接近在单核上运行程序,不受干扰,数据质量就越高。

答案 2 :(得分:0)

time_t是一个秒数,在快速,现代的计算机上进行100,000次微不足道的操作确实可以在不到一秒的时间内完成。