GetMicrosecondCount関数の働き・役割
GetMicrosecondCount関数は、MQL5プログラムの開始から経過したマイクロ秒数を返します。
これは高精度の時間計測に利用でき、エキスパートアドバイザーやスクリプトのパフォーマンス測定に役立ちます。
マイクロ秒とは何か?
マイクロ秒は、1秒の100万分の1に相当する時間単位です。
1マイクロ秒 = 0.000001秒、1秒 = 1,000,000マイクロ秒となります。
身近な例としては、カメラのシャッタースピードで1/1000秒よりも速い速度を表す際にマイクロ秒が使われることがあります。
非常に短い時間を測定するために使用され、精度が高い時間計測を必要とする場合に役立ちます。
MQL5プログラムの開始から経過したマイクロ秒数とは何か?
MQL5プログラムが開始されてから経過したマイクロ秒数は、プログラムが起動してから現在までの時間をマイクロ秒単位で計測したものです。
これは、例えばスクリプトをMT5のチャートに挿入してから経過した時間を意味します。これにより、プログラムの実行時間や特定の操作にかかる時間を高精度で測定することができます。
GetMicrosecondCount関数の引数
GetMicrosecondCount関数は引数を取りません。
ulong GetMicrosecondCount();
GetMicrosecondCount関数の戻り値
GetMicrosecondCount関数は、MQL5プログラムが開始されてから経過したマイクロ秒数を示す ulong型の値を返します。 ulongはマイナスの値を持たない64ビットの整数型で、非常に大きな数値範囲を扱うことができます。
GetMicrosecondCount関数を使ったサンプルコード
以下のコードは、GetMicrosecondCount関数を使用して、指定されたループの実行時間を計測する例です。
// OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出されます
void OnStart()
{
// 文字列を定義します
string s;
// StringReserveを使用しない場合の動作速度をチェックします
ulong t0 = GetMicrosecondCount();
for (int i = 0; i < 1024; i++)
{
s += " " + (string)i;
}
ulong msc_no_reserve = GetMicrosecondCount() - t0;
s = NULL; // 文字列をリセットします
// StringReserveを使用する場合の動作速度をチェックします
StringReserve(s, 1024 * 3);
t0 = GetMicrosecondCount();
for (int i = 0; i < 1024; i++)
{
s += " " + (string)i;
}
ulong msc_reserve = GetMicrosecondCount() - t0;
// 結果をエキスパートログに表示します
Print("StringReserveを使用した場合のテスト時間: " + (string)msc_reserve + " マイクロ秒");
Print("StringReserveを使用しない場合のテスト時間: " + (string)msc_no_reserve + " マイクロ秒");
/*
結果:
StringReserveを使用した場合のテスト時間: 50 マイクロ秒
StringReserveを使用しない場合のテスト時間: 121 マイクロ秒
*/
}
なぜループ範囲を1024にしているのか?
このサンプルコードでは、ループ範囲を1024に設定しています。これは、パフォーマンステストのために十分な回数の文字列操作を行うためです。
- パフォーマンス評価: 1024回の操作は、メモリ割り当てと再割り当ての影響を観察するのに適した数です。少なすぎると、メモリ割り当ての影響が不明瞭になる可能性があり、多すぎると処理時間が長くなりすぎます。
- 適切な負荷: 適度な回数のループを設定することで、プログラムの負荷を評価しやすくなります。これにより、StringReserve関数を使用した場合と使用しない場合のパフォーマンスの違いを明確に示すことができます。
- 2の累乗: 1024は2の累乗(2の10乗)であるため、コンピュータのメモリ管理において効率的に扱われます。2の累乗の値は、メモリ割り当てやバッファ管理において最適化されやすい特徴があります。
キャスト(型変換)について
キャストとは、あるデータ型の値を別のデータ型に変換することを指します。このサンプルコードでは、整数型の変数iを文字列型に変換するためにキャストを使用しています。
s += " " + (string)i;
この部分のコードでは、以下の操作が行われています:
キャストを使用することで、異なるデータ型の値を適切に操作・結合することができます。
キャストの利点
※キャストの詳細は↓の記事をご参照ください。
その他サンプルコードに使われた関数や文法要素の簡単な解説
・OnStart関数: スクリプトが実行されるときに自動的に呼び出されます。
・StringReserve関数: 指定されたサイズのバッファを文字列のために確保します。これにより、文字列操作のパフォーマンスを向上させることができます。
・Print関数: 指定された文字列をエキスパートログに出力します。デバッグや情報の確認に使用されます。
・
GetMicrosecondCount関数: 現在のマイクロ秒(=100万分の1秒。1マイクロ秒 = 0.000001秒、1秒 = 1,000,000マイクロ秒)カウントを取得します。これにより、処理時間の計測が可能です。
・ulong: 符号なし64ビット整数型です(マイナスの値を持たない整数で、0から18446744073709551615までの範囲の値を持つデータ型)。大きな数値を扱う際に使用されます。
・+=
: 複合代入演算子。左辺の変数に右辺の値を加え、その結果を左辺の変数に代入します。複合代入演算子を使用することで、コードを簡潔に記述できます。
※複合代入演算子については下記の記事リンクをご参照ください。
<参照>
StringAdd関数/StringBufferLen関数/StringCompare関数/StringLen関数/StringConcatenate関数/StringFill関数/StringInit関数/StringFind関数/StringGetCharacter関数/StringSetLength関数/StringReplace関数/StringReserve関数
コメント