关于MT5代码分析器 - 页 4 1234567 新评论 Andrey Khatimlianskii 2021.07.29 14:32 #31 Renat Fatkhullin:请从标准交付中抽取任何代码,对其进行剖析,并在此基础上提出你的问题。这将允许对情况进行可重复的评估,并提供准确的答案。否则,在你的小块代码中,负责剖析器 报告是没有好处的。后面有大量的优化器工作,将你的所有代码变成完全不同的杂乱无章的嵌入表示。 我明白,没有复制就不会有准确的答案。 标准代码不太可能被剖析,但我将尝试给出可重复的大块内容。 Ilyas 2021.07.29 17:12 #32 Andrey Khatimlianskii:谢谢你的回答1)我不认为我可以在简单的代码上重现它,是的。而且我还没有准备好把整个项目送出去。2)在这个特定的案例中,我同意。但还有许多其他类使用相同或类似的检查,不能没有TimeCurrent或GetTickCount。 如何优化他们的调用,不要多次请求相同的值?而且,TimeCurrent是否真的如此沉重,以至于它在真正沉重的计算背景下会被注意到(即使是每1或5分钟执行一次)? 还是我又弄错了,38.16%的总CPU/26.07%的自身CPU被检查if本身占用了(没有考虑TimeCurrent 函数调用)?但是,为什么会这样呢?1)这无助于理解为什么如此贪婪的开篇括号。如何解释这个问题?2) 关于SelfCPU现在已经很清楚了,谢谢。这是对函数代码的加载,而不考虑被调用的函数。这也解释了带iTime的字符串的SelfCPU很低--它很少被达到,只是很少被调用。但为什么TotalCPU这么高?或者它显示了整个程序中所有iTime(和其他CopyXXX函数?)函数的负载? 分离式括号--可以把它看作是一个函数的序幕,通常需要几条指令来放置,特别是初始化局部变量。 注意一个函数的局部变量的大小,你必须考虑到由于内联调用,其大小可能会增加。如果函数的局部消耗超过4Kb,服务函数被调用以提供堆栈内存--这是一个残酷的事实,Nativa无法摆脱它。 SelfCPU不应该计算调用,否则它就会简单地重复TotalCPU,它自己的指令时间就会被被调用的函数的时间稀释 一个字符串的TotalCPU只是该字符串的 "时间"。 Vasiliy Pushkaryov 2021.07.29 19:35 #33 Alain Verleyen:不应该总是100%吗?或甚至略少,同时考虑到@global_initializations和@global_deinitializations。 这里是超过102%......(根据历史数据建立3003)。 对于旧的剖析器,文章 说它可能是更多的 剖析给我们提供了重要的统计数据:每个函数被调用了多少次,运行它需要多少时间。你可能对百分比的统计数字感到有些困惑。这里应该理解的是,统计数据不考虑函数的嵌套,所以所有百分比的总和将远远大于100%。 Alain Verleyen 2021.07.29 21:00 #34 Vasiliy Pushkaryov :关于旧的剖析器,该文章 指出,可能有更多的 谢谢你。但据我所知,新的分析器应该是不同的。不接受任何借口,错误就是错误。 Andrey Khatimlianskii 2021.07.29 22:24 #35 Ilyas: 撕裂式括号--可以把它看作是一个函数的序幕,通常需要几条指令来放置,特别是初始化局部变量。 注意函数的局部变量的体积,你应该考虑到由于内联调用,体积可能会增加 如果函数的局部变量消耗超过4Kb,就会调用一个服务函数来提供堆栈内存 - 这是nativa的一个残酷事实,没有办法摆脱它 SelfCPU不应该计算调用,否则它就会简单地重复TotalCPU,自己的指令时间就会被调用函数的时间所模糊 一个字符串的TotalCPU仅仅是该字符串的 "时间"。 1)在函数主体中只声明了一个双变量(不包括const bool模拟的函数参数)。 2) 那么处理器收到了11个工作工具中的一个的iTime( m_symbol, PERIOD_CURRENT, 0 )(它是 "m_CloseOnFirstTickOnly || m_OpenOnFirstTickOnly "条件被触发的那个)? 还是你指的是 "按调用功能 "模式(我没有显示)? 我将尝试用我不理解的结果做可重复的代码片段,来进行实质性的讨论。 fxsaber 2021.09.10 02:11 #36 请用一个简单的例子帮助我解释剖析器的数据。 #include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875 const bool Init = EventSetMillisecondTimer(1); void f() { Sleep(1); } void OnTimer() { _USAGE f(); Sleep(2); } 这看起来像很多废话。 Sleep(2)完全没有。 由于某些原因,USAGE比Sleep(1)多吃了几倍。 真的想掌握它,但还没有运气。 还尝试了睡眠替换。 void Sleep2( uint Interval ) { const ulong StartTime = GetMicrosecondCount(); Interval *= 1000; while (GetMicrosecondCount() - StartTime < Interval) ; } #define Sleep Sleep2 仍然不清楚剖析器的值。 fxsaber 2021.09.10 02:55 #37 fxsaber #:请用一个简单的例子帮助我解释剖析器的数据。这看起来像很多废话。 Sleep(2)完全没有。 由于某些原因,USAGE比Sleep(1)多吃几倍。 同样的代码在MT4上产生绝对正确的结果。 我在MT5中做错了什么? ZZY 使用MT4剖析器的MT5最后一次构建是b2595(b2593-如果产生内部编译器错误)。 Renat Fatkhullin 2021.09.10 07:09 #38 而你凭什么认为你写的代码就等于实际可执行的代码?我得告诉你多少次关于过度优化和混合产生的代码的问题?下划线的前缀清楚地表明了这一点。另外,在这种微不足道的代码上使用剖析器是 没有意义的,因为采样剖析器没有时间来收集统计数据。剖析器可以有效地在粗暴优化的代码中寻找统计意义上的成本点,而不是逐行查找源代码。因为你的代码与实际执行的关系不大。 fxsaber 2021.09.10 07:40 #39 Renat Fatkhullin 剖析器是 没有意义的,因为采样剖析器没有时间来收集统计数据。 剖析器可以有效地在粗暴优化的代码中寻找统计意义上的成本点,而不是逐行查找源代码。 因为你的代码与实际执行的关系不大。 我不得不写这样一个简单的例子,因为不可能对具有大量源代码的激进的EA解释剖析器的值。 以上提出的问题。怎么可能击中睡眠(1)而不击中睡眠(2)。我相信你没有启动或看任何东西,只是一下子写了你的回应。 当优化被禁用时,也会产生同样的废话。此外,旧的剖析器已经存在于b2596中,那里还没有新的方法。花了一些时间研究它... fxsaber 2021.09.10 09:31 #40 我以为智能优化器是将连续的两个睡眠合并成一个。但检查表明,情况并非如此。 #include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875 const bool Init = EventSetMillisecondTimer(1); void f() { Sleep(1); } ulong Temp; void OnTimer() { _USAGE f(); Temp += GetMicrosecondCount() - Temp; Sleep(2); } void OnDeinit( const int ) { Print(Temp); } Sleep(2)是不可见的。 1234567 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
请从标准交付中抽取任何代码,对其进行剖析,并在此基础上提出你的问题。这将允许对情况进行可重复的评估,并提供准确的答案。
否则,在你的小块代码中,负责剖析器 报告是没有好处的。后面有大量的优化器工作,将你的所有代码变成完全不同的杂乱无章的嵌入表示。
我明白,没有复制就不会有准确的答案。
标准代码不太可能被剖析,但我将尝试给出可重复的大块内容。
谢谢你的回答
1)我不认为我可以在简单的代码上重现它,是的。而且我还没有准备好把整个项目送出去。
2)在这个特定的案例中,我同意。
但还有许多其他类使用相同或类似的检查,不能没有TimeCurrent或GetTickCount。
如何优化他们的调用,不要多次请求相同的值?
而且,TimeCurrent是否真的如此沉重,以至于它在真正沉重的计算背景下会被注意到(即使是每1或5分钟执行一次)?
还是我又弄错了,38.16%的总CPU/26.07%的自身CPU被检查if本身占用了(没有考虑TimeCurrent 函数调用)?但是,为什么会这样呢?
1)这无助于理解为什么如此贪婪的开篇括号。如何解释这个问题?
2) 关于SelfCPU现在已经很清楚了,谢谢。这是对函数代码的加载,而不考虑被调用的函数。
这也解释了带iTime的字符串的SelfCPU很低--它很少被达到,只是很少被调用。
但为什么TotalCPU这么高?或者它显示了整个程序中所有iTime(和其他CopyXXX函数?)函数的负载?
注意一个函数的局部变量的大小,你必须考虑到由于内联调用
,其大小可能会增加。如果函数的局部消耗超过4Kb,服务函数被调用以提供堆栈内存--这是一个残酷的事实,Nativa无法摆脱它。
一个字符串的TotalCPU只是该字符串的 "时间"。
不应该总是100%吗?或甚至略少,同时考虑到@global_initializations和@global_deinitializations。
这里是超过102%......(根据历史数据建立3003)。
对于旧的剖析器,文章 说它可能是更多的
剖析给我们提供了重要的统计数据:每个函数被调用了多少次,运行它需要多少时间。你可能对百分比的统计数字感到有些困惑。这里应该理解的是,统计数据不考虑函数的嵌套,所以所有百分比的总和将远远大于100%。
关于旧的剖析器,该文章 指出,可能有更多的
注意函数的局部变量的体积,你应该考虑到由于内联调用,体积可能会增加
如果函数的局部变量消耗超过4Kb,就会调用一个服务函数来提供堆栈内存 - 这是nativa的一个残酷事实,没有办法摆脱它
一个字符串的TotalCPU仅仅是该字符串的 "时间"。
1)在函数主体中只声明了一个双变量(不包括const bool模拟的函数参数)。
2) 那么处理器收到了11个工作工具中的一个的iTime( m_symbol, PERIOD_CURRENT, 0 )(它是 "m_CloseOnFirstTickOnly || m_OpenOnFirstTickOnly "条件被触发的那个)?
还是你指的是 "按调用功能 "模式(我没有显示)?
我将尝试用我不理解的结果做可重复的代码片段,来进行实质性的讨论。
请用一个简单的例子帮助我解释剖析器的数据。
这看起来像很多废话。
真的想掌握它,但还没有运气。
还尝试了睡眠替换。
仍然不清楚剖析器的值。
请用一个简单的例子帮助我解释剖析器的数据。
这看起来像很多废话。
同样的代码在MT4上产生绝对正确的结果。
我在MT5中做错了什么?
ZZY 使用MT4剖析器的MT5最后一次构建是b2595(b2593-如果产生内部编译器错误)。
我不得不写这样一个简单的例子,因为不可能对具有大量源代码的激进的EA解释剖析器的值。
以上提出的问题。怎么可能击中睡眠(1)而不击中睡眠(2)。我相信你没有启动或看任何东西,只是一下子写了你的回应。
当优化被禁用时,也会产生同样的废话。此外,旧的剖析器已经存在于b2596中,那里还没有新的方法。花了一些时间研究它...
我以为智能优化器是将连续的两个睡眠合并成一个。但检查表明,情况并非如此。
Sleep(2)是不可见的。