Fehler, Irrtümer, Fragen - Seite 816

 
Meiner Meinung nach ist dies nur eine Optimierung des ersten Falls des direkten Zugriffs auf ein Objektmitglied.

Im zweiten Fall erfolgt der Zugriff indirekt über einen Verweis, der in einem mikroskopisch kleinen Schleifenkörper natürlich die Hälfte der Zeit in Anspruch nimmt und sie verdoppelt.
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Der Test ist nicht ganz korrekt, denn er vergleicht im Wesentlichen den Unterschied zwischen einer einzigen Assembler-Anweisung und zwei Assembler-Anweisungen, die in hundert Millionen Schleifen platziert sind.
 
Renat:
Ich denke, dies ist nur eine Optimierung des ersten Falls des direkten Zugriffs auf ein Objektmitglied.

Im zweiten Fall haben wir einen indirekten Zugriff über einen Verweis, der natürlich die Hälfte der Zeit benötigt, wobei ein mikroskopischer Schleifenkörper die Zeit um das Doppelte erhöht.

Renat, in der realen Welt werden große Datenmengen verarbeitet. Ich habe den Test bereits vereinfacht, um den Problembereich zu verdeutlichen. Ursprünglich habe ich ihn mit meinen eigenen Arrays und Klassen erstellt. Dann habe ich es auf ein Schema reduziert.

d.h. wir haben eigentlich nicht nur ein arr-Objekt, sondern ein Array von komplexen Objekten (auch mit Arrays).

Dies lässt sich im Schema grob wie folgt ausdrücken

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

class B
{
   A m_a[1000];
}

B _b[1000];



Ich habe mir überlegt, dass ich, wenn ich einen Verweis auf ein bestimmtes Array-Element A

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

Die Arbeit mit den Parametern A::prmX wird schneller sein.


Aber es stellt sich heraus, dass das Ziehen einer Wurst aus Array-Namen

_b[i]._a[j].prmX  

wäre mindestens doppelt so schnell wie der Verweis auf ein bestimmtes Element.

Das hat mich ein wenig überrascht, und es ist klar, dass der Kernel eine Art Pseudo-Zeiger erhält.

Gibt es eine Möglichkeit, die Geschwindigkeit zu optimieren, so dass der Geschwindigkeitsunterschied zumindest verringert wird?

 
sergeev:

So wird es ohne Fehler sein

Bei diesem Test treten keine Fehler auf. Aber diese Methode löst nicht die Hauptfrage: Warum überspringt der Compiler die Umwandlung einer konstanten Objektreferenz in eine nicht konstante Referenz, ohne Fehler und/oder Warnungen zu erzeugen? Wenn es sich um eine solche Funktion handelt, gibt es keine Fragen, aber in diesem Fall geht die Bedeutung des Modifikators const für den zurückgegebenen Typ in der Signatur von Klassenmethoden verloren.
 
mvk:
Bei diesem Test werden keine Fehler auf diese Weise auftreten. Aber diese Methode löst nicht die Hauptfrage: Warum überspringt der Compiler die Umwandlung einer konstanten Objektreferenz in eine Nicht-Konst-Referenz und erzeugt keinen Fehler und/oder keine Warnung? Wenn es sich um eine solche Funktion handelt, keine Frage, aber in diesem Fall geht die Bedeutung des Modifikators const für den zurückgegebenen Typ in der Signatur von Klassenmethoden verloren.

Für mich ergibt alles einen Sinn.

Die konstanten Objektfunktionen sollten das Objekt selbst nicht verändern, also sollten sie auch einen const-Modifikator haben

und über

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

Nun, ja, das wird in C++ nicht funktionieren.

Schreiben Sie an servicedesk.

 
sergeev:

Aber es stellt sich heraus, dass das Ziehen einer Wurst aus Array-Namen

ist mindestens doppelt so schnell wie der Zugriff auf ein bestimmtes Objekt.

Ist es wirklich schneller, oder ist es eine logische Konstruktion der Ausgabe, die auf anderen, einfacheren Fällen basiert?

Meiner Meinung nach ist ein sauberer Beweis, der auf dem vorgestellten Zugriff auf ein mehrdimensionales Array basiert, noch nicht vorgelegt worden. Vor allem, wenn man bedenkt, dass die teure Zusatzfunktion GetPointer vorhanden ist.


Das hat mich ein wenig überrascht, und es wurde klar, dass im Kernel eine Art Pseudo-Indexierung stattfindet.

Zeiger im herkömmlichen Sinne gibt es in MQL5 nicht, es sind Handles, mit allen Konsequenzen.


Gibt es eine Möglichkeit, die Geschwindigkeit zu optimieren, so dass der Geschwindigkeitsunterschied zumindest verringert wird?

Wir arbeiten ständig an der Optimierung, aber im Falle von Referenzen/Handles gibt es einen System-Overhead bei indirektem Zugriff.

Wie auch immer, lassen Sie uns die Optimierung eines solchen Zugangs näher betrachten.

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

Ist es wirklich schneller oder ist es eine logische Konstruktion der Schlussfolgerung, die auf anderen, einfacheren Fällen beruht?

Ja, das ist ziemlich realistisch. Ich habe es beim Füllen meiner Arrays getestet. Es war immer doppelt so langsam.

Meines Erachtens ist ein sauberer Beweis auf der Grundlage des vorgestellten mehrdimensionalen Array-Zugriffs noch nicht vorgelegt worden.

Nun, ich habe das Schema und ein Bild der Klassen A, B und Arrays erstellt.


Vor allem mit der recht teuren Zusatzfunktion GetPointer.

Sie wird einmal vor dem Eintritt in eine Schleife aufgerufen, aber im Prinzip kann man sie für einen genaueren Test auch außerhalb von GetTickCount verwenden

In jedem Fall werden wir uns die Optimierung eines solchen Zugangs genauer ansehen.

OK. Danke. Das ist genau das, was wir brauchen.

 
sergeev:

Sie wird einmal vor dem Eintritt in die Schleife aufgerufen, aber im Prinzip könnte man sie für einen genaueren Test auch außerhalb von GetTickCount verwenden

Wie sieht es außerhalb der Schleife aus, wenn der Code wie folgt lautet?
А *item=GetPointer(_b[i]._a[j]);
 
Eine Anregung. Kann die Text-Zoom-Funktion in die Hilfe aufgenommen werden, z.B. + oder - , oder Strg+Mausrad.
 
paladin800:
Eine Anregung. Kann die Text-Zoom-Funktion in die Hilfe aufgenommen werden, z. B. + oder - oder Strg+Mausrad.

Das ist wahrscheinlich nicht möglich. Ist die Online-Version nicht geeignet?

Das habe ich im Internet zu diesem Thema gefunden - http://forum.ru-board.com/topic.cgi?forum=62&topic=20907

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

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