2016年6月8日水曜日

【EA高速化】バックテスト時間を短くしよう IFの複数条件は分けたほうがいいか?

EAを作るのに欠かせないのは if ですね!!
if の複数条件についてはこのような話を聞きます。

if( 条件A && 条件B ){~} は条件Aが偽の時(false、条件があっていない時)でも条件Bを確認するのでif( 条件A ){ if ( 条件B ){~}}のほうが早いというものです。

下の場合は条件Aが真でないと条件Bを確認しません。

これも理にかなっています。


//EA if AND君
int A=3,B=6,C,t;
void OnTick()
  {
  t=GetMicrosecondCount();
  for(int i=0;i<1000000;i++)
    {  
    if( A == 4 && B == 6){C=1;}
    }
  Comment(GetMicrosecondCount()-t);
  }

// EA ifif君

int A=3,B=6,C,t;
void OnTick()
  {
  t=GetMicrosecondCount();
  for(int i=0;i<1000000;i++)
    {  
    if( A == 4 )
      {
      if( B == 6 ){ C=1; }
      }
    }
  Comment(GetMicrosecondCount()-t);
  }

始めに A=3; としているのにifの中でA==4としていますので偽、false、条件はあっていません
 
IFAND君は&&で並列処理をしています。
ifif君は分けています。私もいつもこちらにしています。



やはりifif君のほうが早いですね。
今回は100万回ループしていますのでif一回当たり0.371ms早いことになります。
1回/一分を10年で1.3ms全ティックだと0.069秒早くなります・・・

条件Aが真で条件Bが偽の時はいかがでしょう


ifif君が負けています。0.021msわずかですが遅いですね。
IF二回の処理時間でしょうか。

両方が真の時はどうでしょうか?
予想は上と同じです。

ifif君 大差0.920ms差で負けています。
しばらく観察していても0.数ms程度の遅いですね。

両方偽の時はいかがでしょう




0.400ms ifif君が速いですね。

ソースコードは&&を使用するほうが圧倒的に見やすくなります。
真になりやすいほうを前に持っていき&&を使用するほうが速いという事ですね。
両方偽が多い時はIFIFのやり方が速いようです。

IFの複数条件100個を全ティック10年で7秒です
ソースの見やすい&&使用がいいようですね!!











0 件のコメント:

コメントを投稿