![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Wenn Sie die Größe von Arrays im Hauptteil der Schleife ändern, funktioniert die fliegende Optimierung nicht.
Ändern Sie also den Code:
)))) müssen Sie einfach auch den Wert Ihrer Größenvariablen ändern, so dass die genannte erste Methode , die ArraySIze verwendet, von Vorteil ist
Nun, ich kann IMHO nichts dagegen sagen.
Bei sehr großen Wiederholungen sind meine Siege bei der ersten und zweiten Methode zufällig geworden... Höchstwahrscheinlich hängt dies vom aktuellen CPU-Cache und der Gesamtlast ab.
Meine Frage bezog sich nicht auf die Schleife, sondern darauf, wie sich die Funktion entfaltet. Es ist nur so, dass ArraySize als Beispiel verwendet wurde.
Die Perfektion einer Hochsprache liegt genau dann vor, wenn das bequeme Schreiben ebenso billig ist wie das nicht bequeme, aber von Natur aus billige Schreiben. Schade, dass es nicht immer so ist, und Hilfe mit einem Helfer für Neulinge nicht immer entweder..... gäbe es keine Fragen)))
Wenn Sie die Größe von Arrays im Hauptteil der Schleife ändern, funktioniert die fliegende Optimierung nicht.
Ändern Sie also den Code:
es funktioniert nicht
Laufzeitoptimierung hat die Nase vorn
man kann solche einfachen Mashin-Befehle nicht ohne einen Profiler testen, oder man kann in der Schleife schreiben, oder in einem Tester testen, Geschwindigkeit ist dafür wichtig
Ich habe nicht von der Schleife gesprochen, sondern davon, wie der Compiler Funktionen entfaltet..... come on.
Ich überlasse es Ihnen.
)))) dürfen Sie auch den Wert Ihrer Größenvariablen ändern, so dass die erste Methode , die ArraySIze verwendet, gewinnt.
Ich schrieb oben - solch einfacher Code kann nicht mit einfachen Messungen getestet werden, es gibt viele Faktoren - der Code ist klein - er passt in den Prozessor-Cache, der Code muss im Prozessor gut in parallele Mikro-Befehle in der Prozessor-Pipeline zerlegt werden, d.h. Register werden schnell durch Daten-Prefetching geladen
und vielleicht wird auch rand() irgendwo zwischengespeichert
Ich weiß nicht, wie man ohne Debugger testen kann - zumindest kann man dort die Zeit der Befehlsausführung in Takt sehen
Dann beweisen Sie mir das Gegenteil.)
Denn in meinem Test sind sie aus irgendeinem Grund identisch.
Ich habe meinen Beitrag geändert.
Es scheint mir, dass ArraySize jetzt schneller ist als die cnt Variable.
Früher war es genau umgekehrt. Vielleicht wirkt sich das Inkrement cnt-- aus, der Schleifenkörper ist anders und wahrscheinlich muss etwas anderes für die Belastung erfunden werden.
Das ist seltsam.
DieVerwendung von ArraySize(arr) in der Schleifenbedingung zeigt weniger Zeit als die Verwendung der cnt-Variable.
Vorher war es genau umgekehrt. Vielleicht ist es ein Fehler? So sollte es nicht sein.
Sie haben nichts in Ihrem Code verwechselt, wer wird den Wert für Sie ändern?
cnt
es für Sie ändern, wie es in der ersten Variante geschieht
500p Frage (keine Prüfung), welcher Weg schneller ist. Sehen Sie, wie viele externe Funktionen in der oberen Methode aufgerufen werden
als eine Variante des Tests - man kann auch nur verschiedene Arrays in jeden Test einbauen - in meinem Beispiel arr1,arr2...
d.h. tst1_arr1[],tst1_arr2[] .... und tst2_arr1[],tst2_arr2[]
wäre dies ein gerechterer Test.
ich bin weg, sehr ablenkend - imho, praktisch, benutze es
Ich weiß nicht, wie man ohne Debugger testen kann - zumindest kann man dort die Befehlsausführungszeit in Taktzyklen sehen
Nun, ja - ohne Debugger geht es nicht. Und in der Zeit dort...
Das ist seltsam.
DieVerwendung von ArraySize(arr) in der Schleifenbedingung zeigt weniger Zeit als die Verwendung der cnt-Variable.
Vorher war es genau umgekehrt. Vielleicht ist es ein Fehler? So sollte es nicht sein.
Es liegt ein Zufallsergebnis vor. Beim Kompilieren werden Zugriffe auf eine Speicherzelle mit einem Array-Größenwert abgewickelt, während die Array-Größe vorher empfangen und in die Speicherzelle eingefügt wird, wenn das Array gebildet wird, selbst wenn das Array dynamisch ist und Zellen mit einer Array-Größe und einem Variablenwert die gleiche Zugriffszeit haben.
Und nach dem Satz zu urteilen, den Compiler in einem 3-4-jährigen Informatikkurs machen ... im Allgemeinen hoffe ich, dass mich ein hinreichend notwendiges Maß an Framing in einer MCL-Umgebung nicht sehr nervös macht)