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++ 如何独立测量所用机器的性能_C++_Performance_Profiler - Fatal编程技术网

C++ 如何独立测量所用机器的性能

C++ 如何独立测量所用机器的性能,c++,performance,profiler,C++,Performance,Profiler,我有一套表演得很好的套路。然而,我不得不改变它。这一变化提高了例行程序的精度,但损害了性能 这个例行程序需要大量的数学计算,可能是CPU绑定(我仍然需要对此进行更严格的测试,但我有99%的把握)。它是用C++编写的(编译器是Borland C++ 6)。 我现在想测量例程的性能,首先我想测量执行时间,但我认为这是一种有缺陷的方法,因为可能会有更多的事情发生 我当时遇到了这个话题:。我喜欢通过MFLOP测量的想法 我的老板建议尝试使用某种cpu时钟周期测量方法,因此测试将与机器无关,但是,我认为这

我有一套表演得很好的套路。然而,我不得不改变它。这一变化提高了例行程序的精度,但损害了性能

这个例行程序需要大量的数学计算,可能是CPU绑定(我仍然需要对此进行更严格的测试,但我有99%的把握)。它是用C++编写的(编译器是Borland C++ 6)。 我现在想测量例程的性能,首先我想测量执行时间,但我认为这是一种有缺陷的方法,因为可能会有更多的事情发生

我当时遇到了这个话题:。我喜欢通过MFLOP测量的想法

我的老板建议尝试使用某种cpu时钟周期测量方法,因此测试将与机器无关,但是,我认为这种方法属于MFlops测试

在我看来,衡量这两个方面(执行时间和MFLOP)是一条可行之路,但我想听听stackoverflow专家的看法


如何衡量被称为CPU绑定的例程的性能?

我同意你的老板的看法-以CPU时钟周期为衡量标准。请注意,可能还有其他事情正在发生,例如大量缓存未命中,这会减慢代码的速度。如果可以,请使用VTune或Intel提供的免费工具来查明瓶颈的性质。

如果应用程序内存有限,CPU时钟周期也没有多大意义。在更快的CPU上,您只需花费更多的CPU周期来等待相同的缓存未命中。(数学应用程序可能不受I/O限制)

另一个问题是,特定指令序列的时钟周期数在不同的体系结构中仍然会有所不同(甚至包括Intel Core1/Core2)。因此,作为性能的绝对衡量标准,一个CPU上的时钟周期几乎不是一种改进


我认为,作为衡量标准,它们实际上更糟糕。与时间不同,用户不关心周期。这对于现代多核CPU尤其重要。使用两倍循环数和3个核的“低效”算法将在67%的时间内完成。用户可能会喜欢这样。

你的问题意味着软件已经尽可能快了,除了精度问题。我发现这种情况并不常见,我假设你真正想要的是让它变得那么快

我想说的是,测量没有抓住重点

你真正需要做的是找到那些语句或指令(不是函数)1)它们占了挂钟时间的很大一部分,2)你可以找到优化的方法

假设软件的规模不小,它可能至少有几层函数调用,并且其中一些函数调用(不是函数,函数调用)很可能会占用大量的时间,并且可以进行优化


是一种很好的定位它们的方法,也是它使用的一个例子。

测量执行时间是一种方法

在这种情况下,我认为您希望最小化您正在测量的内容,以减少变量的数量

接下来,最好运行某种类型的基线来校准特定机器。要么使用最后一个签入版本,要么使用某种与您试图度量的计算类型大致匹配的密集例程。然后您可以将基准表示为

relative_time = measured_time_for_routine / measured_time_for_baseline

如今,CPU时钟周期与机器无关,即使使用相同指令集的CPU也是如此。x86(或其他)机器代码将以各种不同的方式被分割。这意味着什么的日子早已一去不复返了(而且,回到CPU周期意味着什么的时候,有太多不同的CPU类型在使用,以至于它依赖于机器)

更不用说CPU限制不像以前那么清晰了,这是由于缓存未命中和其他原因造成的。过去,CPU绑定的进程是仅受I/O等限制的进程,因为内存访问需要一定数量的CPU周期


你想要衡量的是性能,我认为这意味着它的运行速度有多快。在这种情况下,您最好测量挂钟时间,重复计算足够多的时间,以获得显著的结果。您可以创建一个可以在不同实现中运行的测试线束,以便获得可比的结果。

您可以从CPU硬件计数器的角度来衡量,“VTune英特尔配置文件”在这方面非常出色。 它将显示基于CPU计数器的详细信息(失效指令、缓存未命中、分支预测失误),它还将把这些信息与函数中的每个语句关联起来,这样您就可以很好地了解花费最多的是什么

这是假设您的函数没有内存限制


谢谢

“更改提高了例程的性能,但损害了性能。”这意味着什么?@samoz Ops,这里的一种类型,感谢您注意到CPU时钟周期不一定有意义。是的,大卫-这就是我所说的其他事情,如缓存未命中!与任何度量一样,单个度量很少有意义,需要放在上下文中考虑。我知道,如果我逆势而行,说捕获昂贵的指令比度量函数的成本更有效,即使是使用调用图,我也会投下反对票。