测试x64平台的新MQL5编译器--计算速度提高2至10倍

 

正如我们之前所承诺的,我们将发布一个新的MQL5编译器,为MetaTrader 5的64位版本进行优化。

我们对32位版本的终端和旧版本的终端都保持了生成代码的完全兼容。

您已经可以在我们的MetaQuotes-Demo服务器上升级到MetaTrader 5 build 1108及其新功能。为了启用新的优化编译器,在metaeditor.ini的[Experts]中添加Optimize=1键。

[Experts]
Author=Copyright 2014, MetaQuotes Software Corp.
Address=http://www.mql5.com
Optimize=1


为了测试MQL4、MQL5和C++编译器的性能,我们使用了标准编译器测试。所有的源文件都与Excel电子表格一起附在后面,这样大家就可以仔细检查了。

现在让我们来看看在以下环境中的测试结果。

  • 英特尔至强E5-2687W v3 @3.10 Ghz, 20个核心, 32 Gb DDR4 2100
  • MQL4在MetaTrader 4 build 794
  • MQL5在MetaTrader 5 build 1111 x64上,正常模式
  • MetaTrader 5 build 1111 x64上的MQL5,新的编译器,优化=1模式
  • 使用Visual Studio 2012 Update 4的C++,x64代码,最大限度地优化
  • 时间以毫秒为单位,越少越好

测试MT4 794MT5 1111 x64
MT5 1111 新C++ x64评论者
测试Ackermann 3718 3109 0 0 完美,两个编译器能够通过抛出所有代码来优化编译计算
测试数组 15063 2531 203 31 仍有改进的余地
测试气泡排序 10609 2484 656 860 令人惊讶的是,MQL5在泡沫排序中已经拉开了序幕
测试呼叫 922 891 0 0 完美,两个编译器能够通过抛出所有代码来优化编译计算
测试Fibo 2547 1187 0 0 完美,两个编译器能够通过抛出所有代码来优化编译计算
测试矩阵 15375 4359 422 281 仍有改进的余地
测试时刻 5719 4323 4078 0 也许,通过包括更多的优化方法,我们将能够像MSVC那样把代码扔掉。
嵌套循环(TestNestedLoop 6219 6141 0 0 完美,两个编译器能够通过抛出所有代码来优化编译计算
测试PiCalculated 5047 3500 1875 1859 与MSVC的鼻息相通
测试随机 2375 1828 468 438 几乎与MSVC一样好
测试筛 13578 4031 875 515 关闭
测试字符串 187 218 422 266 优化并超越MSVC,这是由于优化不足造成的暂时性翻车
实验性的准备工作 3938 3328 1703 1875 比MSVC更快
测试字符串 4000 3141 2719 438 我们必须搞清楚。
测试字符串(TestStrSum) 5344 2812 2844 0 可能的话,通过增加更多的优化方法,我们将能够消除像MSVC中的代码


要看详细的图表,请点击它。


结论是什么。

  1. 即使基于一个编译器,MQL4也严重输给了MQL5。

    MQL5比MQL4快了几十个百分点,甚至几倍。原因是在执行环境和32位。MetaTrader 5有一个更有效和不断发展的运行时间。

  2. 新的64位MQL5编译器比目前的MQL5快2到10倍。

    新编译器的开发花了很多时间,但收获是惊人的。在优化字符串操作方面存在一些问题,但我们也将努力加快它们的速度。

  3. 新的编译器与Visual Studio 2012 x64编译器的质量和速度非常接近。

    我们还没有激活所有的优化方法,因为我们还在测试它们。因此,结果将继续改善。


它给交易者带来了什么?

能够在同样的时间内做更多的计算,并且更少地考虑切换到DLL的问题。这对那些做繁重数学工作的人来说尤其重要。

 

干得好!

 

在他们的领域中的专业人员!

谢谢你!

 

另外--5月20日之前的下一个版本很可能会有一个可用于历史数据的调试器。

我们将在5月26日至28日的iFX博览会 上展示它。

iFX EXPO International 2015
  • iFX EXPO
  • www.ifxexpo.com
Booth 01 Get the world’s fastest HTML5 chart for mobile & desktop, and the highest user-rated mobile apps - with or without trading. Founded in 1998, NetDania pioneered streaming price technology, and have since delivered solutions to global Tier-1 banks, brokers, currency managers, and analysts. With a strong position within corporate FX and...
 

Renat Fatkhullin:

  1. 新的64位MQL5编译器比目前的MQL5编译器快2到10倍。

    新编译器的开发花费了很长的时间,但收获却很惊人。在优化字符串操作方面存在一些问题,但我们也将努力加快它们的速度。

  2. 新的编译器与Visual Studio 2012 x64编译器的质量和速度非常接近。

    我们还没有激活所有的优化方法,因为我们还在测试它们。因此,结果将继续改善。


此外,关于历史数据的调试器很可能在5月20日之前的下一个版本中提供。

我们将在5月26日至28日的iFX博览会 上展示它。

非常值得欢迎的消息,谢谢你!
 
谢谢你,我祝愿你进一步成功!
 
Renat Fatkhullin:

新的编译器非常接近于Visual Studio 2012 x64编译器的质量和速度。

我们还没有激活所有的优化方法,因为我们还在测试它们。这就是为什么结果将继续改善。

好消息 !干得好!

雷纳特-法特库林

你可以在同一时间进行更多的计算,并较少考虑切换到DLL的问题。这对那些做繁重数学的人来说尤其重要。


是的,我真的想不出还有什么任务需要使用外部DLLs了。


雷纳特-法特库林

此外--5月20日之前的下一个版本很可能会有一个可用于历史数据的调试器。

这确实是最有用的功能。确实非常感谢你。

我个人只有一个问题--指向数组的指针。 对于私有数组来说,问题可以通过将数组包装成一个类来解决。

但对于传入OnCalculate()函数的 数组,我必须每次都把数据复制到内部缓冲区,然后才把指针传入分析器对象和处理程序。有一次,我试着用memcpy传递指针,但不知为什么,速度几乎一样,在我看来,这种 "技巧 "不应该被应用。

也许使用引用类型的可能性会更容易被接受。 一般来说,任务是访问数组元素而不复制它们。

 
George Merts:

是的,我真的想不出还有什么任务需要使用外部DLLs。

例如,终端间的通信。
 
我试着用优化方法编译我的一个机器人。
结果发现,将偏差输入参数分配给MqlTradeRequest结构 实例的偏差字段会导致代码生成错误。
假设的例子(其他一切都已被删除)。
sinput ulong deviation = 100;
int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = deviation;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
我得到"代码生成错误11"。

如果你只是指定 "100"。

int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = 100;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }

...那么编译就会顺利进行,不会出现错误。注意,我有AMD Athlon II X4 645,3.1 GHz处理器。也许这很重要(就在本周,带有servicedesk的MQL4已经在AMD上抓到了一些错误)。

我的编译器并没有抱怨其他的事情。

 
谢谢你报告这个错误--我们将修复它。
原因: