c++ - 如何比较两种算法,哪一种是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
解决方案
要么您没有打开优化,要么您发布的代码与您的真实代码不同。
在您的代码中,您没有使用算法的结果,因此一旦您打开优化,编译器就不会为调用您的算法发出代码(假设调用本身没有可观察到的副作用)。基准测试并非微不足道,因为您必须确保编译器不会同时优化太多或太少,因为无论哪种方式都会得到毫无意义的结果。例如,查看调试构建的运行时是没有意义的。
为确保编译不能删除对算法的调用,您应该使用其结果:
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/
推荐阅读
- metadata - 有没有办法强制更新 Opensea 上的元数据?
- sql - 使用 Oracle SQL Developer 在查询中指定数据库
- php - Laravel 政策问题,显示页面找不到 403
- android - 小部件在哪里声明自己?
- ggpubr - 我添加到 R ggplot 的 P 值和显着性水平放置不正确
- optaplanner - 根据问题输入有条件地运行 Optaplanner 阶段
- angular - 如何使组合框可编辑?
- google-api - Google Search Console API 按月分组 CURL
- python - 在 TensorFlow 2.5 环境中安装 keras_tuner
- reactjs - 当我单击 reactjs 中基于路由的组件内的按钮时,如何更改 antd 布局中的页脚值