Fragen zu OOP in MQL5 - Seite 88

 
Igor Makanu:
gleiche Werte, die Geschwindigkeit des Tests "schwimmt" aus irgendeinem Grund, aber die Übergabe von Parametern in Methoden durch Referenz ist immer noch effizienter

Dann gibt es noch diese Möglichkeit:

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 );
   }
};
 
Koldun Zloy:

Dann gibt es noch diese Möglichkeit:

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 : Schleifen = 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 : Schleifen = 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 : Schleifen = 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

seltsam, aber kein Unterschied

UPD: wenn ich mich nicht irre, habe ich vor Jahren einen Fehler in MT4 gesucht - ich habe Argumente an eine Funktion NICHT per Referenz übergeben und dann habe ich eines der Funktionsargumente im Funktionskörper geändert (einen Fehler gemacht). ich konnte ein per Referenz übergebenes Argument ändern, vielleicht hat der Compiler in der E-Variante auch alle Argumente per Referenz übergeben.

 
Igor Makanu:
seltsam, aber es gibt keinen Unterschied.

Daran ist nichts Seltsames. double ist 8 Byte groß, die Referenz ist ebenfalls 8 Byte groß. Aber der Verweis muss immer noch die 8 Bytes der Nummer erhalten.

 
Koldun Zloy:

Daran ist nichts Seltsames. double ist 8 Byte groß, die Referenz ist ebenfalls 8 Byte groß. Aber die Verbindung muss immer noch 8 Bytes einer Zahl erhalten.

Das macht Sinn, und die Zahlen addieren sich zu 8 hin und 8 zurück ))

aber der Bus ist nicht 8 Bit in einem Prozessor? sollte 8 Bytes = 64 Bit pro Taktzyklus lesen?

 
Igor Makanu:

das macht Sinn, und die Zahlen addieren sich zu 8 hin und 8 zurück ))

Aber der Bus ist nicht 8 Bit in einem Prozessor, soll er 8 Bytes = 64 Bit pro Taktzyklus lesen?

So einfach ist es dort nicht. Die Geschwindigkeit hängt sowohl davon ab, in welchem Speicher sich das Objekt befindet, als auch von anderen Gründen.

In einem realen Programm kann das Ergebnis sehr viel anders ausfallen als bei einem einfachen Test.

Normalerweise werden Klassen und Strukturen per Referenz übergeben.

Einfache Typen werden nur dann per Referenz übergeben, wenn sie einen Wert zurückgeben.

 

Ich war überrascht festzustellen, dass auf Strukturfelder auch dann zugegriffen werden kann, wenn diese Struktur als Funktionsergebnis zurückgegeben wird

dieser Code funktioniert korrekt (wir füllen die Struktur in der Funktion und kopieren dann das Ergebnis der Funktion in ein Byte-Array)

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

}
//+------------------------------------------------------------------+

ist es zweckmäßig, einen solchen Zugriff auf das Strukturfeld zu verwenden, .... Wo gibt es Fallstricke - Bugs/Fehler?

 
Igor Makanu:

Ich war überrascht festzustellen, dass auf Strukturfelder auch dann zugegriffen werden kann, wenn diese Struktur als Funktionsergebnis zurückgegeben wird

dieser Code funktioniert korrekt (wir füllen die Struktur in der Funktion und kopieren dann das Ergebnis der Funktion in ein Byte-Array)

ist es zweckmäßig, einen solchen Zugriff auf das Strukturfeld zu verwenden, .... wo kann es Fallstricke/Fehler geben?

Diese Art von Dingen)) gibt es keine Bugs.

 ArrayCopy(arr, (f()).byte, ArraySize(arr))

Genauer gesagt ist es aus der Oper (.)(.)

Ich verstehe auch nicht, was das Kopieren in ein Byte-Array damit zu tun hat. Es geht nur um den Zugriff auf Daten aus der zurückgegebenen Struktur
 
Alexandr Andreev:
Dies ist nur der Zugriff auf die Daten der zurückgegebenen Struktur

ja, aber es ist verwirrend, dass ich auf das Byte-Feld ohne eine Zwischenvariable zugreife, direkt auf das Ergebnis von f()

deshalb warte ich auf einen Fang

f().byte
 
Igor Makanu:

ja, aber es ist verwirrend, dass ich auf das Byte-Feld ohne eine Zwischenvariable zugreife, direkt auf das Ergebnis der Funktion f()

deshalb warte ich auf einen Fang

Sie ist seit einigen Jahren stabil.

 
Alexandr Andreev:

ist nun schon seit einigen Jahren stabil.

OK, vielen Dank!

Grund der Beschwerde: