MQL5におけるOOPに関する質問 - ページ 88 1...81828384858687888990919293949596 新しいコメント Koldun Zloy 2020.07.26 06:04 #871 Igor Makanu: 同じ値でも、テストの速度はなぜか「浮く」けど、メソッドのパラメータを 参照渡し した方がまだ効率がいい それから、こんな選択肢もあります。 class E { double f1( double a, double b ) { return(a + 1.0/(1.0+(double)rand())); } double f2( double a, double b ) { return(b + 1.0/(1.0+(double)rand())); } double f3( double a, double b ) { return(a/b + 1.0/(1.0+(double)rand())); } public: double calc( const MqlTick& tick ) { return f1( tick.ask, tick.bid ) + f2( tick.ask, tick.bid ) + f3( tick.ask, tick.bid ); } }; Igor Makanu 2020.07.26 06:20 #872 Koldun Zloy:それから、こんな選択肢もあります。 2020.07.26 10:10:52.254 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141 2020.07.26 10:11:30.261 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000 2020.07.26 10:12:08.258 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38000 2020.07.26 10:12:46.254 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38000 2020.07.26 10:13:24.279 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38031 2020.07.26 10:14:10.484 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46203 2020.07.26 10:14:48.570 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078 2020.07.26 10:15:26.737 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38172 2020.07.26 10:16:04.734 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38000 2020.07.26 10:16:42.739 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38000 2020.07.26 10:17:28.886 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141 2020.07.26 10:18:06.894 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38015 2020.07.26 10:18:44.888 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38000 2020.07.26 10:19:22.948 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38047 2020.07.26 10:20:00.983 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38047 変わり映えしない UPD: もし私が間違っていなければ、何年か前にMT4で間違いを探しました - 関数に引数を参照で渡さず、関数本体の 引数の1つを変更しました(間違えました)。 Questions on OOP in Flexible Time Charts for Reversal Magic trading system Koldun Zloy 2020.07.26 06:25 #873 Igor Makanu: 不思議なことに、違いはないんです。 何も不思議なことはないんです。doubleは8バイト、リファレンスも8バイトです。しかし、リファレンスはまだ8バイトの数字を取得する必要があります。 Igor Makanu 2020.07.26 06:31 #874 Koldun Zloy:何も不思議なことはないんです。doubleは8バイト、リファレンスも8バイトです。しかし、リンクはまだ8バイトの番号を取得する必要があります。 それは理にかなっていて、数字を足すとあっちが8、こっちが8となる )) しかし、プロセッサのバスは8ビットではないので、1クロックあたり8バイト=64ビットを読み取る必要があるのでは? Koldun Zloy 2020.07.26 06:47 #875 Igor Makanu:というのは理にかなっていて、数字を足すとあっちが8、こっちが8となります ))しかし、プロセッサのバスは8ビットではないので、1クロックあたり8バイト=64ビットを読み取ることになっているのでしょうか? そこはそんなに単純な話ではない。速度は、オブジェクトがどのメモリにあるかという理由と、その他の理由の両方に依存します。 実際のプログラムでは、単純なテストの結果とは大きく異なることがあります。 通常、クラスや構造体は参照渡しです。 単純な型は、それによって何らかの値が返される場合にのみ参照渡しされる。 Igor Makanu 2020.08.05 20:43 #876 この構造体が関数の結果として返される場合でも、構造体フィールドにアクセス できることに驚きました このコードは正しく動作します (関数内で構造体を埋めてから、関数の結果をバイト配列にコピーしています)。 struct UcharArray { uchar byte[]; }; //+------------------------------------------------------------------+ UcharArray f() { UcharArray result; for(uchar i = 0; i < 10; i++) { uchar tmp[1]; tmp[0] = i; ArrayCopy(result.byte, tmp, ArraySize(result.byte)); } return result; } //+------------------------------------------------------------------+ void OnStart() { uchar arr[]; for(int i = 0; i < 3; i++) { ArrayCopy(arr, f().byte, ArraySize(arr)); } ArrayPrint(arr); // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 } //+------------------------------------------------------------------+ このような構造体へのアクセスを利用すると便利です。どこに落とし穴があるのか、バグやエラーは? Alexandr Andreev 2020.08.05 20:49 #877 Igor Makanu:この構造体が関数の結果として返される場合でも、構造体フィールドにアクセス できることに驚きましたこのコードは正しく動作します (関数内で構造体を埋めてから、関数の結果をバイト配列にコピーしています)。このような構造体へのアクセスを利用すると便利です。落とし穴やバグ、エラーはどこにあるのか?こういうこと)) バグはないです。 ArrayCopy(arr, (f()).byte, ArraySize(arr))だから、より正確にはオペラからです(..)(..) また、バイト配列にコピーすることの意味もよくわかりません。返された構造体からデータにアクセスすることだけです Igor Makanu 2020.08.05 20:56 #878 Alexandr Andreev: これは、返された構造体のデータにアクセスするだけです。 そうなんですが、中間変数なしで、f()関数の結果に直接byteフィールドにアクセスしているのが紛らわしいです というわけで、キャッチボールをお待ちしております。 f().byte Alexandr Andreev 2020.08.05 21:00 #879 Igor Makanu:そうなんですが、中間変数なしで、f()関数の結果に直接byteフィールドにアクセスしているのが紛らわしいです。というわけで、キャッチボールをお待ちしております。 ここ数年、安定しています。 Igor Makanu 2020.08.05 21:03 #880 Alexandr Andreev:は、ここ数年、安定しています。 OK、ありがとうございます! 1...81828384858687888990919293949596 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
同じ値でも、テストの速度はなぜか「浮く」けど、メソッドのパラメータを 参照渡し した方がまだ効率がいい
それから、こんな選択肢もあります。
それから、こんな選択肢もあります。
2020.07.26 10:10:52.254 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141
2020.07.26 10:11:30.261 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000
2020.07.26 10:12:08.258 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38000
2020.07.26 10:12:46.254 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38000
2020.07.26 10:13:24.279 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38031
2020.07.26 10:14:10.484 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46203
2020.07.26 10:14:48.570 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078
2020.07.26 10:15:26.737 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38172
2020.07.26 10:16:04.734 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38000
2020.07.26 10:16:42.739 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38000
2020.07.26 10:17:28.886 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141
2020.07.26 10:18:06.894 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38015
2020.07.26 10:18:44.888 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38000
2020.07.26 10:19:22.948 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38047
2020.07.26 10:20:00.983 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38047
変わり映えしない
UPD: もし私が間違っていなければ、何年か前にMT4で間違いを探しました - 関数に引数を参照で渡さず、関数本体の 引数の1つを変更しました(間違えました)。
不思議なことに、違いはないんです。
何も不思議なことはないんです。doubleは8バイト、リファレンスも8バイトです。しかし、リファレンスはまだ8バイトの数字を取得する必要があります。
何も不思議なことはないんです。doubleは8バイト、リファレンスも8バイトです。しかし、リンクはまだ8バイトの番号を取得する必要があります。
それは理にかなっていて、数字を足すとあっちが8、こっちが8となる ))
しかし、プロセッサのバスは8ビットではないので、1クロックあたり8バイト=64ビットを読み取る必要があるのでは?
というのは理にかなっていて、数字を足すとあっちが8、こっちが8となります ))
しかし、プロセッサのバスは8ビットではないので、1クロックあたり8バイト=64ビットを読み取ることになっているのでしょうか?
そこはそんなに単純な話ではない。速度は、オブジェクトがどのメモリにあるかという理由と、その他の理由の両方に依存します。
実際のプログラムでは、単純なテストの結果とは大きく異なることがあります。
通常、クラスや構造体は参照渡しです。
単純な型は、それによって何らかの値が返される場合にのみ参照渡しされる。
この構造体が関数の結果として返される場合でも、構造体フィールドにアクセス できることに驚きました
このコードは正しく動作します (関数内で構造体を埋めてから、関数の結果をバイト配列にコピーしています)。
このような構造体へのアクセスを利用すると便利です。どこに落とし穴があるのか、バグやエラーは?
この構造体が関数の結果として返される場合でも、構造体フィールドにアクセス できることに驚きました
このコードは正しく動作します (関数内で構造体を埋めてから、関数の結果をバイト配列にコピーしています)。
このような構造体へのアクセスを利用すると便利です。落とし穴やバグ、エラーはどこにあるのか?
こういうこと)) バグはないです。
だから、より正確にはオペラからです(..)(..)
また、バイト配列にコピーすることの意味もよくわかりません。返された構造体からデータにアクセスすることだけですこれは、返された構造体のデータにアクセスするだけです。
そうなんですが、中間変数なしで、f()関数の結果に直接byteフィールドにアクセスしているのが紛らわしいです
というわけで、キャッチボールをお待ちしております。
そうなんですが、中間変数なしで、f()関数の結果に直接byteフィールドにアクセスしているのが紛らわしいです。
というわけで、キャッチボールをお待ちしております。
ここ数年、安定しています。
は、ここ数年、安定しています。
OK、ありがとうございます!