关于MT5代码分析器 - 页 4

 
Renat Fatkhullin:

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

否则,在你的小块代码中,负责剖析器 报告是没有好处的。后面有大量的优化器工作,将你的所有代码变成完全不同的杂乱无章的嵌入表示。

我明白,没有复制就不会有准确的答案。

标准代码不太可能被剖析,但我将尝试给出可重复的大块内容。

 
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函数?)函数的负载?

  1. 分离式括号--可以把它看作是一个函数的序幕,通常需要几条指令来放置,特别是初始化局部变量
    注意一个函数的局部变量的大小,你必须考虑到由于内联调用
    ,其大小可能会增加。如果函数的局部消耗超过4Kb,服务函数被调用以提供堆栈内存--这是一个残酷的事实,Nativa无法摆脱它。

  2. SelfCPU不应该计算调用,否则它就会简单地重复TotalCPU,它自己的指令时间就会被被调用的函数的时间稀释
    一个字符串的TotalCPU只是该字符串的 "时间"。
 
Alain Verleyen:

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

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

对于旧的剖析器,文章 说它可能是更多的

剖析给我们提供了重要的统计数据:每个函数被调用了多少次,运行它需要多少时间。你可能对百分比的统计数字感到有些困惑。这里应该理解的是,统计数据不考虑函数的嵌套,所以所有百分比的总和将远远大于100%。

 
Vasiliy Pushkaryov :

关于旧的剖析器,该文章 指出,可能有更多的

谢谢你。但据我所知,新的分析器应该是不同的。不接受任何借口,错误就是错误。
 
Ilyas:
  1. 撕裂式括号--可以把它看作是一个函数的序幕,通常需要几条指令来放置,特别是初始化局部变量
    注意函数的局部变量的体积,你应该考虑到由于内联调用,体积可能会增加
    如果函数的局部变量消耗超过4Kb,就会调用一个服务函数来提供堆栈内存 - 这是nativa的一个残酷事实,没有办法摆脱它

  2. SelfCPU不应该计算调用,否则它就会简单地重复TotalCPU,自己的指令时间就会被调用函数的时间所模糊
    一个字符串的TotalCPU仅仅是该字符串的 "时间"。

1)在函数主体中只声明了一个双变量(不包括const bool模拟的函数参数)。

2) 那么处理器收到了11个工作工具中的一个的iTime( m_symbol, PERIOD_CURRENT, 0 )(它是 "m_CloseOnFirstTickOnly || m_OpenOnFirstTickOnly "条件被触发的那个)?

还是你指的是 "按调用功能 "模式(我没有显示)?


我将尝试用我不理解的结果做可重复的代码片段,来进行实质性的讨论。

 

请用一个简单的例子帮助我解释剖析器的数据。

#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 #:

请用一个简单的例子帮助我解释剖析器的数据。


这看起来像很多废话。

  • Sleep(2)完全没有。
  • 由于某些原因,USAGE比Sleep(1)多吃几倍。

同样的代码在MT4上产生绝对正确的结果。


我在MT5中做错了什么?

ZZY 使用MT4剖析器的MT5最后一次构建是b2595(b2593-如果产生内部编译器错误)。

 
而你凭什么认为你写的代码就等于实际可执行的代码?

我得告诉你多少次关于过度优化和混合产生的代码的问题?下划线的前缀清楚地表明了这一点。

另外,在这种微不足道的代码上使用剖析器是 没有意义的,因为采样剖析器没有时间来收集统计数据。

剖析器可以有效地在粗暴优化的代码中寻找统计意义上的成本点,而不是逐行查找源代码。

因为你的代码与实际执行的关系不大。




 
Renat Fatkhullin 剖析器是 没有意义的,因为采样剖析器没有时间来收集统计数据。

剖析器可以有效地在粗暴优化的代码中寻找统计意义上的成本点,而不是逐行查找源代码。

因为你的代码与实际执行的关系不大。

我不得不写这样一个简单的例子,因为不可能对具有大量源代码的激进的EA解释剖析器的值。

以上提出的问题。怎么可能击中睡眠(1)而不击中睡眠(2)。我相信你没有启动或看任何东西,只是一下子写了你的回应。

当优化被禁用时,也会产生同样的废话。此外,旧的剖析器已经存在于b2596中,那里还没有新的方法。花了一些时间研究它...

 

我以为智能优化器是将连续的两个睡眠合并成一个。但检查表明,情况并非如此。

#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)是不可见的。