Fehler, Irrtümer, Fragen - Seite 2878

 
Igor Makanu:

welche Konvertierungsvariante bei der Optimierung schneller funktionieren wird

Diese Funktion wird nur einmal pro Durchgang aufgerufen. Es macht also keinen Unterschied.

 
fxsaber:

Diese Funktion wird nur einmal für die gesamte Passage aufgerufen. Es macht also keinen Unterschied.

also ja... Aber ich werde es für ein paar Tage für die Optimierung laufen, ich möchte die Leistung in irgendeiner Weise ..... messen, obwohl ich vermute, dass Variante 1 effizienter sein wird, wird es nicht 100500 mal das Kopieren in Arrays sein

 
Igor Makanu:

ja... Aber ich werde den Computer für ein paar Tage laufen lassen, um es zu optimieren, ich möchte die Leistung in irgendeiner Weise ..... messen, obwohl ich vermute, dass Option 1 effizienter sein wird, wird es nicht 100500 Mal das Kopieren in Arrays sein

Variante 2 ist also höchstwahrscheinlich schneller, aber wie Sie bereits sagten, spielt das keine Rolle.
 
TheXpert:
Union ist nicht das Kopieren in Arrays, es ist unterschiedliche Interpretation des gleichen Speicherplatzes. so die 2. Option ist wahrscheinlich schneller, aber wie oben erwähnt, es spielt keine Rolle.
Die Union ist nicht so schnell, wie es scheint. Leider.
Ich tippe auf den ersten.
 
Igor Makanu:

ja... Aber ich werde den Computer für ein paar Tage laufen lassen, um es zu optimieren, ich möchte die Leistung in irgendeiner Weise ..... messen, obwohl ich vermute, dass Option 1 effizienter sein wird, wird es nicht 100500 Mal das Kopieren in Arrays sein

Es gibt eine alte Methode, die Geschwindigkeit zu messen.

in Anlehnung an

for (int i=0; i< 1000000; i++) {unser Code1}....
for (int i=0; i< 1000000; i++) {unser Code2}....

 
Nikolai Semko:
Union ist nicht so schnell, wie es klingt. Ich setze auf den ersten.

Binäre Operatoren sind um ein Vielfaches schneller als der if-Operator, auch wenn der zweite Operator ihn nicht hat.

 

überprüft:

#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 ms=%llu",msg,count,GetMicrosecondCount()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   SpeedTest(10, "tst 1 : ",
   {
      ushort in01A = (ushort)rand();
      ushort in01B = (ushort)rand();
      ushort in02A = (ushort)rand();
      ushort in02B = (ushort)rand();
      ushort in03A = (ushort)rand();
      ushort in03B = (ushort)rand();
      ushort in04A = (ushort)rand();
      ushort in04B = (ushort)rand();
      ushort in05A = (ushort)rand();
      ushort in05B = (ushort)rand();
      uint param[5];
      param[0] = (uint)in01A << (sizeof(ushort) * 8) | in01B;
      param[1] = (uint)in02A << (sizeof(ushort) * 8) | in02B;
      param[2] = (uint)in03A << (sizeof(ushort) * 8) | in03B;
      param[3] = (uint)in04A << (sizeof(ushort) * 8) | in04B;
      param[4] = (uint)in05A << (sizeof(ushort) * 8) | in05B;
      for(int i = 0; i < 5; i++) sum += param[i];
   });
//--   
   sum = 0;
   union ushortTouint
   {
      uint param[5];
      ushort in[10];
   }U;
   SpeedTest(10, "tst 2 : ",
   {
      ushort in00 = (ushort)rand();
      ushort in01 = (ushort)rand();
      ushort in02 = (ushort)rand();
      ushort in03 = (ushort)rand();
      ushort in04 = (ushort)rand();
      ushort in05 = (ushort)rand();
      ushort in06 = (ushort)rand();
      ushort in07 = (ushort)rand();
      ushort in08 = (ushort)rand();
      ushort in09 = (ushort)rand();
      ushortTouint u;
      u.in[0] = in00;
      u.in[1] = in01;
      u.in[2] = in02;
      u.in[3] = in03;
      u.in[4] = in04;
      u.in[5] = in05;
      u.in[6] = in06;
      u.in[7] = in07;
      u.in[8] = in08;
      u.in[9] = in09;
      for(int i = 0; i < 5; i++) sum += u.param[i];
   });

}

2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000000 ms=10864370

2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000000 ms=10862287

