【发布时间】:2022-01-20 04:35:52
【问题描述】:
我制作了一个需要尽快循环的因式分解程序。但是,我也想用最少的代码跟踪进度。为此,我通过比较time_t start - time_t end 和递增值marker 每秒显示i 的当前值。
using namespace std; // cause I'm a noob
// logic stuff
int divisor = 0, marker = 0;
int limit = sqrt(num);
for (int i = 1; i <= limit; i++) // odd number = odd factors
{
if (num % i == 0)
{
cout << "\x1b[2K" << "\x1b[1F" << "\x1b[1E"; // clear, up, down
if (i != 1)
cout << "\n";
divisor = num / i;
cout << i << "," << divisor << "\n";
}
end = time(&end); // PROBLEM HERE
if ((end - start) > marker)
{
cout << "\x1b[2K" << "\x1b[1F" << "\x1b[1E"; // clear, up, down
cout << "\t\t\t\t" << i;
marker++;
}
}
当然,实际代码更加优化并使用boost::multiprecision,但我认为这不是问题所在。当我删除 end = time(&end) 行时,我看到性能提升至少 10%。我只是想知道,如何在不无条件地在每个循环中调用函数的情况下跟踪时间(或至少近似秒数)?还是有更快的功能?
【问题讨论】:
-
您必须删除所有
cout,因为打印总是消耗太多资源。然后,要测量您的功能或算法,最好的方法是使用一些基准工具。你自己不能轻易做到这一点,因为这真的是一项艰苦的工作,这不是你想的那样。有一个在线工具:quick-bench.com -
@Yves 如果这是关于精确的基准测试,我完全同意你的看法。我认为这是关于可视化的 - 我的回答是基于这个假设。