string a="a",b="b",c;
uint start,stop;
long i,length=10000000;
//--- первый способ
start=GetTickCount();
for(i=0;i<length;i++)
{
c=a+b;
}
stop=GetTickCount();
Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);
//--- второй способ
a="a"; // заново инициализируем переменную a
start=GetTickCount();
for(i=0;i<length;i++)
{
StringAdd(a,b);
}
stop=GetTickCount();
Print("time for 'StringAdd(a,b)' = ",(stop-start)," milliseconds, i = ",i);
//--- третий способ
a="a";c="";
start=GetTickCount();
for(i=0;i<length;i++)
{
int k=StringConcatenate(c,a,b);
//c=""; //с такой строчкой работает ещё дольше.
}
stop=GetTickCount();
Print("time for 'StringConcatenate(c,a,b)' = ",(stop-start)," milliseconds, i = ",i);
と出力されます。
DR 0 DoubleToString (EURGBP,M1) 22:15:55 time for'c = a + b' = 2359 milliseconds, i = 10000000
QE 0 DoubleToString (EURGBP,M1) 22:15:56 time for'StringAdd(a,b)' = 1031 milliseconds, i = 10000000
FE 0 DoubleToString (EURGBP,M1) 22:16:00 time for'StringConcatenate(c,a,b)' = 3891 milliseconds, i = 10000000
////////////////////////////////////////////////////////////////////////////////// Global variables, used in working the trade system //////////////////////////////////////////////////////////////////////////////////string a="Пример";
double b=1.26,c = 1.27;
string d;
uint start,stop;
long i,length=10000000;
////////////////////////////////////////////////////////////////////////////////voidOnStart()
{
//----------------------------------------------------------------------------////Work variables//----------------------------------------------------------------------------//
start=GetTickCount();
for(i=0;i<length;i++)
{
d=a+(string)b+(string)c;
}
stop=GetTickCount();
Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);
//Второй способ
d= "";
start=GetTickCount();
for(i=0;i<length;i++)
{
StringAdd(d,a);
StringAdd(d,(string)b);
StringAdd(d,(string)c);
}
stop=GetTickCount();
Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);
//Третий способ
d= "";
start=GetTickCount();
for(i=0;i<length;i++)
{
int k=StringConcatenate(d,a,b,c);
}
stop=GetTickCount();
Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);
//----------------------------------------------------------------------------//
}
////////////////////////////////////////////////////////////////////////////////
そしてこの結果
2011.04.1515:28:58123 (EURUSD,D1) time for'd = a + b + c' = 81094 milliseconds, i = 100000002011.04.1515:30:24123 (EURUSD,D1) time for'StringAdd()' = 85828 milliseconds, i = 100000002011.04.1515:31:46123 (EURUSD,D1) time for'StringConcatenate(d,a,b,c)' = 81812 milliseconds, i = 100000002011.04.1515:33:36123 (EURUSD,D1) time for'd = a + b + c' = 82938 milliseconds, i = 100000002011.04.1515:35:00123 (EURUSD,D1) time for'StringAdd()' = 83859 milliseconds, i = 100000002011.04.1515:36:21123 (EURUSD,D1) time for'StringConcatenate(d,a,b,c)' = 80719 milliseconds, i = 10000000
不思議ですね。MQL5用のコードが必要ですが、すでにウェブサイトに掲載されているはずです。調べるだけでいいんです。まさにその通りです。
でも、それはあなた次第です。
とても面倒な検索です、もしかしたら誰かが教えてくれるかもしれません。
ちなみに、このコードはmql5用に作り直しました。もしかしたら、誰かが使ってくれるかもしれない。
をコメントしてください。
enum_trade_return_codes
コード ID 説明
10004 TRADE_RETCODE_REQUOTE リクエストが拒否されました。
10006 TRADE_RETCODE_REJECT リクエスト拒否
...
コード10005はありません。これはエラーではないのでしょうか?
謹んで ...
質問です。GetTickCount() という関数があり、システムが起動してから経過したミリ秒数を返します。注意書き には、「システムタイマーの分解能によってカウントが制限 される」とあります。時刻は符号なし整数で保存されているので、コンピュータを連続稼働させると49.7日ごとにオーバーフロー する」。
また、カウンターがオーバーフローした後はどうなるのでしょうか?リセットされて新しいカウントダウンが始まったり、システムがフリーズしたりしませんか?
Yedelkin:
カウンターがオーバーフローするとどうなるのでしょうか?リセットされて新しいカウントが始まるのか、それともシステムがフリーズするのか?
オーバーフローして、ゼロからスタートする。
質問です。switch(expression){...}の説明には、「switch 演算子の式は 整数型でなければ ならない」と書かれています。 この演算子を他の型の式で表現する記述をネットで見たことがあります。文字列型の式を追加することで、switch演算子の用途は広がるのでしょうか?
質問です。switch(expression){...}の説明には、「switch 演算子の式は 整数型でなければ ならない」と書かれています。 この演算子を他の型の式で表現する記述をネットで見たことがあります。文字列型の式を追加することで、switch演算子の使い方を拡張するのでしょうか?
いいえ、残念ながら、そうではありません。文字列型の場合のみ、...でなければでなければ
switch で整数型を 使用すると、switch オペレータの動作が数倍速くなります。
いいえ、残念ながらそうではありません。文字列型の場合のみ、 ...でなければさもなくば
switchで整数型を 使用すると、以下のように数倍高速化されます。
質問です。StringConcatenate() 関数の説明には、「StringConcatenate()は、 文字列型の 一時変数を使用しないため、加算操作による文字列連結よりも高速でメモリ使用量も少なく動作する」と書かれています。リファレンスマニュアルに掲載されている例を少し変えて使ってみました。
と出力されます。StringConcatenateは 加算演算を用いた文字列結合よりも動作が遅いことが判明した。何が問題なのか?
質問です。StringConcatenate() 関数の説明には、「StringConcatenate()は、 文字列型の 一時変数を使用しないため、加算操作による文字列連結よりも高速でメモリ使用量も少なく動作する」と書かれています。リファレンスにある例を、少し変えて使ってみました。
出力されました。StringConcatenateは 加算演算を用いた文字列結合よりも動作が遅いことが判明した。何が引っかかるのか?
チェックというと語弊がありますが、(私の理解が正しければ)。機能の仕掛けは別にあるのですが...。
このコードについて
そしてこの結果
追記
もっとも、d= ""の行はforループに入れるべきでしたが、このバグは結果にあまり影響しないと思います。