【发布时间】:2014-07-04 09:11:40
【问题描述】:
我注意到计算经过时间的 C 风格比使用 C++11 更快。如果执行需要更多时间,则差异会越来越小。
#include <iostream>
#include <chrono>
#include <ctime>
long fibonacci(int n)
{
if (n < 3) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
int main()
{
/* C++11-Style */
std::chrono::time_point<std::chrono::system_clock> start, end;
/* C-Style */
clock_t c_start, c_end;
double c_elapsed;
/* Start */
start = std::chrono::system_clock::now();
c_start = clock();
std::cout << "f(30) = " << fibonacci(30) << '\n';
/* End */
c_end = clock();
end = std::chrono::system_clock::now();
/* Compute Elasped time */
c_elapsed = ((double)(c_end-c_start))/CLOCKS_PER_SEC;
std::chrono::duration<double> elapsed_seconds = end-start;
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< " elapsed time: " << elapsed_seconds.count() << "s\n";
std::cout << "c_elapsed time: " << c_elapsed << "s" << std::endl;
}
结果是
f(30) = 832040
finished computation at Fri Jul 4 05:03:10 2014
elapsed time: 0.00417783s (C++11)
c_elapsed time: 0.003686s (C)
为什么会这样?
【问题讨论】:
-
您的
chrono点也考虑到第二个clock呼叫。 -
您应该使用更重的工作负载以避免不准确和开销,检查当您缩放斐波那契 argumanet 时比率是否保持这种方式
-
当您启动基于
chrono的时钟时,您将包括调用c-style时钟的费用。您稍后启动 c 风格的时钟并尽快停止它。您应该将您的函数拆分为 2 个函数,每个函数仅使用其中一种方法,否则执行完全相同的工作量。 -
@CroCo:我没有否决这个问题,但人们可能认为这个问题有点愚蠢/明显。事实上,这些人中的大多数人可能无法说出机器人和我在下面的答案中发现的所有问题,所以我认为在这种情况下你可以放心地忽略反对者。但是,如果您确实进行了一些研究并学会了如何制定适当的基准,那也不会受到伤害:这种懒惰在这里是不受欢迎的。
-
@CroCo:我对你投了反对票,因为坦率地说,这距离“获得 CS 学位”还有一千英里。这不仅仅是基本的。您遇到的问题与 C++11 似乎较慢这一事实无关,而与您没有关于如何构建远程公平基准的第一条线索这一事实有关。这不是我们可以在 SO 答案中解决的问题,因此您的问题非常不适合本网站。
标签: c++ c performance c++11 time