der Unterschied nicht signifikant ist, ist es sehr wahrscheinlich, dass die Ergebnisse umgekehrt ausfallen, wenn man die Tests in umgekehrter Reihenfolge durchführt

nicht kritisch

 
Igor Makanu:

kein signifikanter Unterschied besteht, ist es sehr wahrscheinlich, dass die Ergebnisse umgekehrt ausfallen, wenn Sie die Tests vertauschen

Es ist sehr wahrscheinlich, dass der Compiler für beide Fälle den gleichen Code erzeugt hat. In diesem Fall wählen Sie einfach den, der Ihnen subjektiv besser gefällt

 
Igor Makanu:

überprüft:

2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000000 ms=10864370

2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000000 ms=10862287

der Unterschied nicht signifikant ist, ist es sehr wahrscheinlich, dass die Ergebnisse umgekehrt ausfallen, wenn man die Tests in umgekehrter Reihenfolge durchführt

nicht kritisch

Das Skript hier zeigt, dass die Zeit für die Erstellung von Zufallszahlen ungleichmäßig sein kann und von der Größe der erstellten Variablen abhängt)))

Und für den Code, den wir für diese Anzahl von Wiederholungen benötigen, brauche ich 0 ms.

Immer noch keine Antwort.

oder der Code-Optimierer schneidet etwas Unnötiges heraus
 
Alexandr Andreev:

Es scheint ein Skript zu geben, das zeigt, dass das Timing der Zufallszahlengenerierung ungleich sein kann

nein rand() ist eine normale Funktion, sie funktioniert immer gleich

Aber beim Testen der Geschwindigkeit, wenn Sie es mit Konstanten initialisieren, werden die Tests während der Ausführung "beschleunigen" - Code-Optimierung in MQL während der Laufzeit ist gut

im Allgemeinen wurde sie mehrmals überprüft

Alexandr Andreev:

und es hängt viel von der Größe der erstellten Variablen ab)))

Natürlich ist die Zuweisung von Speicher zeitaufwendig, ich habe es überprüft, ich teste sowohl dynamisch erstellte Objekte (neue Zeiger) und nur Objekte im lokalen Bereich, der Test erstreckt sich 100500 Mal pro neue + löschen

die ganze Frage war, weil in der Tester im globalen Bereich Speicher zu Variablen einmal und nicht jeder Durchlauf zugeordnet ist - aber ich brauche uint Arrays, so dass ich mit diesem Skript getestet, nicht wie ich es das erste Mal geschrieben

Alexandr Andreev:

Und der Code, den wir für diese Anzahl von Wiederholungen benötigen, dauert 0 ms

immer noch keine Antwort

Entweder kürzt der Code-Optimierer etwas Unnötiges.

Haben Sie mein Skript verwendet? - entweder haben Sie nicht bis zum Ende des Tests gewartet und unterbrochen oder Sie haben ulong überlaufen lassen - der erste Makroparameter ist 10^ count



Andrei Trukhanovich:

Es ist sehr wahrscheinlich, dass der Compiler für beide Fälle den gleichen Code erzeugt hat. In diesem Fall wählen Sie einfach den, der Ihnen subjektiv am besten gefällt.

ja, vielleicht schon

das ist, was ich gefragt habe - ich habe oft gelesen, dass moderne Prozessoren mehr als eine elementare Operation pro Takt ausführen können, indem sie die Befehlspipeline optimieren .... viel Bla-bla-bla... und der Punkt ist, dass die arithmetischen Anweisungen vom Prozessor in einer unvorhersehbaren Anzahl von Taktzyklen ausgeführt werden

Was die Verzweigungen und Speicherzuweisungen betrifft, so werden sie vom Prozessor sehr schlecht optimiert, also suchen Sie nicht nach Optimierungen bei der Vereinfachung der Arithmetik, sondern versuchen Sie, möglichst linearen Code mit minimalen Verzweigungen zu schreiben, und Variablen sollten besser deklariert und Werte direkt vor den Berechnungen zugewiesen werden, damit die Befehlspipeline und die Cache-Sampling-Vorhersage diesen Code optimieren können


D.h. die Abtastung der Werte von Elementen im Array (Adressierung) ist höchstwahrscheinlich nicht entscheidend für die Geschwindigkeit - ich dachte, es gäbe einen Verschiebungsvorteil gegenüber Union, es stellt sich heraus, dass es überhaupt keinen Unterschied gibt

Grund der Beschwerde: