如何测试两种算法并确定哪种算法更快
How can I test two algorithms and determine which is faster?
每当解决特定问题时,我可能会遇到不同的解决方案。我不确定如何选择两个选项中的更好。第一个想法是计算两种解决方案的复杂性,但有时它们可能具有相同的复杂性,或者可能有所不同,但输入范围很小,恒定因素很重要。
第二个想法是基准两个解决方案。但是,我不确定如何使用C 计时它们。我发现了这个问题:如何计算C 中代码段的执行时间,但我不知道如何正确处理编译器优化或处理器不一致。
简而言之:上述问题中提供的代码是否足以用于日常测试?在进行测试之前,我是否应该在编译器中启用一些选项?(我正在使用Visual C (我应该进行多少个测试,两个基准之间有多少时间差异?
这是我要测试的代码的示例。其中哪一个更快?我如何计算自己?
unsigned long long fiborecursion(int rank){
if (rank == 0) return 1;
else if (rank < 0) return 0;
return fiborecursion(rank-1) + fiborecursion(rank-2);
}
double sq5 = sqrt(5);
unsigned long long fiboconstant(int rank){
return pow((1 + sq5) / 2, rank + 1) / sq5 + 0.5;
}
使用此答案中的时钟
#include <iostream>
#include <chrono>
class Timer
{
public:
Timer() : beg_(clock_::now()) {}
void reset() { beg_ = clock_::now(); }
double elapsed() const {
return std::chrono::duration_cast<second_>
(clock_::now() - beg_).count(); }
private:
typedef std::chrono::high_resolution_clock clock_;
typedef std::chrono::duration<double, std::ratio<1> > second_;
std::chrono::time_point<clock_> beg_;
};
您可以编写一个程序来计时两个功能。
int main() {
const int N = 10000;
Timer tmr;
tmr.reset();
for (int i = 0; i < N; i++) {
auto value = fiborecursion(i%50);
}
double time1 = tmr.elapsed();
tmr.reset();
for (int i = 0; i < N; i++) {
auto value = fiboconstant(i%50);
}
double time2 = tmr.elapsed();
std::cout << "Recursion"
<< "ntTotal: " << time1
<< "ntAvg: " << time1 / N
<< "n"
<< "nConstant"
<< "ntTotal: " << time2
<< "ntAvg: " << time2 / N
<< "n";
}
我将尝试没有编译器优化(-O0
(和最大编译器优化(-O3
(的编译,只是为了查看差异。在最大优化时,编译器可能会完全消除循环。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 如何测试两种算法并确定哪种算法更快
- 寻找一种单一的定时方法来测试各种算法,不包括它们的输入
- 素测试算法无法正常工作
- 基准测试:获取算法用户时间
- 采用测试和变异函数的STL算法
- 不同的std::random_shuffle算法导致iOS模拟器单元测试失败
- 我需要一个测试案例来证明我的算法/代码错误
- 基准测试我的跟踪算法的框架
- 如何测试加密算法
- 允许测试AI算法的游戏
- 如何对矩形填充算法进行单元测试
- 用于测试路径查找算法的可能数据集
- 在我的简单测试中,Java在递归算法速度比较上胜过c++
- 哈希算法的测试过程是什么?