Fragen zu OOP in MQL5 - Seite 71

 
Igor Makanu:

wenn Sie solche Klassen schreiben:

Nach Ihrer Recherche zu urteilen, wird die Klasse B langsamer ausgeführt, wenn Sie häufig Strukturfelder in Berechnungen verwenden?

Wir sprachen also über die Zeit, die für das Durchlaufen eines Arrays von Objekten benötigt wird)))

Nach Ihrem Beispiel wird es das gleiche in Plus sein, aber in mql gibt es eine Nuance, es gibt zwei implizite Felder, die zuerst gehen, so, Datenfeld wird durch Verschiebung, d.h. zusätzliche Berechnungen während der Dereferenzierung angegangen werden.

 
Vladimir Simakov:

Wir sprachen also über die Zeit, die für die Durchquerung des Arrays von Objekten benötigt wird)))

Nach Ihrem Beispiel wird es das gleiche in Plus sein, aber in mql gibt es eine Nuance, es gibt zwei implizite Felder, die zuerst gehen, so, Datenfeld wird durch Verschiebung, d.h. zusätzliche Berechnungen während der Dereferenzierung angegangen werden.

Vielen Dank, das ist sehr hilfreich!

 
Vladimir Simakov:

Wir sprachen also über die Zeit, die für die Durchquerung des Arrays von Objekten benötigt wird)))

Nach Ihrem Beispiel wird es das gleiche in Plus sein, aber in mql gibt es eine Nuance: es gibt zwei implizite Felder, die zuerst gehen, so Datenfeld wird an einem Offset zugegriffen werden, d.h. zusätzliche Dereferenzierung Berechnungen durchgeführt werden.

Beide Klassen sind ähnlich. Der Zugriff erfolgt in beiden Fällen durch Offset, nur nicht relativ zum Anfang der Struktur, sondern relativ zum Anfang der Klasse. Mit anderen Worten: Die Struktur selbst ist schwerelos, nur die Klassen verursachen einen Overhead.
 
Vladimir Simakov:

Also keine Mystik - die Gesetze der Physik in Aktion.

Das passt nicht zu den "Gesetzen der Physik".

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

long f1( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * i;
    
    Sum |= 1;
  }
    
  return(Sum);
}

long f2( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * (Amount - i);
    
    Sum |= 1;
  }
    
  return(Sum);
}

void OnStart()
{
  Print(_B(f1(2), 1));
  Print(_B(f1(200), 1));
  
  Print(_B(f2(2), 1));
  Print(_B(f2(200), 1));
}


        Alert: Time[Test6.mq5 267: f1(2)] = 3252 ms.
        6553255921290448385
        Alert: Time[Test6.mq5 268: f1(200)] = 4602 ms.
        -8757194524499019775
        Alert: Time[Test6.mq5 270: f2(2)] = 3061 ms.
        6553255931290448385
        Alert: Time[Test6.mq5 271: f2(200)] = 3112 ms.
        -8757193524499019775


Dies ist ein paradoxes Ergebnis. Komplexere Berechnungen werden 1,5 Mal schneller durchgeführt und sind nicht von der Größe abhängig.

 
Vladimir Simakov:

Wir sprachen also über die Zeit für die Durchquerung des Objektarrays)))

Nach Ihrem Beispiel wird es das gleiche in Plus sein, aber es gibt eine Feinheit in mql: es gibt zwei implizite Felder, die zuerst gehen, so Datenfeld wird an einem Offset zugegriffen werden, d.h. zusätzliche Dereferenzierung Berechnungen durchgeführt werden.

Danke an Vladimir für die Assembler-Studie.
Und wie Alexey andeutet, wird der Overhead durch Klassen erzeugt.
Daraus können wir schließen, dass es besser ist, Code im prozeduralen Stil zu schreiben, wenn man auf Klassen verzichten kann.
Das heißt, wenn die Aufgabe keine Geschwindigkeit erfordert, können Sie sie in eine Klasse verpacken, aber wenn Sie zum Beispiel mit Ticks zu tun haben, sollten Sie sie besser direkt ohne Wrapper verwenden.
Im Prinzip ist dies der Ansatz, den ich verfolgte, und oft ein Beispiel für eine Klasse zu finden, zerlege ich seine Methoden in prozeduralen Ansatz.

 
Roman:

Vielen Dank, Vladimir, für die Montagestudie.
Und wie Alexey vorschlägt, schafft der Overhead Klassen.
Daraus können wir schließen, dass es besser ist, Code im prozeduralen Stil zu schreiben, wenn wir auf Klassen verzichten können.
Das heißt, wenn die Aufgabe keine Schnelligkeit erfordert, kann man sie in eine Klasse verpacken, aber wenn man zum Beispiel mit Ticks zu tun hat, sollte man besser direkt ohne Wrapper schreiben.
Im Prinzip ist das der Ansatz, den ich verfolge, und oft, wenn ich ein Beispiel für eine Klasse finde, zerlege ich ihre Methoden mit einem prozeduralen Ansatz.

Es gibt einen Troll im Forum...
Früher habe ich nicht verstanden, warum manche Nutzer nach der Ignorierfunktion fragen, ach, wie sie jetzt fehlt...

 

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

OOP-Fragen in MQL5

fxsaber, 2020.05.30 14:06

Ich habe keine Ahnung, was ich damit anfangen soll. Ich habe einfache Strukturen geschaffen.

        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

Ich bin mir nicht sicher, warum der Zugriff auf das erste Feld einer einfachen Struktur von ihrer Größe abhängt.

Sie verwenden 50M Elemente in einem Array.
Bei Strukturen mit einer Größe von 20 und 84 Byte sind dies 0,93 GB bzw. 3,91 GB an Daten.
Und im Rahmen Ihrer Berechnung geht vermutlich all dieser Speicher durch den Cache des Prozessors.
Und eine sehr logische Erklärung für diese Ergebnisse wäre, dass 0,93 GB Daten viermal schneller aus dem Speicher in den CPU-Cache heruntergeladen werden als die 3,91 GB an Daten.

Was ist mit den Ergebnissen des C++-Tests?
Denn ich habe Assembler-Code gesehen, aber keine Testergebnisse, oder habe ich schlecht geschaut?
 
Sergey Dzyublik:

Es gibt einen Troll im Forum...
Früher habe ich nicht verstanden, warum manche Nutzer nach der Ignorierfunktion fragen, ach, wie sie jetzt fehlt...

Sie sollten sich um sich selbst kümmern, nicht um andere.
Nicht Sie und nicht für Sie war die Antwort.
Im Stillen ignorieren ))

 
Sergey Dzyublik:
Sie verwenden 50M Elemente in einem Array.
Bei Strukturen von 20 bzw. 84 Byte sind das 0,93 GB bzw. 3,91 GB an Daten.
Und als Teil Ihrer Berechnung wird vermutlich der gesamte Speicher durch den Cache des Prozessors geleitet.
Und eine sehr logische Erklärung für diese Ergebnisse wäre, dass 0,93 GB Daten viermal schneller aus dem Speicher in den CPU-Cache heruntergeladen werden als die 3,91 GB an Daten.

Was ist mit den Ergebnissen des C++-Tests?
Denn ich habe Assembler-Code gesehen, aber keine Testergebnisse, oder habe ich schlecht geschaut?
Das funktioniert auf die gleiche Weise. Es ist nur ein bisschen schneller, aber das Verhältnis ist das gleiche, es ist also Hardware.
 
Roman:

Vielen Dank, Vladimir, für die Montagestudie.
Und wie Alexey vorschlägt, schafft der Overhead Klassen.
Daraus können wir schließen, dass es besser ist, Code im prozeduralen Stil zu schreiben, wenn wir auf Klassen verzichten können.
Das heißt, wenn die Aufgabe keine Schnelligkeit erfordert, kann man sie in eine Klasse verpacken, aber wenn man zum Beispiel mit Ticks zu tun hat, sollte man besser direkt ohne Wrapper schreiben.
Im Prinzip ist dies der Ansatz, den ich verfolge, und oft, wenn ich ein Beispiel für eine Klasse finde, zerlege ich ihre Methoden im prozeduralen Stil.

Sie können eine Struktur anstelle einer Klasse verwenden, das geht auch.