关于MT5代码分析器 - 页 3

 

继续。


哪条线(1、2或3)仍然是资源密集型?

我不明白,占整个程序55%时间的 "重头戏 "iTime,怎么只显示0.81%的自我CPU?
反之亦然--为什么开头的括号(1)和最简单的条件(2,极少为真)会显示33.84%的自家CPU?

为什么自身CPU和总CPU不匹配?


这个函数确实很重,但它所有的重物都位于代码的更下方。而分析器建议寻找iTime和两个布尔变量的替代物?

我显然不明白什么。

 
Andrey Khatimlianskii:

我显然错过了什么。

也许是滑倒了?

 
Andrei Trukhanovich:

也许是滑倒了?

看起来不像是,报告中的数字是一样的。

 
Andrey Khatimlianskii:

伊利亚斯,也帮我搞清楚这个问题。

1.为什么一个空函数调用可能会占用34.5%的Self CPU?同时,它后面的函数的调用,其内部占用了总CPU的38.16%,却根本没有显示在报告中?


功能代码。



2.这个例子显示了第二个问题:带有TimeCurrent()的一行不仅在函数中,而且在整个程序中都花费了不合理的时间。

在我注释掉CheckTimeSeries()的主体之前,主要的负荷是在它的TimeCurrent()行。

它真的有这么重的功能吗?用什么来代替它?或者如何使其经济化(在程序执行的一个循环内进行缓存)?

只要有可能,我就会通过稀释它们来节省计算量(每栏一次,每X秒一次,每Y毫秒一次,等等)。但事实证明,检查本身,无论是做计算,都是相当耗费资源的。


谢谢你的帮助。

1)没有代码,很难说为什么这些统计数据如此糟糕,也许是由于优化的原因

2)为什么不尝试在循环之前在Timer函数中获取时间,并将其作为参数进一步传递,在循环中至少调用这个函数2*N次的意义何在?

 
Andrey Khatimlianskii:

作为一个后续行动。


哪条线(1、2或3)仍然是资源密集型?

我不明白,占整个程序55%时间的 "重头戏 "iTime,怎么只显示0.81%的自我CPU?
反之亦然--为什么开头的括号(1)和最简单的条件(2,极少为真)会显示33.84%的自家CPU?

为什么自身CPU和总CPU不匹配?


这个函数确实很重,但它所有的重物都位于代码的更下方。而分析器建议寻找iTime和两个布尔变量的替代物?

我显然不明白什么。

1)我将假设函数已经被内联

2)计数器确实不相关,SelfCPU是函数代码的负载,没有考虑到被调用的函数,在给出的代码中,它是一个IF开启器(分支)。

3) TotalCPU计数器显示执行分支的负载,对于程序的这个分支中的所有调用都是如此。

 

不应该总是100%吗?或甚至略少,同时考虑到@global_initializations和@global_deinitializations。

这里是超过102%......(根据历史数据建立3003)。

 
Ilyas :

1)我将假设函数已经被内联

2)计数器确实没有关系,SelfCPU是函数代码上的负载,没有考虑到被调用的函数,在上面的代码中,它是一个IF开路器(分支)。

3)TotalCPU计数器显示一个执行分支的负载,为程序的这个分支中的所有调用。

它有什么用?很明显,IF语句本身的CPU负载很低。它不应该包括函数调用吗?

在任何情况下。如何理解(来自安德鲁的例子)。

if(!simulated) taking 3.86% ?!?

那这个呢?


在这里,我们似乎是在同一个Tick()函数中!

我真的想使用Profiler并了解它,但这一切都没有意义。对不起。

该怎么做?我们能提供什么帮助?

 
Ilyas:

1)没有代码,很难说为什么统计数据如此糟糕,也许是因为优化的缘故吧

2)为什么不尝试在循环之前在Timer函数中获取时间,并将其作为参数进一步传递,在循环中至少调用这个函数2*N次有什么意义?

谢谢你的回答!

1)我很难在一个简单的代码上重现它,是的。而且我还没有准备好把整个项目送出去。

2)在这个特定的案例中,我同意。

但还有许多其他类使用相同或类似的检查,不能没有TimeCurrent或GetTickCount。
如何优化他们的调用,不要多次请求相同的值?

而且,TimeCurrent是否真的如此沉重,以至于它在真正沉重的计算背景下会被注意到(即使是每1或5分钟执行一次)?
还是我又弄错了,38.16%的总CPU/26.07%的自身CPU被检查if本身占用了(没有考虑TimeCurrent 函数调用)?但为什么会这样呢?


Ilyas:

1)我将假设该函数是内联的

2)计数器确实没有关系,SelfCPU是对函数代码的负载,没有考虑到被调用的函数,在上面的代码中,是IF的开启器(分支)。

3) TotalCPU计数器显示一个执行分支的负载,由该程序分支中的所有调用组成。

1)这无助于理解为什么如此贪婪的开篇括号。如何解释这个问题?

2) 关于SelfCPU现在已经很清楚了,谢谢。这是对函数代码的加载,而不考虑被调用的函数。

这也解释了带iTime的字符串的SelfCPU很低--它很少被达到,只是很少被调用。

但为什么会有这么大的TotalCPU?或者它显示了整个程序中所有iTime(和其他CopyXXX函数?)函数的负载?

 
Andrey Khatimlianskii:

谢谢你的回答

1)我不认为我可以在简单的代码上重现它,是的。而且我还没有准备好把整个项目送出去。

2)在这个特定的案例中,我同意。

但还有许多其他类使用相同或类似的检查,不能没有TimeCurrent或GetTickCount。
如何优化他们的调用,不要多次请求相同的值?

而且,TimeCurrent是否真的如此沉重,以至于它在真正沉重的计算背景下会被注意到(即使是每1或5分钟执行一次)?
或者我又弄错了,总CPU的38.16%/自身CPU的26.07%被检查本身占用了(没有调用TimeCurrent 函数)?但是,为什么会这样呢?


1)这无助于理解为什么如此贪婪的开篇括号。如何解释这个问题?

2) 关于SelfCPU现在已经很清楚了,谢谢。这是对函数代码的加载,而不考虑被调用的函数。

这也解释了带iTime的字符串的SelfCPU很低--它很少被达到,只是很少被调用。

但为什么会有这么大的TotalCPU?或者它显示了整个程序中所有iTime(和其他CopyXXX函数?)函数的负载?

请从标准交付中抽取任何代码,进行校对,并在此基础上提出问题。这将允许对情况进行可重复的评估,并提供准确的答案。

否则,为分析器 报告回答你的小段代码是没有用的。在幕后有大量的优化器工作,它将你所有的代码变成完全不同的杂乱无章的嵌入表示。


供参考:上帝保佑,100个C++程序员中有1个能使用剖析器并理解其报告。原因是本地代码优化器。

 
Alain Verleyen:

在任何情况下。如何理解(来自安德鲁的例子)。

if(!simulated) taking 3.86% ?!?

是的,在不考虑外部函数调用 的情况下,SelfCPU的信息量不大。只有在最底层,即使用本地MQL函数的地方,你才会看到真正的负载。
但在这种情况下,不会清楚这些函数从哪些地方被更频繁地调用(和消耗更多),以及从哪些地方有单一的调用!在这种情况下,我们会发现,这些函数的调用是不可能的。那么,我知道CopyXXX和OrderXXX函数消耗的时间最多,有什么意义呢?我需要知道在我的程序中哪些块被调用得太频繁/太不充分。

我想这就是与TotalCPU相结合的 模式的作用。我将会研究这个问题。但到目前为止,我看到甚至有完全被注释掉的行(!)。