MQL4プログラムの実行速度を測定する

概要

 EAに限りませんが、取引速度を気にするトレーダーは多いです。EAを製作するときにも、なるべく処理速度に気をつけて実装を行いたいものです。そこで実行速度を調べるためのモジュールを作成しました。

準備

GithubからBenchmark.mqhをダウンロードして下さい。

MT4のデータフォルダを開き、Benchmark.mqhをMQL4/Include/mql4_modules/Benchmark/Benchmark.mqhとして保存します。

mql4のコード内でBenchmark.mqhをincludeしたら準備完了です。

#include <mql4_modules/Benchmark/Benchmark.mqh>

使い方

 まずはじめにStartメソッドを実行します。このとき引数としてベンチマーク名を渡すことができます。指定されたベンチマーク名は結果を出力する際に一緒に表示されるため、複数のベンチマークを一度に行う場合は、テスト結果を区別するのに役立ちます。ベンチマーク名は省略可能です。
 次に計測したい処理を記述します。MQL4はC++という比較的動作の速い言語が元になっているため、MQL4自体の処理速度はかなり速いです。しかしBnchmarkモジュールはミリ秒よりも短い単位で測定ができないため、大抵は繰り返し処理を使う必要があります。100万回繰り返したときの実行速度を調べるなどの工夫が必要です。繰り返し回数は実行結果を確認しながら、各自調整してください。
 最後にEndメソッドを実行します。すると、エキスパートタブに実行にかかった時間が秒単位で出力されます。

#include <Benchmark.mqh>

int OnInit()
{
   // 計測開始
   Benchmark::Start("Sample");

   // この例では100万回繰り返した場合の速度を調べる
   for(int i = 0; i < 1000000; i++) {
      // 計測したい処理を書く
   }

   // 計測終了
   // 実行にかかった時間が出力される
   Benchmark::End();

   return(INIT_SUCCEEDED);
}

もう一つの方法

 Benchmarkモジュールではもっと楽に処理を書くためのマクロを用意しています。BenchmarkRunに、実行したい処理と実行回数を渡すことで、第一引数の処理を指定回数だけ実行した場合の実行速度を出力できます。この方法を使うと、StartメソッドやEndメソッドを書く必要がありませんし、いちいちループ処理を書く手間も省けます。

int sum(int a, int b, int c)
{
   return(a + b + c);
}

int OnInit()
{
   // 関数sumを100万回実行したときの時間を出力する
   BenchmarkRun(sum(100, 200, 300), 1000000);

   return(INIT_SUCCEEDED);
}
arrow_upward