C++ 函数调用性能

C++ 函数调用性能,c++,c,C++,C,我用不同的参数连续调用了几次snprintf。我花了每个snprintf所需的时间。我发现第一次调用snprintf花费的时间最长。此后,调用同一函数所需的时间会减少,直到收敛为止。原因是什么?我尝试过其他功能,也表现出同样的行为 我这样问是因为它与测试代码性能有关。通常在主程序中,只会定期调用它。然而,当我像在循环中一样单独测试函数时,它会更快,因此,导致性能度量的不准确 第一个调用需要4000++纳秒,第二个调用需要1700纳秒,第三个调用需要800纳秒,直到大约10个++调用,它减少到13

我用不同的参数连续调用了几次
snprintf
。我花了每个
snprintf
所需的时间。我发现第一次调用
snprintf
花费的时间最长。此后,调用同一函数所需的时间会减少,直到收敛为止。原因是什么?我尝试过其他功能,也表现出同样的行为

我这样问是因为它与测试代码性能有关。通常在主程序中,只会定期调用它。然而,当我像在循环中一样单独测试函数时,它会更快,因此,导致性能度量的不准确

第一个调用需要4000++纳秒,第二个调用需要1700纳秒,第三个调用需要800纳秒,直到大约10个++调用,它减少到130纳秒

snprintf(buffer, 32, "%d", randomGeneratedNumber1);
snprintf(buffer, 32, "%d", randomGeneratedNumber2);
   .
   .
   .

最可能的解释是,这两个函数代码在第二次循环后都会出现在指令缓存中,就像输入数据(如果有)出现在数据缓存中一样。此外,一些分支可以在第二次时正确预测


因此,总而言之,“东西已被缓存”。

您的程序可能会动态链接到包含
snprintf()
的库。第一次延迟将是加载库所需的时间。

搜索TLB和缓存。但对于很小的答案,在这些小代码中,缓存会影响执行时间。对于大型代码,除了缓存之外,许多内存页将被调出,并在以后使用时从硬盘调入ram。因此,当您经常使用代码的一部分时,它不会被替换掉,因此它的执行时间得到了提高

是否在每次调用之前重置计时器?如果在循环中调用,则可能会发生编译器优化。第一次和第二次的持续时间有什么不同?从这个问题中可以得到一个教训,正确的基准测试是一门黑暗而微妙的艺术。谢谢你的回答。我在主要问题中添加了代码执行所需的时间。这是许多基准测试过程要求加载并运行基准测试一段时间,然后才能假定其结果有任何意义的原因之一。例如,除了缓存之外,您可能还在等待将包含
snprintf()
的页面分页到进程工作集。库可能已经加载。剩下要做的就是解析
snprintf
符号并确定其地址(在GOT上的ELF系统上)。