gpt4 book ai didi

c++ - 全局时间成本与本地时间成本总和—— "for"循环

转载 作者:行者123 更新时间:2023-11-28 04:06:58 25 4
gpt4 key购买 nike

虽然看起来很愚蠢,但我想知道在尝试协调 for 循环的时间成本时是否存在陷阱,如测量的那样

  • for 循环之外的时间点开始(全局外部 时间成本)
  • 或者,从循环内的时间点开始,并被累积考虑(本地内部时间成本)?

下面的例子说明了我在获得两个相等的测量值时遇到的困难:

#include <iostream>
#include <vector> // std::vector
#include <ctime> // clock(), ..

int main(){
clock_t clockStartLoop;
double timeInternal(0)// the time cost of the loop, summing all time costs of commands within the "for" loop
, timeExternal // time cost of the loop, as measured outside the boundaries of "for" loop
;
std::vector<int> vecInt; // will be [0,1,..,10000] after the loop below
clock_t costExternal(clock());
for(int i=0;i<10000;i++){
clockStartLoop = clock();
vecInt.push_back(i);
timeInternal += clock() - clockStartLoop; // incrementing internal time cost
}
timeInternal /= CLOCKS_PER_SEC;
timeExternal = (clock() - costExternal)/(double)CLOCKS_PER_SEC;

std::cout << "timeExternal = "<< timeExternal << " s ";
std::cout << "vs timeInternal = " << timeInternal << std::endl;
std::cout << "We have a ratio of " << timeExternal/timeInternal << " between the two.." << std::endl;
}

我通常会得到大约 2 的比率作为输出,例如

timeExternal = 0.008407 s vs timeInternal = 0.004287 We have a ratio of 1.96105 between the two..

,而我希望比率接近 1。

  • 是否只是因为循环中存在内部操作,这些操作不是由 clock() 差异测量的(例如递增 timeInternal)?
  • 能否在for(..)中的i++操作在外部测量中是不可忽略的,并能解释与内部测量的区别?

我实际上正在处理一个更复杂的代码,我想将时间成本隔离在一个循环中,确保我考虑的所有时间片确实构成了一个完整的饼图(直到现在我才实现......) .非常感谢

最佳答案

timeExternal = 0.008407 s vs timeInternal = 0.004287 We have a ratio of 1.96105 between the two..

比率约为 2 是可以预期的 - 到目前为止,循环中最重的调用是 clock() 本身(在大多数系统上 clock() 是一个系统调用到内核​​)。

假设 clock() 实现类似于以下伪代码:

clock_t clock() {
go_to_kernel(); // very long operation
clock_t rc = query_process_clock();
return_from_kernel(); // very long operation
return rc;
}

现在回到循环,我们可以注释时间花费的地方:

  for(int i=0;i<10000;i++){
// go_to_kernel - very long operation
clockStartLoop = clock();
// return_from_kernel - very long operation
vecInt.push_back(i);
// go_to_kernel - very long operation
timeInternal += clock() - clockStartLoop;
// return_from_kernel - very long operation
}

所以在对 clock() 的两次调用之间,我们有 2 个长操作,循环中的总数为 4。因此比率为 2 比 1。

  • Is it just because there are operations internal to the loop which are not measured by the clock() difference (such as incrementing timeInternal) ?

不,递增 timeInterval 可以忽略不计。

  • Could the i++ operation in the for(..) be non-negligible in the external measurement and also explain the difference with the internal one ?

不,i++ 也可以忽略不计。移除对 clock() 的内部调用,您将看到更快的执行时间。在我的系统上它是 0.00003 秒。

clock() 之后下一个最昂贵的操作是 vector::push_back(),因为它需要调整 vector 的大小。这是由二次增长因子摊销的,可以通过在进入循环之前调用 vector::reserve() 完全消除。

结论:进行基准测试时,请确保为整个循环计时,而不是为单个迭代计时。更好的是,使用像 Google Benchmark 这样的框架,这将有助于避免许多其他陷阱(如编译器优化)。还有 quick-bench.com适用于简单情况(基于 Google Benchmark)。

关于c++ - 全局时间成本与本地时间成本总和—— "for"循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com