Fehler, Irrtümer, Fragen - Seite 2880

 
Igor Makanu:

keine

wenn es sich wiederholende Codeabschnitte gibt, werden Sie Optimierungsprüfungen durchführen!

Welchen Unterschied macht es aus, wie lange rand() ausgeführt wird?

Lassen Sie ihn 2/3 der Testzeit ausführen, Hauptsache, die rand()-Zeit ist konstant

Ihr MQL-Code wird die MQL-Funktionen des Systems verwenden, richtig? - Was nützt es, einen perfekten Code zu testen?

)) könnte der Geschwindigkeitsunterschied 4 Mal zugunsten einer der Methoden (1 bis 4) ausfallen, aber da die Rand-Operation 10 Mal langsamer ist als der Rest des Codes, wäre dieser Unterschied nicht sichtbar (11 bis 14)

 
Alexandr Andreev:

)) Der Geschwindigkeitsunterschied hätte 4 Mal zugunsten einer der Methoden ausfallen können (1 bis 4), aber da die Operation 10 Mal länger dauert als der Rest des Codes, wäre dieser Unterschied nicht sichtbar gewesen (11 bis 14)

nein, das kann nicht sein

der Unterschied ist sofort sichtbar

Überprüfen wir etwas, das die Entwickler in den Neuerungen angekündigt haben. Sie schreiben oft, dass die Zugriffszeit auf Zeitreihen für eine Funktion optimiert = lange Zeit nicht überprüft wurde

#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;} \
//+------------------------------------------------------------------+
void OnStart()
{
   double sum1 = 0.0;
   SpeedTest(7, "tst 1 : ",
   {
      sum1 += iOpen(NULL, 0, rand());
   });
//--
   double sum2 = 0.0;
   SpeedTest(7, "tst 2 : ",
   {
      double o[];
      CopyOpen(NULL, 0, rand(), 1, o);
      sum2 += o[0];
   });
   Print(sum1, " : ", sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1296043

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=359757

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1357325

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu:

Überhaupt nicht kritisch

Die Ausführungszeit von rand() ist konstant, höchstwahrscheinlich handelt es sich um eine gängige C++-Funktion, googeln Sie "rand c++ source code".

müssen Sie ihn initialisieren, aber wenn Sie ihn mit Konstanten initialisieren, kann es zu einer Optimierung kommen

Im Allgemeinen verstehe ich die Abneigung gegen rand() nicht.

eine Option ist die Initialisierung mit etwas wie diesem:

schnell sein würde.


Ihr Skript ausgeführt, imho nicht korrekt.

Die meiste Zeit wird für das Laden von Code in den Zwischenspeicher und dann in den Prozessor benötigt.

und fügen die Diskretion des Systemzeitgebers hinzu

bekommen wir... fast eine Zufallszahl.

Sie müssen es lange Zeit testen, etwa 100500 Mal, imho

rand() löscht das Ergebnis.
Auf meinem Computer dauert eine Schleifeniteration etwa 1,5 Nanosekunden.

Mit zwei rand() dauert eine Iteration doppelt so lange - bis zu fast 3 Nanosekunden. Sie sollten sich darüber im Klaren sein, dass in dieser Iteration zwei Zugriffe auf ein Element eines großen Arrays verschwinden werden, was ebenfalls ziemlich teuer ist.
Das bedeutet, dass etwa 2/3 der gesamten Iterationszeit auf zwei rands() entfällt. Natürlich habe ich mich ein wenig über "um eine Größenordnung" aufgeregt ))

Ich verstehe nicht, wie man in die Optimierung laufen kann, wenn ein vorbereiteter Array mit Zufallszahlen gefüllt wird.

Es wurde schon einmal über die Leistung von rand() diskutiert. Ich habe sogar selbst versucht, eine ähnliche Funktion zu schreiben.https://www.mql5.com/ru/forum/170952/page137#comment_12010041

#define  Num 10000000
#define  SpeedTest(msg,s,EX)  {ulong mss=GetMicrosecondCount(); EX \
                                    mss=GetMicrosecondCount()-mss;\
                                    printf("%-30s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   ushort in[];
   ArrayResize(in,Num*2);
   for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
   SpeedTest("test binary shift : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
   });
//+------------------------------------------------------------------+ 
   sum = 0;
   union ushortTouint
   {
      uint param;
      ushort in[2];
   } u;
   SpeedTest("test union : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=in[i+1];
      u.in[1]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum=0;
   SpeedTest("test binary shift + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=(ushort)rand()<<(sizeof(ushort)*8) | (ushort)rand();
   });
//+------------------------------------------------------------------+  
   sum = 0;
   SpeedTest("test union + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=(ushort)rand();
      u.in[1]=(ushort)rand();
      sum+=u.param;
   });
}

Ergebnis

