如何添加在循环内执行功能所需的时间?

问题描述 投票:0回答:1

我有一个函数的两个实现,想看看哪个更快。分别命名为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++ benchmarking chrono
1个回答
0
投票

如果我想您可以使用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()做到这一点,而不是可以将它们进行比较以进行基准测试。

© www.soinside.com 2019 - 2024. All rights reserved.