MQL5におけるOOPに関する質問 - ページ 69 1...626364656667686970717273747576...96 新しいコメント Igor Makanu 2020.05.30 10:24 #681 fxsaber: 予想外の結果になってしまいました。 imho、テストは比較にならない STRUCT2 は、コンストラクタ STRUCT2 は文字列 MQL で実装されている文字列に関するドキュメントがないため、https://www.mql5.com/ru/forum/1111/page2732#comment_16181920 について説明しました。 すなわち、あなたのテストでは、STRUCT2 はコンストラクタを持つクラスとして動作し、コンストラクタを持つ「文字列クラス」を持ち、実質的にオブジェクトのメモリを何度も確保していることになります。 このような複雑なテストは、STRUCT1とSTRUCT2の構造体を作成する時間と、データにアクセスする時間に分けて行う必要があると思います。 文字列にアクセスしてからメモリを確保すると書いた開発者もいました - あなたの例では、文字列は定数文字で初期化されているので、どうやって初期化しているのかわかりません - コンパイラは、アクセスする前に文字列を初期化しない(メモリを確保しない)可能性もあります fxsaber 2020.05.30 12:06 #682 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 単純な構造体の最初のフィールドへのアクセスが、そのサイズに依存する理由は明らかではありません。 Artyom Trishkin 2020.05.30 12:14 #683 fxsaber: 悩む気にもならない。シンプルな構造を作りました。 単純な構造体の最初のフィールドへのアクセスが、そのサイズに依存する理由は明らかではありません。 この質問は、該当するブランチの開発者にするのがよいでしょう。テストコード付き。説明するのか、修正するのか、何も言わないのか......ここで通用するのは、おそらく3番目のバリエーションだけでしょう。 fxsaber 2020.05.30 12:17 #684 Artyom Trishkin: これは、該当するブランチの開発者に質問するのが一番です。テストコードで説明するのか、修正するのか、何も言わないのか...。ここでは、3つ目の選択肢しかないでしょう。 私のMT5は、あまりにも冒涜的なことを引き起こすようになりました。致命的なバグがある。これはデタラメだ。 Igor Makanu 2020.05.30 12:26 #685 fxsaber: 悩む気にもならない。簡単な構造を作ってみました。 今度は同じSTRUCT1とSTRUCT3のテストです。 fxsaber:単純な構造体の最初のフィールドへのアクセスが、なぜそのサイズに依存するのか理解できない。 これではただの当て馬だ。 もし大きな違いがあれば、それはMQLのメモリ割り当ての 実装が悪いということです。 テスト1とテスト2がほぼ同じであれば、Windowsがこの方法でメモリを割り当てています。 Artyom Trishkin 2020.05.30 12:35 #686 fxsaber: 私のMT5は、あまりにも冒涜的なことを引き起こすようになりました。致命的なバグがある。これはデタラメだ。 すべてのバグを報告することをお勧めします。クリティカルとそうでないものもちろん無感動です :) Igor Makanu 2020.05.30 13:05 #687 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 結果は似ている - 行動は同じだ Questions on OOP in VPS not working Expert Advisor <ALL DISCUSSIONS Vladimir Simakov 2020.05.30 13:27 #688 広告を入れ替えてみてください。 どれが一番上にあるかは関係ないのでは? fxsaber 2020.05.30 13:32 #689 Artyom Trishkin: バグはすべて報告することが望ましい。クリティカルかどうか。もちろん無感動に :) 詳細なブランチが作成されました。 Igor Makanu 2020.05.30 13:34 #690 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 私には何の違いもないように見えますが。 Questions on OOP in Can EA's with Time Synchronise Windows local time 1...626364656667686970717273747576...96 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
予想外の結果になってしまいました。
imho、テストは比較にならない
STRUCT2 は、コンストラクタ
STRUCT2 は文字列
MQL で実装されている文字列に関するドキュメントがないため、https://www.mql5.com/ru/forum/1111/page2732#comment_16181920 について説明しました。
すなわち、あなたのテストでは、STRUCT2 はコンストラクタを持つクラスとして動作し、コンストラクタを持つ「文字列クラス」を持ち、実質的にオブジェクトのメモリを何度も確保していることになります。
このような複雑なテストは、STRUCT1とSTRUCT2の構造体を作成する時間と、データにアクセスする時間に分けて行う必要があると思います。 文字列にアクセスしてからメモリを確保すると書いた開発者もいました - あなたの例では、文字列は定数文字で初期化されているので、どうやって初期化しているのかわかりません - コンパイラは、アクセスする前に文字列を初期化しない(メモリを確保しない)可能性もあります
このような複雑なテストは、いくつかのテストに分けるべきと思います。
悩む気にもならない。シンプルな構造を作りました。
単純な構造体の最初のフィールドへのアクセスが、そのサイズに依存する理由は明らかではありません。
悩む気にもならない。シンプルな構造を作りました。
単純な構造体の最初のフィールドへのアクセスが、そのサイズに依存する理由は明らかではありません。
この質問は、該当するブランチの開発者にするのがよいでしょう。テストコード付き。説明するのか、修正するのか、何も言わないのか......ここで通用するのは、おそらく3番目のバリエーションだけでしょう。
これは、該当するブランチの開発者に質問するのが一番です。テストコードで説明するのか、修正するのか、何も言わないのか...。ここでは、3つ目の選択肢しかないでしょう。
私のMT5は、あまりにも冒涜的なことを引き起こすようになりました。致命的なバグがある。これはデタラメだ。
悩む気にもならない。簡単な構造を作ってみました。
今度は同じSTRUCT1とSTRUCT3のテストです。
単純な構造体の最初のフィールドへのアクセスが、なぜそのサイズに依存するのか理解できない。
これではただの当て馬だ。
もし大きな違いがあれば、それはMQLのメモリ割り当ての 実装が悪いということです。
テスト1とテスト2がほぼ同じであれば、Windowsがこの方法でメモリを割り当てています。
私のMT5は、あまりにも冒涜的なことを引き起こすようになりました。致命的なバグがある。これはデタラメだ。
すべてのバグを報告することをお勧めします。クリティカルとそうでないものもちろん無感動です :)
テスト1とテスト2がほぼ同じであれば、Windowsがメモリを割り当てる方法です。
で最後のテストを2回実行しました。
ターミナル MetaTrader 5 x64 build 2470 を MetaQuotes Software Corp.向けに開始しました。
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
すべてのファイルがスクリプトに添付されているわけではなく、最後の行がコンパイルされない
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
バグはすべて報告することが望ましい。クリティカルかどうか。もちろん無感動に :)
詳細なブランチが作成されました。
どちらがスタックの先頭にいるかは関係ないのでしょうか?
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