我想看看哪个会更快,一个结构或一个元组,所以我写了一个小程序。但是,当它完成运行时,两者的记录时间均为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(¤tTimeTuple);
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(¤tTimeItem);
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之间的差异。
答案 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次微不足道的操作确实可以在不到一秒的时间内完成。