我有一个函数的两个实现,想看看哪个更快。分别命名为foo1()
和foo2()
。我有一组要针对它们的测试用例。测试用例存储在一个数组中,我不想包括花费在访问数组上的时间。这是我的代码。无法在duration += std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 )
上编译并显示错误消息error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'std::chrono::microseconds' {aka 'std::chrono::duration<long long int, std::ratio<1, 1000000> >'})
52 | std::cout << "duration: " << duration << std::endl;
。
代码:
/*[first argument, second argument, correct result]*/
inout[5][3] = {
{10), 4, 5},
{21, 4, 6},
{22, 4, 7},
{50, 5, 19},
{100, 5, 7},
//just example, real one is longer
};
std::chrono::microseconds duration = std::chrono::microseconds::zero();
for(auto& i : inout)
{
auto t1 = std::chrono::high_resolution_clock::now();
foo1()(i[0], i[1]);
auto t2 = std::chrono::high_resolution_clock::now();
duration += std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();//this won't compile
}
std::cout << "duration of foo1(): " << duration << std::endl;
duration = std::chrono::microseconds::zero();
for(auto& i : inout)
{
auto t1 = std::chrono::high_resolution_clock::now();
foo2()(i[0], i[1]);
auto t2 = std::chrono::high_resolution_clock::now();
duration += std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();//this won't compile
}
std::cout << "duration of foo2(): " << duration << std::endl;
这里有什么建议吗?我认为测试高速缓存未命中的速度更有意义,因此对foo1()
和foo2()
的调用是否应该交错? OTOH的目标是查看哪种速度更快,并且两者都将从高速缓存中受益,但是较大的高速缓存可能会丢失更多高速缓存。同样出于好奇,foreach循环中auto& i
的类型是什么?
如果我想您可以使用C库中的time.h来帮助您实现相同的目的。仅当您不想使用chrono类时。
这是我的建议。
#include <time.h>
#include <cstring>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
using namespace std;
void foo1(){
sleep(5);
}
int main(){
time_t StarTime, EndTime;
memset( &StarTime, 0x00, sizeof(StarTime));
memset( &EndTime, 0x00, sizeof(EndTime));
time(&StarTime);
foo1();
time(&EndTime);
double secs = difftime(EndTime, StarTime);
double mins =0.0;
if(secs >= 60){
mins = (secs/60);
printf("Total Time:%-10.5f MINS\n",mins);
}else{
printf("Total Time:%-10.5f SECS\n",secs);
}
return 0;
}
这是观察到的输出。
Total Time:5.00000 SECS
正如您在这里看到的,我得到了foo1()花费的时间来完成,您也可以为foo2()做到这一点,而不是可以将它们进行比较以进行基准测试。