2020.10.15 18:30:34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.763 TestMakanu (USDCAD,M1)  test union :                  10189 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.792 TestMakanu (USDCAD,M1)  test binary shift + rand() :  29103 µs; Сумма - 10741215942967312
2020.10.15 18:30:34.820 TestMakanu (USDCAD,M1)  test union + rand() :         28125 µs; Сумма - 10737655794873175
2020.10.15 18:30:37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.812 TestMakanu (USDCAD,M1)  test union :                  10334 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.840 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27495 µs; Сумма - 10739749025492645
2020.10.15 18:30:37.867 TestMakanu (USDCAD,M1)  test union + rand() :         26782 µs; Сумма - 10738717766184542
2020.10.15 18:30:40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.367 TestMakanu (USDCAD,M1)  test union :                  11354 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.395 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27637 µs; Сумма - 10738670876702722
2020.10.15 18:30:40.422 TestMakanu (USDCAD,M1)  test union + rand() :         26772 µs; Сумма - 10737441784096963
 

Ich denke, unterm Strich macht es fast keinen Unterschied, ob Sie union oder binary shift verwenden.
Ich verwende beide Methoden in meiner iCanvas-Bibliothek, um mit Farben zu arbeiten.

union argb {
   uint clr;
   uchar c[4];
};


Ich erinnere mich, ich habe auch einige Leistungstests durchgeführt und bin zu dem Schluss gekommen, dass es fast keinen Unterschied macht. Aber der Code mit union ist besser lesbar.
Ich muss zugeben, dass ich enttäuscht war, denn ich hatte einen spürbaren Leistungszuwachs mit Union erwartet.

 
Nikolai Semko:

Ich verstehe nicht, wie man eine Optimierung durchführen kann, wenn ein vorbereiteter Bereich mit Zufallszahlen gefüllt wird.

Ich gab Ihnen 2 Links auf der Hubr oben, der erste Artikel zeigt gut, wie eine normale Schleife sieht aus wie nach der Kompilierung

Ich sage nicht, dass Sie unbedingt zur Laufzeit-Optimierung zu bekommen, aber imho, wenn das Array nicht ändern, die im Wesentlichen eine konstante Speicherplatz mit einer konstanten Größe für die Schleife ist, ist es nicht eine Tatsache, dass die Optimierung nicht auftauchen wird auf irgendeine Art von Prozessor, und die Optimierung kann aus dem Compiler erwartet werden, als auch von dem Prozessor mit einem Cache


Nikolai Semko:

Ich denke, unterm Strich macht es fast keinen Unterschied, was man verwendet - Union oder binäre Verschiebung.

Ja, das stimmt, ich werde Shift verwenden, der Code ist lesbar, und es ist nicht nötig, einen neuen Datentyp einzuführen - union
 
Igor Makanu:

Ich gab Ihnen 2 Links auf der hbr oben, der erste Artikel zeigt gut, wie eine normale Schleife nach der Kompilierung aussieht

Ich sage nicht, dass Sie zur Laufzeit-Optimierung zu erhalten, aber imho, wenn das Array nicht ändern, die im Wesentlichen eine konstante Speicherplatz mit einer konstanten Größe für die Schleife ist, ist es nicht sicher, dass keine Optimierung auftauchen wird

Nach den Ergebnissen zu urteilen, gibt es keine Anzeichen für eine Optimierung

 
Nikolai Semko:

Die Ergebnisse erwecken überhaupt nicht den Eindruck einer Optimierung

ja

Der Streit geht nicht um einen bestimmten Code

aber in der Methodik der Prüfung, ich immer noch zu halten, was ich optimal testen, und rand(), obwohl es Verzerrungen einführt, aber es ist ein linearer Koeffizient, nicht proportional, dh die Genauigkeit ist nicht sehr wichtig, wenn es keinen Unterschied in der Geschwindigkeit von weniger als 5%, imho

 
Sehr geehrte Damen und Herren, kann mir jemand wenigstens eine Antwort auf diese Situation geben , die ich nicht verstehe?
 

Hallo zusammen!

Ich habe eine Frage, vielleicht an die MQL5-Entwickler, vielleicht weiß es jemand anders... Gibt es Pläne, ME Compiler/Code-Editor in gängige Entwicklungsumgebungen wie IDEA oder Visual Studio zu integrieren? Der Meta-Editor ist ein großes Problem für mich. Kein Blockzusammenbruch, keine automatischen Ersetzungsvorlagen (z.B. wenn Sie for(...) eingeben, bietet es Ihnen sofort an, ein Schleifenmuster und viele andere Dinge zu ersetzen), keine Hervorhebung verschiedener wichtiger Teile des Codes. Und so weiter und so fort. Ich will damit nicht sagen, dass moderne Roboter kompliziert sind, aber es handelt sich um große Projekte, bei denen die Anforderungen an das Code-Management und die Team-Entwicklungsfähigkeiten viel höher sind.

Keiner schreibt mehr seine eigenen Editoren und Compiler - alle geben sie auf und greifen auf fertige Lösungen von Microsoft, JetBrains und anderen zurück. Alle modernen Editoren verfügen über ein System von anpassbaren Plugins, die es Ihnen ermöglichen, ihnen alles hinzuzufügen, was Sie möchten. Die Aufgabe ist im Prinzip nicht schwierig.

 
Сергей Таболин:
Sehr geehrte Damen und Herren, gibt es jemanden, der mir eine Antwort auf diese Situation geben kann , die ich nicht verstehe?

Und Sie sollten die Programmierer noch mehr schikanieren. Dann werden Sie sicher Hilfe bekommen.