Frage an #define-Experten - Seite 4

 
Alexandr Andreev:

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

Ich sehe keinen Sinn darin, die Prüfmethodik zu erörtern - sie ist sehr lang und notwendig.
 
Roman:

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

 
Igor Makanu:

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

Ich sehe keinen Sinn darin, die Prüfmethodik zu erörtern - sie ist sehr lang und notwendig.

dann einige Probleme mit dem Gebäude....

 
Alexandr Andreev:

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.

 
Alexandr Andreev:

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:

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000);
   int cnt = 0;
   for(int i = 0; i < ArraySize(arr); i++)
   {
      ArrayResize(arr, sz--);
      cnt++;
   }
   printf("cnt = %i", cnt);   //cnt = 50001
}
 
Igor Makanu:

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.

Roman:

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.

Genauer gesagt, ich habe es überhaupt nicht in allen Tests, auch beiLONG_MAX Wiederholungen
 
Alexandr Andreev:

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.

 
Alexandr Andreev:

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.

 
Roman:

Dies wurde schon vor langer Zeit getestet, daher verwende ich Variablen nur in Schleifen.

Zeigen Sie mir einen Test mit diesem Code

 
Alexandr Andreev:

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.