首页 > 解决方案 > 如何比较两种算法,哪一种是c ++中最快的

问题描述

我想知道我的哪一种算法是最快的,所以我使用了下面的代码,我注意到不使用我的算法时间是不同的,我如何使用小代码比较两种算法哪一种是最快的像这样?

#include <iostream>
#include <ctime>
using namespace std;

int main ()
{
clock_t start;
double duration;

for(int i=0;i<10;i++)
{
  start=clock();
  for(int j=0;j<10000;j++)
  for(int k=0;k<100000;k++);//my alghorithm here
  cout<<"duration"<<i+1<<" = "<<(clock()-start)/(double) CLOCKS_PER_SEC<<endl;
}

}

output1 (5.5464s (66.36%) 在 duration7 和 duration5 之间)

duration1 = 7.52511
duration2 = 8.06115
duration3 = 7.73809
duration4 = 7.16957
duration5 = 8.3575
duration6 = 4.08989
duration7 = 2.811
duration8 = 3.77779
duration9 = 5.37379
duration10 = 7.94059

output2 使用寄存器变量

duration1 = 1.37294
duration2 = 1.12329
duration3 = 1.26464
duration4 = 1.37525
duration5 = 1.22267
duration6 = 1.43837
duration7 = 1.49671
duration8 = 1.20099
duration9 = 0.813221
duration10 = 1.16527

标签: c++

解决方案


要么您没有打开优化,要么您发布的代码与您的真实代码不同。

在您的代码中,您没有使用算法的结果,因此一旦您打开优化,编译器就不会为调用您的算法发出代码(假设调用本身没有可观察到的副作用)。基准测试并非微不足道,因为您必须确保编译器不会同时优化太多或太少,因为无论哪种方式都会得到毫无意义的结果。例如,查看调试构建的运行时是没有意义的。

为确保编译不能删除对算法的调用,您应该使用其结果:

int main ()
{
  clock_t start;
  double duration;
  int sum = 0;
  for(int i=0;i<10;i++)
  {
    start=clock();      
    for(int j=0;j<10000;j++) {
       for(int k=0;k<100000;k++) {
          sum += my_alogrithm();
       }
    }
    cout<<"duration"<<i+1<<" = "<<(clock()-start)/(double) CLOCKS_PER_SEC<<endl;
    return sum; // <-- !!
  }
}

因为有一些陷阱,我建议使用一些库,或者这个工具:http: //quick-bench.com/


推荐阅读