c++ - 相同间隔上的连续时钟()操作具有增量消耗。为什么?
问题描述
在 time.h 中使用 clock() 函数时,我注意到一些我无法解释的行为。在下面的代码中,我使用相同的 for 循环来消耗处理时间。我看不出有什么合乎逻辑的原因为什么一个总是比另一个花费更长的时间,但根据我在 clock() 函数中看到的情况,似乎每次迭代需要大约 7 - 10% 的时间。这背后的原因是什么?
我添加了输出的典型表示。编译后的 ASM 有超过 1300 行代码。我不认为张贴会有建设性,但是如果您需要查看它,我可以通过电子邮件将其发送给您。
输出:
a: 3835
b: 4155
Percentage increase in execution time: 8%
c: 4423
Percentage increase in execution time: 15%
d: 4699
Percentage increase in execution time: 22%
e: 4976
Percentage increase in execution time: 29%
资源:
#include <ctime>
#include <iostream>
int main()
{
clock_t a, b, c, d, e;
unsigned int aResult, bResult, cResult, dResult, eResult;
a = clock();
for(int i = 0; i < 100000; i++);
aResult = a;
std::cout << "a: " << aResult << std::endl;
b = clock();
bResult = b;
for(int i = 0; i < 100000; i++);
std::cout << "b: " << bResult << std::endl;
std::cout << "Percentage increase in execution time: "
<< 100 * (bResult - aResult)/aResult << "%" <<std::endl;
c = clock();
for(int i = 0; i < 100000; i++);
cResult = c;
std::cout << "c: " << cResult << std::endl;
std::cout << "Percentage increase in execution time: "
<< 100 * (cResult - aResult)/aResult << "%" <<std::endl;
d = clock();
for(int i = 0; i < 100000; i++);
dResult = d;
std::cout << "d: " << dResult << std::endl;
std::cout << "Percentage increase in execution time: "
<< 100 * (dResult - aResult)/aResult << "%" <<std::endl;
e = clock();
for(int i = 0; i < 100000; i++);
eResult = e;
std::cout << "e: " << eResult << std::endl;
std::cout << "Percentage increase in execution time: "
<< 100 * (eResult - aResult)/aResult << "%" <<std::endl;
}
解决方案
您遇到的问题是您打印的统计数据不正确。(bResult - aResult)/aResult
等等并没有告诉你时间间隔增加的百分比,因为 aResult 是自程序启动以来的时间 - 而不仅仅是 for 循环的时间。此外(dResult - aResult)/aResult
,当您需要将其与以前的结果进行比较时,其他人总是将您的最新结果与第一个结果进行比较。
如果你改变你的表达形式((eResult - dResult) - (bResult - aResult))/(bResult - aResult)
,你应该得到一个更一致的答案。也就是说,在每次迭代中,您需要将最近的间隔(eResult - dResult)
与第一个间隔进行比较,(bResult - aResult)
而不是第一次。
推荐阅读
- python - 如何使用 Repl.it 中的调试工具?
- python - unity ml 代理 python api 的奇怪结果
- javascript - 获取此 AppBar 的 ScrollPosition
- javascript - 控制没有从承诺中返回
- awk - 如何在使用 AWK 在生成的空字段上打印给定值时合并两个文件?
- flutter - Flutter -> 异常:类型“int”不是“String”类型的子类型
- r - 如果满足某些条件,则将数据框 1 中的值选择到新数据框
- uri - 如何为具有新版本的分类设置 URI
- r - 如何将 Unicode 代码点读入 R 数据帧
- sql-server - Linux 容器上的 Microsoft SQL Server