Frage an #define-Experten - Seite 5

 
Alexandr Andreev:

Geben Sie mir den vollständigen Code Ihres Tests

Bitte sehr, aber ich sehe keinen Sinn darin, rand() noch einmal zu diskutieren, alternativ kann man es durch eine inc++ Variable ersetzen

#define    SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count&&!_StopFlag;_i++){EX;} \
                                              printf("%s: loops = %llu seconds=%.4f",msg,count,(double)(GetTickCount()-mss)/1000000.0);}



//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize(arr1, 100);
   int cnt2 = ArrayResize(arr2, 200);
   int cnt3 = ArrayResize(arr3, 300);
   ulong sum = 0;

   SpeedTest(3,"ArraySize",
      for(int i = 0; i < ArraySize(arr1); i++)
      {
         for(int j = 0; j < ArraySize(arr2); j++)
         {
            for(int k = 0; k < ArraySize(arr3); k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )
   
   SpeedTest(3,"cnt",
      for(int i = 0; i < cnt1; i++)
      {
         for(int j = 0; j < cnt2; j++)
         {
            for(int k = 0; k < cnt3; k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )

}


Ja... Ich habe einen Fehler in meinem Code, ich will die Zeit in Sekunden ausgeben, aber ich bekomme 10 mal mehr, ich habe es richtig durch 1 000 000 geteilt, wer kann mir sagen, was der Grund ist?

 
Igor Makanu:

Bitte sehr, aber ich sehe keinen Sinn darin, rand() noch einmal zu diskutieren, alternativ kann man es durch eine inc++ Variable ersetzen


Ja... Irgendein Fehler in meinem Code, ich will die Zeit in Sekunden ausgeben, aber ich bekomme 10 mal mehr, ich habe es richtig durch 1 000 000 geteilt, wer kann mir sagen, was der Grund ist?

BOMBE.

Hier ist Ihr Code, der beweist, dass es andersherum ist.

//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define    SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count&&!_StopFlag;_i++){EX;} \
                                              printf("%s: loops = %llu seconds=%.4f",msg,count,(double)(GetTickCount()-mss)/1000000.0);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize(arr1, 100);
   int cnt2 = ArrayResize(arr2, 200);
   int cnt3 = ArrayResize(arr3, 300);
   ulong sum = 0;

   
   SpeedTest(3,"cnt",
      for(int i = 0; i < cnt1; i++)
      {
         for(int j = 0; j < cnt2; j++)
         {
            for(int k = 0; k < cnt3; k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )

   SpeedTest(3,"ArraySize",
      for(int i = 0; i < ArraySize(arr1); i++)
      {
         for(int j = 0; j < ArraySize(arr2); j++)
         {
            for(int k = 0; k < ArraySize(arr3); k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )
}
 
Alexandr Andreev:

BOMBE

Hier ist Ihr Code, der das Gegenteil beweist.

Ich habe die Schecks einfach umgedreht.

 
Alexandr Andreev:

Ich habe gerade die Schecks ausgetauscht

2020.11.02 21:01:38.590 22222 (USDCHF,H1) cnt: Schleifen = 1000 Sekunden=821.7159

2020.11.02 21:01:52.353 22222 (USDCHF,H1) ArraySize: Schleifen = 1000 Sekunden=807.9415


Daraus ergibt sich, dassArraySize schneller ist als die Verwendung einer Variablen =))) etwas ist falsch mit dem Test
 
Roman:

Welcher Test? ))
Sie selbst haben beide Varianten der Zyklusbedingung gezeigt.
Igor hat den obigen Code ebenfalls angegeben.
Messen Sie einfach die Leistung der Schleife mit variabler Größe und mit ArraySize() in der Schleifenbedingung.

Beweisen Sie mir das Gegenteil)

denn in meinem Test sind sie identisch

 
Alexandr Andreev:

Ich habe die Schecks einfach umgedreht.

Ja, das müssen Sie tun.

Diesmal war ich zu faul.

Ich habe die Tests in eine externe Schleife verpackt und sie so erhalten:

2020.11.02 22:06:43.557 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=117.4626

2020.11.02 22:06:58.328 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=102.7337

2020.11.02 22:07:13.075 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=87.9782

2020.11.02 22:07:27.850 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=73.2461

2020.11.02 22:07:42.598 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=58.4859

2020.11.02 22:07:57.380 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=43.7522

2020.11.02 22:08:12.891 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=28.9861

2020.11.02 22:08:28.874 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=13.4910

 
Igor Makanu:

Ja, es muss getan werden.

Diesmal war ich zu faul.

Ich habe die Tests in eine externe Schleife eingeschlossen und erhalte Folgendes

2020.11.02 22:06:43.557 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=117.4626

2020.11.02 22:06:58.328 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=102.7337

2020.11.02 22:07:13.075 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=87.9782

2020.11.02 22:07:27.850 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=73.2461

2020.11.02 22:07:42.598 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=58.4859

2020.11.02 22:07:57.380 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=43.7522

2020.11.02 22:08:12.891 SpeedTst (EURUSD,H1) ArraySize: Schleifen = 1000 Sekunden=28.9861

2020.11.02 22:08:28.874 SpeedTst (EURUSD,H1) cnt: Schleifen = 1000 Sekunden=13.4910

Tauschen Sie sie jetzt in der Schleife aus und lassen Sie sich überraschen

 
Alexandr Andreev:

Tauschen Sie sie nun in der Schleife aus und Sie werden überrascht sein

Das wird mich nicht überraschen, denn ich weiß, dass der Compiler den Code im laufenden Betrieb optimieren kann.

aber imho sollte man in verschachtelten Schleifen trotzdem nicht unnötig ArraySize() aufrufen.

for(int i = ArraySize(arr)-1; i >=0 ; i--)

Natürlich kann das manchmal unbequem sein, deshalb mache ich die Schleife über eine temporäre Variable - Ihre Version № 2

imho ist es zuverlässig und Sie verstehen, was passieren wird

 

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. Nur als ein Beispiel wurde ArraySize

Das Ergebnis;

for (int i=0; i<ArraySIze(mas); i++) == for (int i=0; i<size; i++)


Fügen wir jedoch die Initialisierung der Variablen size zum zweiten Teil hinzu, dann übernimmt die erste Methode die Führung für die Zeit der Initialisierung dieser Variablen und ihrer Gleichsetzung mit dem Wert.

 

Wenn Sie die Größe von Arrays im Hauptteil der Schleife ändern, funktioniert die fliegende Optimierung nicht

Ändern Sie also den Code:

for(int loop=0; loop <5;loop++)
   {
   int cnt1 = ArrayResize(arr1, 100+loop);
   int cnt2 = ArrayResize(arr2, 200+loop);
   int cnt3 = ArrayResize(arr3, 300+loop);
   
   SpeedTest(3,"cnt",
.....

Alexandr Andreev:

dann hat die erste Methode Vorrang, denn die Zeit, in der diese Variable initialisiert und mit einem Wert gleichgesetzt wird, macht sich nur bei hohen Wiederholungen bemerkbar

es funktioniert nicht

Laufzeit-Optimierung wird an der Spitze stehen

Sie können solche einfachen Mashidas nicht ohne den Profiler testen, im Allgemeinen können Sie in einer Schleife schreiben, oder Sie können im Tester testen, Geschwindigkeit ist dafür wichtig