MQL5におけるOOPに関する質問 - ページ 69

 
fxsaber:
予想外の結果になってしまいました。


imho、テストは比較にならない

STRUCT2 は、コンストラクタ

STRUCT2 は文字列

MQL で実装されている文字列に関するドキュメントがないため、https://www.mql5.com/ru/forum/1111/page2732#comment_16181920 について説明しました。


すなわち、あなたのテストでは、STRUCT2 はコンストラクタを持つクラスとして動作し、コンストラクタを持つ「文字列クラス」を持ち、実質的にオブジェクトのメモリを何度も確保していることになります。

このような複雑なテストは、STRUCT1とSTRUCT2の構造体を作成する時間と、データにアクセスする時間に分けて行う必要があると思います。 文字列にアクセスしてからメモリを確保すると書いた開発者もいました - あなたの例では、文字列は定数文字で初期化されているので、どうやって初期化しているのかわかりません - コンパイラは、アクセスする前に文字列を初期化しない(メモリを確保しない)可能性もあります

 
Igor Makanu:

このような複雑なテストは、いくつかのテストに分けるべきと思います。

悩む気にもならない。シンプルな構造を作りました。

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

// Простая структура.
struct STRUCT1
{
  int i;
  double j[2];
};

// Простая структура большего размера.
struct STRUCT3
{
  int i;
  double j[10];
};

template <typename T>
int Func( T &Array[] )
{  
  // Write
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Array[i].i = i;

  int Sum = 0;
  
  // Read
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Sum += Array[i].i;
    
  return(Sum + ArraySize(Array));    
}

#include <Debug.mqh>

void OnStart()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT3 Array3[]; // Простая структура большего размера.
  
  const int Amount = 5 e7;
  
  Print(_B(ArrayResize(Array1, Amount), 1));
  Print(_B(ArrayResize(Array3, Amount), 1));
      
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры
  Print(_B(Func(Array3), 1)); // зависит от ее размеров.
  
  _P2(sizeof(STRUCT1));
  _P2(sizeof(STRUCT3));
}


        50000000
        50000000
        Alert: Time[Test6.mq5 280: Func(Array1)] = 312 ms.
        1333106752
        Alert: Time[Test6.mq5 281: Func(Array3)] = 1348 ms.
        1333106752
        : sizeof(STRUCT1) = 20
        : sizeof(STRUCT3) = 84


単純な構造体の最初のフィールドへのアクセスが、そのサイズに依存する理由は明らかではありません。

 
fxsaber:

悩む気にもならない。シンプルな構造を作りました。



単純な構造体の最初のフィールドへのアクセスが、そのサイズに依存する理由は明らかではありません。

この質問は、該当するブランチの開発者にするのがよいでしょう。テストコード付き。説明するのか、修正するのか、何も言わないのか......ここで通用するのは、おそらく3番目のバリエーションだけでしょう。

 
Artyom Trishkin:

これは、該当するブランチの開発者に質問するのが一番です。テストコードで説明するのか、修正するのか、何も言わないのか...。ここでは、3つ目の選択肢しかないでしょう。

私のMT5は、あまりにも冒涜的なことを引き起こすようになりました。致命的なバグがある。これはデタラメだ。

 
fxsaber:

悩む気にもならない。簡単な構造を作ってみました。

今度は同じSTRUCT1とSTRUCT3のテストです。

fxsaber:

単純な構造体の最初のフィールドへのアクセスが、なぜそのサイズに依存するのか理解できない。

これではただの当て馬だ。

もし大きな違いがあれば、それはMQLのメモリ割り当ての 実装が悪いということです。

テスト1とテスト2がほぼ同じであれば、Windowsがこの方法でメモリを割り当てています。

 
fxsaber:

私のMT5は、あまりにも冒涜的なことを引き起こすようになりました。致命的なバグがある。これはデタラメだ。

すべてのバグを報告することをお勧めします。クリティカルとそうでないものもちろん無感動です :)

 
Igor Makanu:

