Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中进行实验时,测量某些函数的cpu时间的最佳方法是什么+;? 我有一些C++代码,想测量各种函数的运行时间(CPU时间)。_C++_Performance - Fatal编程技术网

在C+中进行实验时,测量某些函数的cpu时间的最佳方法是什么+;? 我有一些C++代码,想测量各种函数的运行时间(CPU时间)。

在C+中进行实验时,测量某些函数的cpu时间的最佳方法是什么+;? 我有一些C++代码,想测量各种函数的运行时间(CPU时间)。,c++,performance,C++,Performance,我知道这个问题已经被问过很多次了,但是就像所有的问题一样(一个可以找到,另一个你可以得到各种各样的答案。一些使用时钟,一些使用gettimeofday,一些使用奇怪的函数,另一些使用外部库) 哪种方法提供了最好的精度和可靠性?我希望最多能达到纳秒 我在Ubuntu 14.04下工作 提前感谢您。您的问题太广泛了,无法给出一个答案来解决所有问题。根据您的要求,如果您想要一个跨平台的解决方案,那么std::chrono::high_resolution_clock可能适合您。如果您无法访问支持这一点

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

哪种方法提供了最好的精度和可靠性?我希望最多能达到纳秒

我在Ubuntu 14.04下工作


提前感谢您。

您的问题太广泛了,无法给出一个答案来解决所有问题。根据您的要求,如果您想要一个跨平台的解决方案,那么std::chrono::high_resolution_clock可能适合您。如果您无法访问支持这一点的C++11编译器或更好的编译器,那么各种好的“ol C库”时间就很有趣了操作可能就足够了。如果跨平台不是问题,并且您只对Windows感兴趣,那么根据您的解决方案需要,可以使用QueryPerFunanceCounter或GetTickCount


如果您有特定需求,请在问题中提及。

您的问题太广泛,无法给出一个答案来解决所有问题。根据您的要求,如果您需要跨平台解决方案,则std::chrono::high_resolution_clock可能适合您。如果您无法访问支持此功能的C++11或更好的编译器,请不要如果跨平台不是问题,并且您只对Windows感兴趣,那么根据您的分辨率需要,可以使用QueryPerFunanceCounter或GetTickCount


如果您有特殊需求,请在问题中提及。

您可以尝试谷歌的基准库:

您可以尝试谷歌的基准库:

TLDR:您可以非常好地了解毫秒分辨率的热点,但纳秒分辨率因各种原因不起作用

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

auto start = getBestPrecisionTime();
foo();
auto end = getBestPrecisionTime();
std::cout << "foo took " << to_nanoseconds(end - start) << "ns";
然后对其进行进一步优化,以

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

由于更好地利用了寄存器/SIMD指令/caching/…哪个更有效?但是,一旦度量了性能,您就禁用了此优化,并且度量了错误的版本。通过大量工作,您可能能够提取出
code\u中哪些汇编程序指令是\u foo\u bar
源于
foo()
,但由于您甚至无法准确地说出一条汇编指令需要多长时间,而且这一时间还取决于周围的汇编指令,因此您没有机会获得优化代码的准确数字


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

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

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

auto start = getBestPrecisionTime();
foo();
auto end = getBestPrecisionTime();
std::cout << "foo took " << to_nanoseconds(end - start) << "ns";
然后对其进行进一步优化,以

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

由于更好地利用了寄存器/SIMD指令/caching/…哪个更有效?但是,一旦度量了性能,您就禁用了此优化,并且度量了错误的版本。通过大量工作,您可能能够提取出
code\u中哪些汇编程序指令是\u foo\u bar
源于
foo()
,但由于您甚至无法准确地说出一条汇编指令需要多长时间,而且这一时间还取决于周围的汇编指令,因此您没有机会获得优化代码的准确数字


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

你能定义“最佳”吗你有什么标准?精度和可靠性。我希望最多能达到纳秒。为了进行分析,你需要可靠的高精度计数器,它排除了gettimeofday()或rdtsc。在Windows上,我使用QueryPerformanceCounter()但不确定你应该在其他平台上使用什么。我的意思是让你编辑这个问题,让它提到标准——从目前的情况看,它看起来是基于意见的。“哪种方法对我最合适,为什么?”我们到底应该怎么知道?!你能定义“最佳”吗你有什么标准?精度和可靠性。我希望最多能达到纳秒。为了进行分析,你需要可靠的高精度计数器,它排除了gettimeofday()或rdtsc。在Windows上,我使用QueryPerformanceCounter()但不确定你应该在其他平台上使用什么。我的意思是让你编辑这个问题,以便它提到标准——就目前而言,它看起来是基于意见的。“哪种方法最适合我,为什么?”我们到底该怎么知道?!+1指出,最难的不是时间测量,而是设计一个有用的微基准来实际测量你要测量的东西,而不是隐藏你要测量的东西的其他瓶颈。有一些优化的优秀指南,还有一个时间测量库。除了时间之外,性能计数器还可以帮助您找出瓶颈所在,并提出可能的更改建议。性能计数器可以以周期而不是秒为单位为您提供时间,因此变频不是问题(mem除外)+1要指出的是,困难的不是时间测量,而是设计一个有用的微基准来实际测量你要测量的东西,而不是隐藏你要测量的东西的其他瓶颈。有一些优化的优秀指南,还有一个时间测量库。不仅仅是时间,还有性能他可以吗
code_that_does_foo_bar;