MetaEditor 帮助开发程序代码分析

代码分析

分析意即在执行过程中收集程序参数。 在分析过程中,测量执行时间、单独函数的调用次数和程序代码行数。 利用这个工具,程序员可以找到并优化最慢的代码段。

性能分析既能够在交易平台的正常图表上执行,也能够在策略测试中使用历史数据。第一种情况下,程序将在实时更新的图表上启动。您可以在真实条件下检查程序的表现。而第二种情况下,程序会在可视模式下的策略测试中启动。这种方法的优点是您无需等待交易服务器的真实数据或某些交易条件的发生。

许多程序,尤其是指标,只能在新报价进入时执行计算(OnTick,OnCalculate)。因此,为了评估性能,您必须等候新的实时报价。当使用历史数据进行分析时,您可以立即提供所需的加载并测试程序性能,即使是在市场关闭的周末也可以进行。

分析的工作原理

分析使用的是“抽样”方法。分析工具在MQL程序操作中暂停(每秒~10 000次),并收集有关在特定代码部分出现暂停次数的统计信息。这包括对调用堆栈的分析,以确定每个函数对总代码执行时间的“贡献”。在分析结束后,您会收到有关执行暂停次数以及每个函数出现在调用堆栈中的次数的信息:

  • 总CPU [单位,%] ― 函数在调用堆栈中出现的次数。
  • 自身CPU [衡量单位,%] ― 直接在指定函数内出现的“暂停”次数。此变量对于识别瓶颈至关重要:根据统计数据,在需要更多处理器时间的情况下,暂停发生的频率更高。

抽样是一种轻量型且准确的方法。与其他方法不同,抽样不会对分析的代码做出任何更改,因为这可能会影响其运行速度。

分析设置

默认情况下,程序在当前打开的图表上运行以进行分析。如果对历史数据进行分析,则使用策略测试的当前设置。您可以使用MetaEditor选项来设置指定任何其他图表或重新定义一些测试器设置。

调试

同一设置部分可以在编译期间启用或禁用函数内联。在内联期间,函数代码被直接添加到函数调用站,这使得在某些情况下可以显著加速程序。但是,此过程会使函数分析变得困难。您可以禁用内联以获得有关“纯”函数的报告。

此选项仅禁用显式内联。由编译器隐式生成的函数仍然可以使用。这类函数以[inlined]前缀显示。

可以禁用代码优化模式,以便在性能分析报告中包含更多详细信息。没有优化的代码速度可能会慢几倍,但是此模式可提供更广泛的代码覆盖范围。请注意,如果不进行优化,代码瓶颈可能不准确。

优化管理选项也可在项目设置中获得。

  • 如果在项目中禁用优化,则新选项将被忽略,性能分析将始终禁用优化(包括内联操作)。
  • 如果在项目中启用优化,则在性能分析编译期间将考虑新选项。

启动分析 #

打开程序的源代码(MQ4 或 MQ5)。 在 调试 菜单或 标准 工具栏里, 按 "开始依据真实数据分析开始依据真实数据分析" 或 "开始依据历史数据分析开始依据历史数据分析"。

然后,将自动编译用于分析的特别程序版本。取决于选定的分析类型,程序将在交易平台的正常图表或策略测试器(以可视模式)上启动。

在交易平台中的图表上启动分析

  • 默认情况下,应用程序在 EURUSD H1 上启动。 若要在另一个品种或周期上启动它,请在 MetaEditor 设置的 调试 选项卡上指定它们。
  • 非可视化测试器模式通常用于历史分析。可视化模式实际上是无用的,因为资源消耗在渲染方面而不是MQL程序计算上。

启动后,与应用程序一起工作一段时间,以便最大限度地尝试所有功能。 这对于分析器测量所有程序的函数和行数的执行时间是必要的。

然后停止分析: 从图表中删除程序,或单击停止分析 位于 调试 菜单或在 标准 工具栏里的停止分析。

为了获得更准确的性能分析结果,建议手工从图表中删除程序,而不是使用停止分析停止分析命令。

查看分析结果

分析完成后,结果将显示在“工具箱”窗口的分析工具选项卡中。该结果还直接显示在代码中:突出显示含有相应函数的行。突出显示的亮度越高,完成该函数所需的时间就越长。此功能可以快速直观地发现程序的瓶颈。

分析报告以函数或程序行的形式显示,每个函数或程序行都有两个指标:

  • 总CPU [单位,%] ― 函数在调用堆栈中出现的次数。
  • 自身CPU [衡量单位,%] ― 直接在指定函数内出现的“暂停”次数。此变量对于识别瓶颈至关重要:根据统计数据,在需要更多处理器时间的情况下,暂停发生的频率更高。

该值显示为绝对数量和占总量的百分比。

默认情况下,列表显示位于顶层的大型函数。双击函数行,切换到小型函数。

分析结果

可以使用两种模式查看分析报告:根据调用和根据行。第二种方法能够以最多的细节发现代码,并且不仅可以识别最慢的函数,还可以识别此类函数最慢的部分。使用快捷菜单在模式之间切换。

为了方便起见,MQL语言的各种元素在报告中显示为图标:

  • 自定义函数― 自定义函数。
  • 系统函数 ― 系统函数。
  • 事件处理函数― 事件处理函数(On*)。
  • 类方法― 类方法。
  • 受保护的类方法― 受保护的类方法。

除了这些类型的函数之外,分析工具还显示:

  • 系统函数@global_initializations ― 所有全局变量的初始化数据。
  • 系统函数@global_deinitializations ― 所有全局变量的去初始化数据。

要查看行号和该函数所在文件的路径,请将鼠标光标悬停在报告中的相应行上。要查看文件中的函数,请双击文件。

分析器不显示所有函数,只显示程序操作期间调用的那些函数。

快捷菜单 #

快捷菜单中有如下命令:

  • 打开 ― 跳转到源代码文件中的一行或一个函数。 同样的操作可以通过双击或按回车键来完成。
  • 展开所有 ― 展开所有折叠的函数。
  • 折叠所有 ― 折叠所有展开函数。
  • 函数行 ― 按行 查看分析结果。
  • 函数调用 ― 按调用 查看分析结果。
  • 导出 ― 导出分析结果以Open XML (MS Office Excel), HTML (Internet Explorer) 或CSV (文本文件)格式。
  • 自动排列 ― 启用/禁用自动调整字段大小。与按 A 键执行相同的动作。
  • 网格 ― 显示/隐藏网格来分开字段。与按 G 键执行相同的动作。