エラー、バグ、質問 - ページ 816

 
私見では、これはオブジェクト・メンバーへの直接アクセスの 最初のケースの最適化に過ぎない。

2つ目のケースでは、参照を介した間接的なアクセスがあり、微細なループ体では当然ながら半分の時間で、2倍の時間がかかる。
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
このテストはやや不正確で、本来は1つのアセンブラ命令と、1億個のループに配置された2つのアセンブラ命令の違いを比較するものである。
 
Renat:
これは、オブジェクトのメンバに 直接アクセスする最初のケースの最適化に過ぎないと思うのです。

2つ目のケースは、参照を介した間接的なアクセスで、当然ながら時間は半分になり、微小なループ体があると2倍になる。

レナート 現実には、大きなデータの配列が処理されています。このテストは、問題箇所を示すために、すでに簡略化してあります。 最初は、自作の配列とクラスを使って作成しました。そして、それをスキームに落とし込みました。

つまり、実際には1つのarオブジェクトではなく、複雑なオブジェクトの配列(これも配列で)を持っているのです。

というスキームで書くことができます。

class A
{
  double prm1;
  int prm2;
  string prm3;
  char prm4;
}

class B
{
   A m_a[1000];
}

B _b[1000];



私は、特定の配列要素Aへの参照を取得した場合、その配列要素Aを参照することができると推論しました。

А *item=GetPointer(_b[i]._a[j]);

パラメータ A::prmXを 使った作業がより速くなります。


しかし、配列名からソーセージを取り出すことが判明した

_b[i]._a[j].prmX  

は、特定の 項目を参照するよりも、少なくとも2倍は速いでしょう

これには少し驚きました。カーネルが何らかの疑似ポインタを取得していることは明らかです。

せめて速度差を少なくするような最適化の方法はないのでしょうか?

 
sergeev:

エラーなしでこのようになります

このテストでは、エラーは発生しません。しかし、この方法では、「なぜコンパイラは、エラーや警告を出さずに、定数オブジェクト参照から非定数参照への変換をスキップするのか」という主な疑問は解決できません。そのような機能であれば問題はありませんが、この場合、クラスメソッドの シグネチャで返される型に対するconst修飾子の意味が失われてしまうのです。
 
mvk:
今回のテストでは、このような形でのエラーは発生しません。しかし、この方法では、「なぜコンパイラは定数オブジェクト参照から非定数参照への変換をスキップし、エラーや警告を発生させないのか」という主な疑問は解決されません。そのような機能であれば問題はないのですが、この場合、クラスメソッドの シグネチャで返される型に対する修飾子constの意味が失われてしまうのです。

を見ると、すべてが納得できる。

定数オブジェクト関数は、オブジェクト自体を変更してはならないので、const 修飾子も必要です。

について、そして

   //Ошибки нет. Это НЕ правильно(CONST A* B::getA())!
   A* a2 = b.getA();

そうですね、C++ではうまくいきませんね。

servicedeskに書き込む。

 
sergeev:

しかし、配列名からソーセージを取り出すことが判明 した

は、特定の アイテムにアクセスするよりも、少なくとも2倍速く なります。

本当に速くなったのか、それとも他の単純なケースを基に論理的に組み立てて出力しているのか。

私の考えでは、提示された多次元配列への アクセスに基づくきれいな証明は、まだ提示されていない。特に、率直に言って高価な追加関数GetPointerが存在することを考えると。


ちょっとびっくりしたんですが、カーネルに何らかの疑似ポインタが入り込んでいることが明らかになったんです。

MQL5では、従来の意味でのポインターは存在せず、ハンドルとなり、その結果もすべて同じです。


少なくとも速度差を少なくするような最適化の方法はないのでしょうか?

我々は常に最適化に取り組んでいますが、リファレンス/ハンドルの場合、間接アクセスにシステムオーバーヘッドが発生します。

とにかく、このようなアクセスの最適化について、もう少し詳しく見ていきましょう。

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
Renat:

本当に速くなったのか、それとも他の単純な事例をもとに論理的に結論を構築したのか。

私のアレイをいっぱいにしてテストしてみましたが、いつも2倍は遅いですね。

私の考えでは、提示された多次元配列 アクセスに基づくきれいな証明は、まだ提示されていない。

さて、スキームとクラスA、B、配列のイメージを並べました。


特に、率直に言って高価な追加関数GetPointerを使用しています。

はループに入る前に一度だけ呼ばれます。しかし、原理的には、より正確なテストのために、GetTickCount の外側に持っていくことも可能です。

いずれにせよ、こうしたアクセスの最適化について、詳しく見ていくことにします。

OK、ありがとう、まさにそれが必要なんだ。

 
sergeev:

はループに入る前に一度だけ呼ばれます。しかし、より正確なテストのためには、原理的には、GetTickCount の外側に持っていくことも可能です。

このようなコードであれば、ループの外側ではどうでしょうか。
А *item=GetPointer(_b[i]._a[j]);
 
提案です。テキストのズーム機能をヘルプに含めることはできますか?例えば、+ or - , または Ctrl+ マウスホイールなど。
 
paladin800:
提案です。テキストのズーム機能をヘルプに含めることはできますか?例えば、+または-、あるいはCtrl+マウスホイールなど。

きっと無理なんでしょうね。オンライン版は適していないのでしょうか?

以下は、このテーマについてネットで調べたものです。http://forum.ru-board.com/topic.cgi?forum=62&topic=20907

UPDate 詳細http://forum.ixbt.com/topic.cgi?id=23:39211

Невозможно изменить размер шрифта при просмотре .CHM файлов. :: Microsoft Windows :: Компьютерный форум Ru.Board
  • forum.ru-board.com
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору