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
Der Einsatz der normalen Funktionen ist eine Selbstverständlichkeit
d.h. zum Beispiel for (int i=0; i<ArraiSize(max); i++)
hier wird ArraiSize(max); expandiert und erhält so etwas wie die Adresse der Größe des gegebenen Arrays (wenn wir uns das Array ansehen, hat es seine Größe in einer Variablen, und hier haben wir die Substitution dieser Variablen "Adresse im Speicher"), d.h. es hat überhaupt keinen Sinn, sie in eine Variable zu ändern
for (int i=0; i<ArraiSize(max); i++)
и
for (int i=0; i<size; i++ )
In diesem Fall haben ArraiSize(max) und size die gleichen Timings, um die Arraygröße zu bestimmen
falsche Äußerung
getestet: Ich habe es 1000 Mal versucht, 3 Arrays und 3 verschachtelte Schleifen in jedem Array, 2 Varianten: die 1. und die 2.
Das Ergebnis ist stabil (3 Mal getestet):
2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=114.5013
2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=99.7722
In dieser Beispielschleife bin ich mit den Zeitangaben nicht einverstanden.
Im Gegenteil, es wird empfohlen, das Ergebnis in der Größenvariablen zu erhalten und es in der Bedingung zu verwenden.
Da die Schleife bei jeder Iteration fürArraiSize(max) unnötig abgewickelt wird, verlangsamt sich die Schleifenausführung.
Die Funktion ArraiSize(max) expandiert und gibt die Zelle mit dem Längensatz des Arrays zurück;die Adresse der Zelle, in der die Länge des Arrays gespeichert ist, wird zurückgegeben
und eine beliebige Variable, in diesem Fall size, ist die Adresseder Zelle, in der die Länge des Arrays gespeichert ist
Wir erhalten also dasselbe am Ausgang, und selbst wenn wir die Größe des Arrays im Verlauf der Schleife ändern, wird sich die Adresse pro Zelle weder im ersten noch im zweiten Fall ändern.
Da der mas-Wert immer statisch ist (es handelt sich nicht um einen Verweis), kann es keine andere Logik geben)))
Die Funktion ArraiSize(max) selbst besagt, dass ein Speicherbereich immax-Array für die Array-Länge verwendet werden soll; dies wird in der Kompilierungsphase durchgeführt - Funktionseinsatz
falsche Äußerung
Getestet: 1000 Mal messen, 3 Felder und 3 verschachtelte Brute-Force-Schleifen auf jedem Feld, 2 Varianten: 1. und 2.
Das Ergebnis ist stabil (3 Mal getestet):
2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=114.5013
2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=99.7722
dann einige Probleme mit dem Gebäude....
dann gibt es einige Probleme mit der Montage....
Es ist klar, dass das Ergebnis dasselbe ist.
Aber auf diesen Speicherbereich wird anders zugegriffen, das war ja der Punkt.
Der Zugriff auf eine Variable ist schneller als auf eine Funktion, da die Variable den Wert bereits enthält.
Und eine Funktion muss diesen Wert immer noch abrufen und zurückgeben, d.h. auf eine Speicherzelle verweisen, eine unnötige Anweisung.
Das Beispiel von Igor ist nur eine Bestätigung dessen, was ich gesagt habe.
dann einige Probleme mit der Montage....
gelogen
ArraySize() wird bei jeder Iteration aufgerufen
selbst wenn Sie die Array-Größe nicht jedes Mal überprüfen, erhalten Sie dennoch einen Prozeduraufruf und zumindest eine Überprüfung der Variablen, die die Array-Größe speichert
Dies ist der Test, über den ich schreibe, wir ändern die Größe des Arrays in der Schleife, die Schleife wird unterbrochen, wie es sein sollte, d.h. bei jeder Iteration der Schleife wird die Array-Größe bestimmt, nachdem der Schleifenkörper ausgeführt wird:
gelogen
ArraySize() wird bei jeder Iteration aufgerufen
auch wenn die Array-Größe nicht jedes Mal überprüft wird, wird die Prozedur dennoch aufgerufen und zumindest die Variable, die die Array-Größe speichert, überprüft
Hier ist der Test, über den ich schreibe: Wir ändern die Größe des Arrays in der Schleife, die Schleife wird wie erwartet beendet, d.h. bei jeder Schleifeniteration wird die Array-Größe definiert, nachdem der Schleifenkörper ausgeführt wurde:
Geben Sie mir den vollständigen Code Ihres Tests.
Es ist klar, dass wir in der Ausgabe das Gleiche erhalten.
Aber dieses Speicherfragment wird anders geholt, das meine ich.
Das Beispiel von Igor ist nur eine Bestätigung dessen, was ich gesagt habe.
Und Sie selbst haben den Test durchgeführt, ich bin bei 110000000000000000000 so etwas kommt nicht vor.
Die Funktion ArraiSize(max) wird erweitert, sie nimmt eine Zelle mit der Längenangabe aus dem Array und gibt sie zurück, dieAdresse der Zelle, in der die Länge des Arrays aufgezeichnet ist
und was eine beliebige Variable ist, in diesem Fall size - ist die Adresseder Zelle, in der die Länge des Arrays gespeichert ist
Wir erhalten also dasselbe am Ausgang, und selbst wenn wir die Größe des Arrays im Verlauf der Schleife ändern, wird sich die Adresse pro Zelle weder im ersten noch im zweiten Fall ändern.
Da der mas-Wert immer statisch ist (es handelt sich nicht um einen Verweis), kann es keine andere Logik geben)))
Die Funktion ArraiSize(max) selbst sagt, dass wir einen Speicherbereich immax-Array verwenden sollten, der für die Array-Länge verantwortlich ist, und dies wird in der Kompilierungsphase ausgeführt - Funktionsbereitstellung
Diese Stellungnahme scheint verfrüht zu sein. Was genau hinter der Funktion ArraiSize passiert, ist unbekannt, nicht wahr? Es ist eine Blackbox in MQL. Es ist durchaus möglich, dass for (int i=0; i<ArraiSize(max); i++) zur Ausführung von mehreren Anweisungen führt. Eine Funktion kann zum Beispiel die Eingabeparameter überprüfen. Speichern - schiebt die Daten vom Stapel. Register speichern. Register wiederherstellen. Funktionsaufruf - Aufruf, dann Rückkehr. Was ich meine, ist, dass im Hintergrund viel passieren kann, was wir nicht sehen. Deshalb ist es besser, for (int i=0; i<size; i++) zu verwenden und sich nicht darauf zu verlassen, dass der Compiler tut, was wir von ihm erwarten.
Haben Sie den Test selbst gemacht, ich habe ihn nicht bei 110000000000000000000
Es wurde schon vor langer Zeit getestet, deshalb verwende ich Variablen nur in Schleifen.
Dies wurde schon vor langer Zeit getestet, daher verwende ich Variablen nur in Schleifen.
Zeigen Sie mir einen Test mit diesem Code
Zeigen Sie mir den Code-Test
Welcher Test? ))
Sie haben selbst beide Varianten der Schleifenbedingung gezeigt.
Igor hat den obigen Code ebenfalls angegeben.
Messen Sie einfach die Ausführung der Schleife mit der Variablen size und mit ArraySize() in der Schleifenbedingung.