Ermitteln der Anzahl der Dezimalstellen beliebiger Zahlen (nicht nur Anführungszeichen) unter Umgehung von Digits() in MQL4 und MQL5 - Seite 21

 
Nikolai Semko:
Vorerst auf der Straße. Sie können es selbst ausprobieren. Die Idee ist, Unions mit Arrays von Strukturen unterschiedlicher Größe zu verwenden, z.B. 10, 100, 1000, 10000...
Dadurch wird die Schleife um Größenordnungen verkürzt und die Anzahl der ArrayCopy-Aufrufe um Größenordnungen reduziert.
Dies sollte der Memcopy-Variante sehr ähnlich sein.

Diese Idee wurde aufgegriffen. In diesem Fall

Sie können alles im Quellcode sehen.
 
fxsaber:

Diese Idee wurde aufgegriffen. Auf diese Weise

Sie können alles im Quellenbuch nachlesen.
Ja, ich habe es nachgeschlagen. Seltsam, dass es keine Auswirkungen hat.
 
Nikolai Semko:
Ja, ich habe es nachgeschlagen. Seltsam, dass es keine Wirkung hat.

Es gibt eine Zeile im Quelltext, die die Größe steuert

#define  CONVERT_AMOUNT 128

Sie können diesen Wert ändern und das Ergebnis sehen. Wenn der Wert größer als hundert ist, erhöht sich die Geschwindigkeit nicht. Das ist eigentlich leicht zu erklären, denn es werden insgesamt immer die gleiche Anzahl von Elementen kopiert. Und die Verzögerungen, die mit kleinen Kopierportionen verbunden sind, werden eliminiert.

 
fxsaber:

Ich fürchte, wir sind bereits auf maximale Leistung festgelegt.

Ja, ich stimme zu.
Ich habe es versucht - das gleiche Ergebnis wie in Ihrem TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4

 
Andrey Khatimlianskii:

Sie haben den Quellcode, Sie können ihn selbst messen.

Also messen Sie es. Ich bin mir ziemlich sicher, dass ich das nicht tue, also sehe ich keinen Grund, meine Zeit mit dem Artikel oder der Messung zu verschwenden.

 
fxsaber:

Ich fürchte, wir sind bereits an der Grenze der Leistungsfähigkeit angelangt.

Um ehrlich zu sein, bin ich sehr überrascht, dass sie es geschafft haben, so nah an memcpy heranzukommen. Das kann einfach nicht sein. Irgendetwas stimmt hier nicht.

 
fxsaber:

Ich fürchte, wir sind bereits auf die maximale Leistung festgelegt.

Ich glaube, ich verstehe einen schwerwiegenden Rechenfehler Ihrerseits.
Ihr BANCH wählt das Minimum von 50 absolut identischen Läufen aus.
Aber der Compiler ist ein großer Klugscheißer und faul. Es wird nicht 50 Mal die gleiche Aufgabe erledigen und den Code optimieren. Deshalb sollten Sie zumindest die Arrays bei jedem Durchlauf wechseln. Oder Sie können 50 durch 1 ersetzen und die Anzahl der Tests erhöhen. Dann werden die Ergebnisse ganz anders und objektiver sein.

2018.12.09 13:55:43.048 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9813963
2018.12.09 13:55:43.048 StructToArray__2        TicksToIntArray_thexpert
2018.12.09 13:55:43.296 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 247579
2018.12.09 13:55:43.296 StructToArray__2        IntArrayToTicks_thexpert
2018.12.09 13:55:43.544 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 247840
2018.12.09 13:55:43.634 StructToArray__2        true
2018.12.09 13:55:43.766 StructToArray__2        
2018.12.09 13:55:43.766 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:43.766 StructToArray__2        TicksToIntArray_fxsaber4
2018.12.09 13:55:44.118 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 351847
2018.12.09 13:55:44.118 StructToArray__2        IntArrayToTicks_fxsaber4
2018.12.09 13:55:44.452 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 334011
2018.12.09 13:55:44.548 StructToArray__2        true
2018.12.09 13:55:44.692 StructToArray__2        
2018.12.09 13:55:44.692 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:44.692 StructToArray__2        TicksToIntArray_semko
2018.12.09 13:55:45.037 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 344707
2018.12.09 13:55:45.037 StructToArray__2        IntArrayToTicks_semko
2018.12.09 13:55:45.373 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 336193
2018.12.09 13:55:45.462 StructToArray__2        true

Wenn der Unterschied zu memcpy 40% beträgt, ist es plausibler

Ich frage mich, ob die Komprimierung des Arrays eine Auswirkung haben wird. Ein Array von Ticks kann um den Faktor 10-12 komprimiert werden. Es stellt sich nur die Frage, ob dies zu einer Zeitersparnis beim Senden und Empfangen durch die Ressource führen wird.

Dateien:
 
Nikolai Semko:

Ich glaube, ich verstehe einen schwerwiegenden Rechenfehler von Ihnen.
Ihr BANCH wählt das Minimum von 50 absolut identischen Läufen.
Aber der Compiler ist ein großer Klugscheißer und faul. Es wird nicht 50 Mal die gleiche Aufgabe erledigen, sondern den Code optimieren.

Der Code ist so geschrieben, dass er genau das tut, was er tun soll. Der Compiler kann die Geschwindigkeit von memcpy nicht beeinflussen, aber die Ergebnisse der Durchläufe sind wie folgt

Eine Schleife mit einem Durchgang

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 235285
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 192509
true


Von 50

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 80970
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 81103
true
 
fxsaber:

Der Code ist so geschrieben, dass er genau das tut, was Sie wollen. Der Compiler ist nicht in der Lage, die Geschwindigkeit von memcpy zu beeinflussen, aber die Ergebnisse der Durchläufe sind

Eine Schleife mit einem Durchgang


Von 50.

Aber warum passiert das dann? Natürlich kann der Compiler den Prozess der Ausführung von memcpy nicht beeinflussen, aber er kann sich weigern, ihn auszuführen, indem er vorab gespeicherte Ergebnisse aus der ersten Berechnung zieht, wenn er weiß, dass sich keiner der berechneten Parameter während der Schleife ändert. So würde ich den Compiler selbst organisieren, um Programm-Alogismen zu beheben.
 
Ilya Malev:

Also messen Sie es. Ich bin mir ziemlich sicher, dass ich das nicht tue, also sehe ich keinen Grund, meine Zeit mit dem Artikel oder der Messung zu verschwenden.

Das muss ich nicht.

Grund der Beschwerde: