在进行性能分析时,我们知道“自我时间”表示忽略所调用函数的方法花费的时间,而“总时间”表示该方法调用其子函数的总时间。
我有一个简单的函数,我只在数组上进行计算而不调用其他任何函数。但是在分析时,自身和总数的时间对于函数本身以及函数上的每一行都是完全不同的。以下是Zoom Profiler的示例分析行,使用32个线程运行。
for循环中的行的时间
Total Self Code
29.4 sec 16.9 sec id=*(pid);
令我感到困惑的是,基于第一段,它应该意味着如果一行代码不调用任何方法,则自行时间和花费的总时间应该相同。 关于发生了什么的任何想法?
答案 0 :(得分:3)
我不会为此担心太多。
分析师显示的统计数据,即使是优秀的个人资料,也必须采取一系列的盐和#34; 这些统计数据暗示的是,在包含该行代码的某些堆栈样本中,它不是堆栈中的最后一行代码,并且很难相信。 更容易相信剖析器是错误的。 如今,随着处理器的管道向前发展,可能会让人感到困惑。
在任何情况下,如果您要分析的原因是为了找到加速,那么很难看到如何加速该特定代码行。 你正在寻找你可以加速的东西,而不是你无法的东西。
顺便说一句,我建议不要看秒或毫秒或任何绝对时间测量,而是看分数时间 - 时间除以总和。 实际加速往往占较大的数额,从5%到99%。 此外,不要打扰自包含时间的时间包括它,如果程序具有任何大的重量,那么堆栈样本会变深,堆栈样本上的非终端行(即函数调用)是丰富的狩猎场加速。 最后,测量精度不是必需的,因此不需要大量的样品。这就是为什么很多人使用this technique。
编辑:FWIW,这就是我的意思。这是5个随机时间堆栈样本:---------------------------
... some calls above
... exp(4.02) ...
... some calls below
---------------------------
... some calls above
... exp(0.35) ...
... some calls below
---------------------------
... some calls above
... push_back(...) ...
...
... new ...
...
---------------------------
...
... myArray[...]
...
---------------------------
... some calls above
... exp(0.35) ...
... some calls below
---------------------------
其中三个人在堆栈,代码或可编辑的代码中调用了exp
,很可能是从代码中的不同位置调用的。
这意味着您花费大约60%的时间来调用exp
。
你不能加快这个功能,但你可以减少它吗?
现在注意第二个和第五个样本使用相同的数字参数调用exp
。
(这不是探查者可以告诉你的事情。)
那是什么意思?
这意味着大约40%的时间是在exp
调用重复参数,
您可以通过记住先前的值或通过记忆exp
来避免这种情况。
如果你采取样本直到你看到一些你可以做某些事情的模式,并且你看到它两次或更多次,你就获得了健康的加速。 到达那一点所需的样本越少,加速越大。 然后你可以重复整个过程,直到你不能再做了。 这是获得速度难以击败的可靠方法。