gpt4 book ai didi

c++ - 在 C++ 中进行实验时,测量某些函数的 cpu 时间的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 01:46:32 35 4
gpt4 key购买 nike

我有一些 C++ 代码,想测量各种函数的运行时间(cpu 时间)。

我知道这个问题已经被问过很多次了,但是在所有问题中(一个可以找到 here ,另一个 here ) 你会得到各种各样的答案。有些使用时钟,有些使用 gettimeofday,有些使用奇怪的函数,其他外部库。

哪种方法的精度和可靠性最高?我希望最多能够达到纳秒级?

我在 Ubuntu 14.04 下工作。

提前谢谢你。

最佳答案

TLDR:您可以很好地了解具有毫秒分辨率的热点,但由于各种原因,纳秒级分辨率不起作用。

您可能会找到或编写一些函数来为您提供计算机可以提供的最佳分辨率,但是,这仍然不会给您任何有意义的结果:

auto start = getBestPrecisionTime();
foo();
auto end = getBestPrecisionTime();
std::cout << "foo took " << to_nanoseconds(end - start) << "ns";

第一个问题是 foo() 被另一个程序打断了,你实际上测量的不是 foo() 而是 foo() + some_random_service。解决这个问题的一种方法是进行 1000 次测量,希望至少其中一次没有被打断,然后进行这些测量中的最小值。根据 foo() 实际占用多长时间,您的机会从总是到永远不等。

类似地,foo() 可能会访问位于 1/2/3/4 级缓存、RAM 或硬盘驱动器中某处的内存,因此您再次测量了错误的东西。您需要获取真实世界的数据,了解 foo() 需要的内存在哪个内存中以及具有哪些访问时间的可能性。

另一个主要问题是优化。测量调试版本的性能没有多大意义,因此您需要在启用最大优化的情况下进行测量。具有高优化级别的编译器将重新排序和内联代码。 getBestPrecisionTime 函数有两个选项:是否允许编译器将代码移过它。如果它允许重新排序,编译器将这样做:

foo();
auto start = getBestPrecisionTime();
auto end = getBestPrecisionTime();
std::cout << "foo took " << to_nanoseconds(end - start) << "ns";

然后进一步优化

std::cout << "foo took 0ns";

显然这会产生错误的结果,而且我遇到的所有计时函数都增加了不允许这样做的障碍。

但替代方案也好不了多少。如果没有测量,编译器可能会对此进行优化

foo();
bar();

进入

code_that_does_foo_bar;

由于更好​​地利用了寄存器/SIMD 指令/缓存/...,效率更高。但是一旦您测量了性能,您就禁用了此优化并且测量了错误的版本。通过大量的工作,您可能能够提取 code_that_does_foo_bar 中的哪些汇编程序指令源自 foo(),但由于您甚至无法准确判断一条汇编程序指令的长度花费的时间还取决于周围的汇编程序指令,您没有机会获得优化代码的准确数字。

你能做的最好的就是使用 std::chrono::high_resolution_clock 因为它不会变得更精确。

关于c++ - 在 C++ 中进行实验时,测量某些函数的 cpu 时间的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33039503/

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