記事"EX5 ライブラリ使用による開発プロジェクトの促進"についてのディスカッション

 

新しい記事 EX5 ライブラリ使用による開発プロジェクトの促進 はパブリッシュされました:

.ex5 ファイルにクラス/関数の実装詳細を非表示にすることでノウハウアルゴリズムを他の開発者と共有し、共通のプロジェクトを設定し、ウェブ上でそれらを進めていくことができるようになります。そして MetaQuotes チームが ex5 ライブラリクラスの直接継承機能を実現することに全力を傾ける一方で、われわれはそれをいますぐ実装していこうとしているのです。

ライブラリクラスメソッドに連携するためのスキーム

作者: o_O

 
もちろん、ノウハウ関数をメインに開発するのであれば、事前にISuperClass ラッパーを作成する必要はありません。ノウハウ関数をエクスポートし、サードパーティのプログラマに独自のラッパー・クラスを作成させれば十分です。

アイ・マラディッツァ、小便を漏らして、自分で訂正して、こちらが調子が悪いのにまたプラグイン。

一年前、私もこれに悩まされていた。障害? いや、何もない。休み明けの気分かもしれないけど.:(

ライブラリ関数を呼び出すコストは、ネイティブ・クラスの関数を呼び出すコストと比べてどうなんだろう?

単なるラッパーではなく、くしゃみをするたびにライブラリを呼び出さなければならない。

 
Urain:

よかったな、小便もしたし、怪我も直ったし。

実際、ここはそれほど悪くない。

いい記事だ。僕はいつもリブを使っている。

いつになったらユニバーサル・メガニューロンができるんだ?

 

Urain:

ライブラリ関数を 呼び出すコストは、ネイティブ・クラスの関数を呼び出すコストと比べてどうなのか?

調べてみましたが、違いはありませんでした。

このインポートまたはインクルード時のTest empty関数の呼び出しは、時間に影響しません。

/*
#import "Graph.ex5"
 void Test(long achart,string name,int awnd,int ax,int ay,color aclr);
#import
*/.
#include "Graph.mq5"
void OnStart()
{
  long a=GetTickCount();
  for (int i=0; i<1000000; i++) 
  {
    Test(0, "qwe", 0, 10, 10, clrRed);
  }
  Print(string(GetTickCount()-a));
}
 
TheXpert:

実は、ここはそれほど悪くない。

この記事はポイントをついている。私はいつもリブを使っている。コードを適切に分離する唯一の方法だ。

普遍的なメガニューロンはいつできるのか?

あなたのはいつ?

率直に言って、私はもう少しあなたの投稿を読んで、MT5を完全にあきらめます。

どこを向いてもすべてがめちゃくちゃで、「路面電車を走らせようとしている」なんて、心の芯からうんざりしているんだ。)

Neuronkaはどこかに転がっている、もしあなたが真剣に座る気分でいるなら、仕事の形見が残っているが、気分はない。

 
sergeev:

確認しましたが、特に違いはありませんでした。

インポートやインクルード時に空のテストを呼び出しても、時間には影響しない。

言われるように、違いを感じてください:

2012.01.06 16:46:28 電卓(EURUSD,H1) empty=281

2012.01.06 16:46:28 電卓 (EURUSD,H1) lib=2344

//+------------------------------------------------------------------+
//|テストmq5
//+------------------------------------------------------------------+
#property library
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr) export
   {
    awnd=ax+ay;
   }
//+------------------------------------------------------------------+


#import "Test.ex5"
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr);
#import

void OnStart()
  {
   int res=0;
   long a=GetTickCount();
   for(int i=0; i<100000000; i++)
     {
      Test(0,"qwe",res,10,10,clrRed);
     }
   Print(「liba=",string(GetTickCount()-a));
   
   a=GetTickCount();
   for(int i=0; i<100000000; i++)
     {
      res=10+10;
     }
   Print(「empty=",string(GetTickCount()-a));   
  }
 
Urain:

曰く、「違いを感じろ」:

いや、関数の呼び出しについて尋ねて いるんだろう?

それとも、ループの実行速度を確認したかったのですか?

単純な関数呼び出しとex5バイブルからの呼び出しの違いをチェックしました。 関数呼び出しのスピードに違いはありません。


関数呼び出しのない空のループの方が速く動くのは明らかだ。

 
sergeev:

いや、関数呼び出しについて尋ねて いるのだろう?

それとも、ループの実行速度全般を確認したかったのですか?

単純な関数呼び出しとex5バイブルからの呼び出しの違いをチェックした。 関数呼び出しのスピードに違いはない。


関数呼び出しのない空のループの方が速く動くのは明らかです。

ループは同じであり、ループ内で実行されるアクションも同じである(ループ内で直接実行される場合もあれば、関数内で実行される場合もある)。

実験の純度を高めるために、同様の関数をファイルに直接記述してみよう:

2012.01.06 17:18:39 Calculator (EURUSD,H1) empty=281
2012.01.06 17:18:38 Calculator (EURUSD,H1) lib=2281

//+------------------------------------------------------------------+
//|テストmq5
//+------------------------------------------------------------------+
#property library
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr) export
   {
    awnd=ax+ay;
   }
//+------------------------------------------------------------------+
#import "Test.ex5"
void Test(long achart,string name,int &awnd,int ax,int ay,color aclr);
#import

void Testlocal(long achart,string name,int &awnd,int ax,int ay,color aclr)
   {
    awnd=ax+ay;
   }

void OnStart()
  {
   int res=0; int count=100000000;
   long a=GetTickCount();
   for(int i=0; i<count; i++)
     {
      Test(0,"qwe",res,10,10,clrRed);
     }
   Print(「liba=",string(GetTickCount()-a));
   
   a=GetTickCount();
   for(int i=0; i<count; i++)
     {
      Testlocal(0,"qwe",res,10,10,clrRed);
     }
   Print(「empty=",string(GetTickCount()-a));   
  }

エラーを除外するために、ループの長さを1つの変数カウントから書き直したが、結果は同じだった。

 

4.5回

2012.01.06 17:28:33 test(EURUSD,D1) ex5=2047
2012.01.06 17:28:31 test (EURUSD,D1) local=438

 
sergeev:

4.5回

2012.01.06 17:28:33 test (EURUSD,D1) ex5=2047
2012.01.06 17:28:31 test (EURUSD,D1) local=438

アレックス......これだけでは不十分ですか?

4回、2回など。

聖書に基づいて聖書を書き始めたら、ブレーキは雪だるま式に大きくなるだろう。

このスキームは、バイブル自体がバイブルコールを使用しない場合に使用できる。

 

上記の例の速度の違いは、一方のケースではコード・オプティマイザがこのような単純な関数を完全にオーバーインライン化し、関数呼び出しそのものさえも完全に除外したのに対し、もう一方のケースでは外部関数を 素直に呼び出さざるを得なかったことによる。

テストでは、コード・オプティマイザの不可避的な影響を常に考慮する必要がある。このループの例は、ローカル関数の場合、まともなコンパイラではres=100;に縮退する。

インライン化を避けるために呼び出される関数を大きくして、もう一度テストしてみてください。