【发布时间】:2017-01-23 04:55:20
【问题描述】:
所以我有一个程序以两种不同的方式计算多项式:Honrer 方法和 Naive 方法。我试图分别查看它们的运行时间,但取决于我放置函数的顺序,它们的时间会发生变化。比如我把Horner方法放在第一位,耗时比较长。然后我先尝试了天真的方法,然后它需要更长的时间。 Horner 方法应该快得多,因为它只有一个循环,而朴素方法有一个嵌套循环。所以我认为这一定是我使用 chrono 库中的时钟的方式。我尝试了 high_resolution_clock 和 system_clock,但同样的事情发生了。欢迎任何帮助/cmets。
#include <cstdlib>
#include <iostream>
#include <chrono>
#include "Polynomial.h"
int main(int argc, char** argv) {
double c[5] = {5, 0, -3, 1, -8};
int degree = 4;
Polynomial obj(c, degree);
auto start = std::chrono::high_resolution_clock::now();
std::cout<<"Horner Evaluation: " << obj.hornerEval(-2)<<", ";
auto elapsed = std::chrono::high_resolution_clock::now() - start;
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed).count();
std::cout<< duration << " nanoseconds "<<std::endl;
auto start2 = std::chrono::high_resolution_clock::now();
std::cout<<"Naive Evaluation: " << obj.naiveEval(-2)<<", ";
auto elapsed2 = std::chrono::high_resolution_clock::now() - start2;
auto duration2 = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed2).count();
std::cout<< duration2 << " nanoseconds "<<std::endl;
}
【问题讨论】:
-
我宁愿怀疑
std::cout花费了大量时间。您不应在测量中包含 I/O 时间。 -
1) 确保您启用了优化。 2) 运行每个基准测试几千次。 3) 确保你的基准测试中没有包含标准输出时间。
-
我相信它做到了......在取出 i/o 后,它们都运行得更快。谢谢。
-
还有我通常使用
std::chrono::steady_clock -
计算机非常非常非常非常非常复杂。看来你忘了把它考虑进去!我们不再开发带有打孔卡的机械机器了。