テスト1とテスト2がほぼ同じであれば、Windowsがメモリを割り当てる方法です。

で最後のテストを2回実行しました。

ターミナル MetaTrader 5 x64 build 2470 を MetaQuotes Software Corp.向けに開始しました。

Windows 10 ビルド 18363、Intel Core i3-4170 @ 3.70GHz、8/11GB メモリ、188/297GB ディスク、IE 11、UAC、GMT+4

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 53:ArrayResize(Array1,Amount)] = 1 ms.が発生しました。

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.が表示されました。

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 56: Func(Array1)] = 512 ms.が表示されました。

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 57: Func(Array3)] = 2218 ms.が表示されました。

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 53: ArrayResize(Array1,Amount)] = 2 ms.が表示されます。

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 9 ms.

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 56: Func(Array1)] = 552 ms.が発生しました。

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 57: Func(Array3)] = 1888 ms.が表示されました。

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) 1333106752


すべてのファイルがスクリプトに添付されているわけではなく、最後の行がコンパイルされない

  //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));

Debug.mqhをインクルードしていたのですが


UPD: 古いビルドでテストを実行しました。

2020.05.30 17:17:27.604 Terminal MetaTrader 5 - build 2361



2020.05.30 17:13:17.046 tst (EURUSD,H1) Alert: Time[tst.mq5 53: ArrayResize(Array1,Amount)] = 1 ms.が表示されました。

2020.05.30 17:13:17.047 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.053 tst (EURUSD,H1) Alert: Time[tst.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.が表示されました。

2020.05.30 17:13:17.053 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.563 tst (EURUSD,H1) Alert: Time[tst.mq5 56: Func(Array1)] = 510 ms.が表示されました。

2020.05.30 17:13:17.563 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:19.416 tst (EURUSD,H1) Alert: Time[tst.mq5 57: Func(Array3)] = 1852 ms.が発生しました。

2020.05.30 17:13:19.416 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:28.971 tst (EURUSD,H1) Alert: Time[tst.mq5 53: ArrayResize(Array1,Amount)] = 2 ms.が表示されました。

2020.05.30 17:13:28.971 tst (EURUSD,H1) 50000000

2020.05.30 17:13:28.977 tst (EURUSD,H1) Alert: Time[tst.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.が表示されました。

2020.05.30 17:13:28.977 tst (EURUSD,H1) 50000000

2020.05.30 17:13:29.456 tst (EURUSD,H1) Alert: Time[tst.mq5 56: Func(Array1)] = 478 ms.が発生しました。

2020.05.30 17:13:29.456 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:31.192 tst (EURUSD,H1) Alert: Time[tst.mq5 57: Func(Array3)] = 1735 ms.が発生しました。

2020.05.30 17:13:31.192 tst (EURUSD,H1) 1333106752

結果は似ている - 行動は同じだ
 
広告を入れ替えてみてください。 どれが一番上にあるかは関係ないのでは?
 
Artyom Trishkin:

バグはすべて報告することが望ましい。クリティカルかどうか。もちろん無感動に :)

詳細なブランチが作成されました。

 
Vladimir Simakov:
どちらがスタックの先頭にいるかは関係ないのでしょうか?
void OnStart()
{
  STRUCT3 Array3[]; // Простая структура большего размера.
  STRUCT1 Array1[]; // Простая структура.
  
  
  const int Amount = 5 e7;
  
  Print(_B(ArrayResize(Array3, Amount), 1));
  Print(_B(ArrayResize(Array1, Amount), 1));
  
      
  Print(_B(Func(Array3), 1)); // зависит от ее размеров.
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры
  
  //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));
}

2020.05.30 17:33:07.892 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 54:ArrayResize(Array3,Amount)] = 6 ms.が表示されました。

2020.05.30 17:33:07.955 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 55: ArrayResize(Array1,Amount)] = 1 ms.が表示されました。

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 58: Func(Array3)] = 1945 ms.が発生しました。

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 59: Func(Array1)] = 450 ms.が表示されました。

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) 1333106752

私には何の違いもないように見えますが。