x64プラットフォーム用の新しいMQL5コンパイラーをテスト - 2~10倍計算が速い!

 

先にお約束した通り、64ビット版のMetaTrader 5に最適化した新しいMQL5コンパイラをリリースします。

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スプレッドシートと一緒に添付されているので、誰でも再確認することができます。

とりあえず、以下の環境でテスト結果を見てみましょう。

  • Intel Xeon E5-2687W v3 @3.10Ghz、20コア、32GB DDR4 2100
  • MetaTrader 4 build 794でのMQL4。
  • MetaTrader 5 build 1111 x64、ノーマルモードでのMQL5。
  • MetaTrader 5 build 1111 x64でのMQL5、新しいコンパイラー、Optimize=1モード
  • Visual Studio 2012 Update 4を使用したC++、x64コード、最大限の最適化
  • 時間(ミリ秒)、少ないほど良い

テストMT4 794MT5 1111 x64
MT5 1111 新品C++ x64コメント
TestAckermann 3718 3109 0 0 完璧に、2つのコンパイラは、すべてのコードを捨てて、コンパイル計算を最適化することができました。
テストアレイ 15063 2531 203 31 まだ改善の余地がある
テストバブルソート 10609 2484 656 860 意外にも、バブル期の仕分けでMQL5が引き抜かれた件
テストコール 922 891 0 0 完璧に、2つのコンパイラは、すべてのコードを捨てて、コンパイル計算を最適化することができました。
テストフィボ 2547 1187 0 0 完璧に、2つのコンパイラは、すべてのコードを捨てて、コンパイル計算を最適化することができました。
テストマトリクス 15375 4359 422 281 まだ改善の余地がある
テストモーメント 5719 4323 4078 0 おそらく、より多くの最適化手法を盛り込むことで、MSVCのようにコードをゴミ箱行きにすることができるだろう
TestNestedLoop 6219 6141 0 0 完璧に、2つのコンパイラは、すべてのコードを捨てて、コンパイル計算を最適化することができました。
TestPiCalculated 5047 3500 1875 1859 MSVCと鼻を突き合わせる
テストランダム 2375 1828 468 438 MSVCとほぼ同じ性能
テストシーブ 13578 4031 875 515 閉じる
テストストリング 187 218 422 266 最適化してMSVCを追い越せ、これは最適化不足による一時的なフロップ
TestStrPrep 3938 3328 1703 1875 MSVCより高速
TestStrRev 4000 3141 2719 438 それを見極めなければならない。
TestStrSum 5344 2812 2844 0 可能性としては、最適化手法を増やすことで、MSVCのようなコードをなくすことができるかもしれません


詳細なグラフをご覧になるには、クリックしてください。


結論は何か。

  1. コンパイラ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 Expo」にて展示します。

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 Expoで デモを行います。

とても嬉しいニュースです、ありがとうございます
 
ありがとうございました!さらなるご活躍をお祈りしています。
 
Renat Fatkhullin:

新しいコンパイラは、Visual Studio 2012 x64コンパイラの品質と速度に非常に近くなっている

まだテスト中のため、すべての最適化手法を有効にしているわけではありません。だからこそ、成果はどんどん上がっていくのです。

朗報です。よくやった

レナト・ファットフーリン

同時に多くの計算を行うことができ、DLLに切り替えることをあまり考えなくて済むかもしれません。特にヘビーな計算をする人には重要です。


そうですね、外部DLLが必要な作業はもう本当に思いつきませんね。


レナト・ファットフーリン

また、5月20日までの次のリリースでは、過去のデータでデバッガが利用できるようになる可能性が高いです。

これが本当に一番便利な機能です。本当にありがとうございました。

個人的には、配列へのポインタについてひとつだけ疑問があります。 プライベート配列の場合は、配列をクラスでラップすることで問題が解決します。

しかし、OnCalculate()関数に 渡される配列は、毎回データを内部バッファにコピーし、Analyzerオブジェクトとハンドラにポインタを渡すだけです。一度、memcpyを使ってポインタを渡そうとしたことがありますが、なぜか速度はほとんど変わらず、私の意見としては、このような「トリック」は適用すべきではないです。

一般に,配列の要素をコピーせずにアクセスすることが課題です.

 
George Merts:

そうですね、現実的にはもう外部DLLが必要な作業は思いつきませんね。

例えば、端末間通信。
 
あるロボットを最適化してコンパイルしようとしました。
MqlTradeRequest構造体 インスタンスのdeviationフィールドにdeviation入力パラメータを代入すると、コード生成エラーになることが判明した。
仮の例(他はすべて削除しています)。
sinput ulong deviation = 100;
int OnInit()
  {
        MqlTradeRequest request =
        {
                0
        };
        request.deviation = deviation;
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
コード生成エラー1 1」と表示されるのですが。

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でいくつかのバグをキャッチしています)。

私のコンパイラは他に何も文句を言いません。

 
エラーのご報告 ありがとうございます。
理由: