Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 118

 
Nein, ich habe mich geirrt: FastLog2 arbeitet schneller, wenn Optimize=1. Es ist ein Wunder... Ich muss es in C++ überprüfen.
 
Alexey Navoykov:

Übrigens, was die Null betrifft, so prüft FastLog2 nicht auf Null, was ihm einen Vorsprung verschafft. Aber es ist immer noch 1,5-2 mal langsamer als log2, wenn es richtig getestet wurde).

Und was ist daran falsch?

Denn auch Ihre Version des Tests ergibt:

2019.01.05 04:43:12.372 TestLog (EURUSD,H1)     Result log2:       sum=1400005128  time=297 ms
2019.01.05 04:43:12.635 TestLog (EURUSD,H1)     Result log2_:      sum=1400018381  time=262 ms
2019.01.05 04:43:12.809 TestLog (EURUSD,H1)     Result _FastLog2:  sum=1400004095  time=174 ms
 
Alexey Navoykov:

Übrigens, was die Null betrifft, so prüft FastLog2 nicht auf Null, was ihm einen Vorsprung verschafft. Aber es ist immer noch 1,5-2 mal langsamer als log2, wenn richtig getestet).

Natürlich sollten wir die Nullprüfung aus log2 entfernen oder die gleiche Prüfung in FastLog2 einbauen.

Die Frage ist eigentlich die nach der Geschwindigkeit des rechnerischen Teils. In log2 wird alles nur durch Verschiebungen und Additionen berechnet. FastLog2 verwendet Tabellenwerte nach geschickten Umrechnungen mit Multiplikation. Dieser Code ist sehr alt, er wurde in den Tagen der Mathe-Coprozessoren verwendet, die Situation kann sich seitdem durchaus geändert haben.

 
Ich habe es in C++ überprüft: Ja, FastLog2 ist tatsächlich am schnellsten. Trotzdem ein cleverer Code ) Der Grund dafür ist vielleicht, dass bitweise Operationen viel schneller sind als Vergleichsoperationen.
 
Ich habe alle Codes in MT4 getestet. In MT4 führt der Compiler keine Optimierung durch (d.h. die Variante mit Summe zeigt die gleichen relativen Ergebnisse wie meine ursprüngliche Variante ohne Summe), und in MT4 läuft log2 schneller als FastLog2. Und in MT5 wird die Optimierung bereits ohne Summierung durchgeführt (d.h. der Code wird offensichtlich nicht vollständig ausgeführt), und die FastLog2-Variante ist schneller als log2. Welche Schlussfolgerungen man daraus ziehen kann, weiß ich nicht, denn es gibt keine Details darüber, wie der Code-Optimierer dort und dort arbeitet.
 
void f(){
  static int a[]; 
  Print("a[]=",ArraySize(a)); 
  ArrayResize(a, 100); 
  Print("a[]=",ArraySize(a));}


class A
 {
public: A(){ f(); }
 };
 
A _a;

void OnStart()
  {

  }


 
Ilya Malev:

Dies ist das Standardverhalten von MQL5: statische Variablen kommen nach globalen Variablen.

Dadurch kann man sehr ernsthaft in Schwierigkeiten geraten.
 
fxsaber:

Dies ist das Standardverhalten von MQL5: statische Variablen beginnen nach den globalen Variablen.

Ist das der Grund, warum jede statische Variable einer Klasse/Struktur nach der Struktur selbst deklariert werden muss? Und auch ohne ihm einen Wert beizumessen... Vielleicht sollten wir vorschlagen, dass der Compiler all dies automatisch erledigt?

 

Dabei handelt es sich im Wesentlichen um einen Fehler, eine falsche Reihenfolge der Programmcodeausführung. Der Compiler sollte dies prinzipiell nicht zulassen. Sie sollten die Entwickler deswegen öfter anschreien.

In C++ wird der Code vom Compiler strikt von oben nach unten abgearbeitet, d. h. alles, was oben steht, ist bereits initialisiert, und Sie können nicht auf den Code darunter zugreifen. Und da die Entwickler hier ihre eigenen Regeln eingeführt haben, sollen sie auch für die richtige Reihenfolge der Codeausführung sorgen.

 
Alexey Navoykov:

In C++ wird der Code vom Compiler strikt von oben nach unten abgearbeitet, d. h. alles, was oben steht, ist bereits initialisiert, und man kann nicht auf das untere zugreifen. Deshalb ist alles klar.

Es gibt weniger Flexibilität.