defineの専門家に質問 - ページ 7

 
Alexandr Andreev:

あなたはコードに何も混ぜていません、誰があなたのために値を変更するのですか?

というように、最初のバージョンと同じように

はい、その点を見逃していました。私の投稿を修正しました。

 
Valeriy Yastremskiy:

そこにはランダムな結果がある。コンパイルは、アレイサイズの値でメモリセルへのアクセスを展開し、アレイが動的であってもアレイを形成する際に、あらかじめアレイサイズを取得してメモリセルに配置し、アレイサイズと変数値を持つセルは同じアクセス時間を持つことになります。

そして、3~4年のコンピュータサイエンスコースでコンパイラが行うフレーズから判断すると・・・。一般的には、十分に必要なレベルの人材がいれば、MCLの環境でもあまり神経質になることはないだろうと思っています)

ゼロの経験があるので、平均的な学生は通常FIVTはプラスでちょうどゼロです)、経験なしの知識はすぐにどこにも行かない(忘れて)、そして彼らの例は非常に奇妙であり、学生がどこで、どのように使用することができます理解する前に、それは何年もかかります信じています。これは、経験豊富なプログラマーと比較した場合です。

 
Alexandr Andreev:

なぜなら、経験値がゼロであり、経験値のない知識はすぐにどこかに行ってしまう(忘れてしまう)し、彼らの例はとても奇妙で、学生がどこでどのように使えるかを理解するまでに何年もかかるからです。これは、経験豊富なプログラマーと比較した場合です。

それは理解できる。なぜコンパイラの作り方を教えなければならないのか、理解できない。言語がクラスであることは明らかですが、すべての鳥がアプリオリに飛べるわけではないのです。さて、前述したように、Errors, Bugs, Questionsは、コンパイルをその場で最適化する問題にも関連します。

 

このトピックは、ループではなく、定義についてです ))

しかし、私はまだ理解していません、例えばユーザー定義関数のようなコードを定義することに意味があるのでしょうか。
実行ファイルにおいて、デファクトスタンダードコードがより速く実行されることを期待して。
それとも誤解なのか?なぜなら、置換はあくまでコンパイル前の動作であり、ビルドを高速化するためだけに意味を持つからです。

 
Roman:

このトピックは、ループではなく、定義についてです ))

しかし、私はまだ理解していません、例えばユーザー定義関数のようなコードを定義することに意味があるのでしょうか。
実行ファイルにおいて、デファクトスタンダードコードがより速く実行されることを期待して。
それとも誤解なのか?なぜなら、置換はあくまでコンパイル前の動作であり、ビルドを高速化するのは理にかなっているからです。

先ほど、3つの外部関数を 使用する例を示しましたが...。展開された形に対してだから、加速度もないでしょう。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

defineの専門家に質問です。

アレクサンドル・アンドレフ さん 2020.11.02 19:49

void OnStart()
  {
   int mas[];
   int size=1000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100;
   uint t1=GetTickCount();
   int t=0;
   int tr=0; 
   MathSrand(10);
   for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); Funk(i))
        { 
         FunkRand(r1); 
         Funk(r);// мы сюда написали вызов еще одной функции чтобы усложить ситуацию
        }
     }
   tr=r;
   uint t2=GetTickCount();
   for(ulong z=0; z<max; z++)
     {
     int v=size;
      for(ulong i=0; i<v; i++)
        { 
         r2+=rand();
         r--;
        }

     }

   uint t3=GetTickCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",t1," ",tr);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk(ulong &a){a++;}
void FunkRand(ulong &a){a+=rand();}

//+------------------------------------------------------------------+

500pの問題(確認せず)どちらが速いか、上位メソッドで外部関数が いくつ呼び出されているかを見る


Документация по MQL5: Основы языка / Функции / Описание внешних функций
Документация по MQL5: Основы языка / Функции / Описание внешних функций
  • www.mql5.com
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 
Alexandr Andreev:

3つの外部 機能を使用する例をあげましたが...。展開された形に対してだから、加速度もないでしょう。


なるほど。では、fxsaberさん、こんにちは。何でもかんでも脱税するのが好きな奴。


Alexandr Andreev:

証明してくれ)

というのも、私のテストでは、なぜか同じになってしまうのです。

ArraySize()と変数については。それでも私は、この問いに戻る。
以下は、テストで変更した点です。ループはPIの数をカウントしています。
最初のサンプルでは、ループの条件としてArraySize()を使用しています。
2番目の例では、変数num_stepsが使用されています。
違いがあるんです。

ArraySize()関数

void OnStart()
{
    int arr[];
    int num_steps = ArrayResize(arr, 1000000000);

    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
    ulong t = GetMicrosecondCount();
    
    for (int i = 0; i<ArraySize(arr); i++)
    {
       x = (i + .5) * step;
       sum = sum + 4.0 / (1.0 + x * x);
    }
    
    pi = sum*step;
        
    t = GetMicrosecondCount() - t;
   
   printf("The value of PI is %1.12f ", pi);
   PrintFormat("Total time to calculate PI was %5.3f ms\n", t / 1000.0);
}

台本は3本。

2020.11.02 23:56:51.556 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11.02 23:56:51.556 TestScript (USDJPY,M1)  Total time to calculate PI was 4049.179 ms
2020.11.02 23:56:51.556 TestScript (USDJPY,M1)  
2020.11.02 23:56:57.928 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11.02 23:56:57.928 TestScript (USDJPY,M1)  Total time to calculate PI was 4183.364 ms
2020.11.02 23:56:57.928 TestScript (USDJPY,M1)  
2020.11.02 23:57:03.884 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11.02 23:57:03.884 TestScript (USDJPY,M1)  Total time to calculate PI was 4034.098 ms
        


num_stepsを変数とする。

void OnStart()
{
    int arr[];
    int num_steps = ArrayResize(arr, 1000000000);

    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
    ulong t = GetMicrosecondCount();
    
    for (int i = 0; i<num_steps; i++)
    {
        x = (i + .5) * step;
        sum = sum + 4.0 / (1.0 + x * x);
    }
    
    pi = sum*step;
        
    t = GetMicrosecondCount() - t;
   
   printf("The value of PI is %1.12f ", pi);
   PrintFormat("Total time to calculate PI was %5.3f ms\n", t / 1000.0);
}

台本は3本。

2020.11.03 00:08:09.269 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11.03 00:08:09.271 TestScript (USDJPY,M1)  Total time to calculate PI was 3955.325 ms
2020.11.03 00:08:09.271 TestScript (USDJPY,M1)  
2020.11.03 00:08:15.578 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11.03 00:08:15.578 TestScript (USDJPY,M1)  Total time to calculate PI was 3950.568 ms
2020.11.03 00:08:15.578 TestScript (USDJPY,M1)  
2020.11.03 00:08:22.469 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11.03 00:08:22.469 TestScript (USDJPY,M1)  Total time to calculate PI was 3927.110 ms
        
 
Roman:

なるほど。では、fxsaberさん、こんにちは。全てを一列に並べて定義するファン。

ArraySize()と変数については。この質問には、また同じようにお答えします。
私が改造したテストはこちらです。ループはPIの数をカウントしています。
最初のサンプルでは、ループの条件としてArraySize() を使用しています。
2番目の例では、変数
num_stepsが使用されています。
違いがあるんです。

ArraySize()関数

台本は3本。


num_stepsを変数とする。

台本は3本。

この計算では明確な差はない。これを1つのコードにまとめてみたところ、結果はさまざまで、最初のバリアントが勝つものもある

)) µl の任意の配列は、配列の現在のサイズを担当する変数を持っているので、ほとんどの言語では。

ArraySize関数は、この変数の値を返すようにコンパイラに指示する、つまり、この関数の代わりにこの変数を代入する。 μl配列は参照できないので、ポインタは明示的にこの変数、つまりメモリ上のクロセットアドレスの右側に置かれる。技術的には、これらのテストはすべて、2つの通常の変数を比較する試みである。この例では、4つの関数が0つの関数を許し、そのうちの3つがループ本体の中にある。つまり、400000000回の関数呼び出しと、何もない場合の比較ができる。そして、小さすぎて気づかないような暗黙の差を見ることになるのですが、それは、実行ファイルにコードを入れているから......。同じものを比較しているのです。

そして、これらの計算は、複雑になればなるほど、意味をなさなくなるのです。

一つのケースで100個の関数、関数の中の関数を呼び出すような例を挙げるとわかりやすいでしょう。そして、もう一方では、これらすべてを拡大した形で、何の違いもないでしょう。ArraySize(mas)==mas[]なので。大きさ

Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
"Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)"
 

πの例では、なぜかオーバーシュートの頻度に差があるのですが、(再掲)これは純粋にランダムなオーバーシュートですが。

で、10億出力あたり1msに等しいのですが、これは明示的に変数と変数の比較を試したわけではなく、スプレッドがさらに大きくなったためです)))


 
Alexandr Andreev:

この計算では明確な差はない。1つのコードにまとめると、結果はさまざまで、最初のオプションが勝つものもある

)) µl のすべての配列は,現在の配列サイズを担当する変数を持っているので,ほとんどの言語において.

ArraySize関数は、この変数の値を返すようにコンパイラに指示する、つまり、この関数の代わりにこの変数を代入する。 μl配列は参照できないので、ポインタは明示的にこの変数、つまりメモリ上のクロセットアドレスの右側に置かれる。技術的には、これらのテストはすべて、2つの通常の変数を比較する試みである。こ の例では、4つの関数が0つの関数を許し、そのうちの3つがループ本体の中にある。つまり、400000000回の関数呼び出しと、何もない場合の比較ができる。そして、小さすぎて気づかないような暗黙の差を見ることになるのですが、それは、実行ファイルにコードを入れているから......。同じものを比較して いるのです。

そして、これらの計算は、複雑になればなるほど、意味をなさなくなるのです。

一つのケースで100の関数、関数の中の関数を呼び出すような例を挙げるとわかりやすいでしょう......。そして、もう一方では、これらすべてを拡大した形で、何の違いもないでしょう。ArraySize(mas)==mas[] なので。大きさ

ループ本体で何が実行されるかは関係ない。これはあくまでテスト用の負荷です。
例では、ループ条件での関数や変数の参照を比較しています。

私はアセンブラではありませんが、アセンブラ命令の観点からすると、同じものではないと思います。
それもクラスで包まれているとしたら、確かに同じではないですね。

関数は、メモリセルから値を取得するための追加命令を持っています。つまり、関数はメモリセルを呼び出して値を取得し、その結果のみを返します。
変数はすでにこの値を持っており、変数はどこも参照せず、すぐに結果を返します。

 
Roman:

サイクルの本体で何を実行するかは問題ではない。テストのための負荷に過ぎない。
例では、ループ条件での関数や変数の参照を比較しています。

私はアセンブラの専門家ではありませんが、アセンブラ命令の観点からは、同じものではないと思います。
それもクラスで包まれているとしたら、確かに同じではないですね。

関数は、メモリセルから値を取得するための追加命令を持っています。つまり、関数はメモリセルを呼び出して値を取得し、その結果のみを返します。
変数はすでにその値を持っていて、変数はどこも参照せず、すぐに結果を返します。

) まあ、そういうわけにもいかないのですが)

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=100000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2=r2/10;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<v; i++)
        { 
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1=r1/10;
        }
     }
   
   int pi2 = sum*step;
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",pi," ",pi2);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk(ulong &a){a++;}
void FunkRand(ulong &a){a+=rand();}

//+------------------------------------------------------------------+

ほぼ毎回のようにトップが入れ替わる

一番長いのは分割です)))

理由: