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

 
Igor Makanu:

wenn ArrayCopy() auf die gleiche Weise wie Cysh memmove() ausgeführt wird,

Ich denke, die Geschwindigkeit von ArrayCopy() hängt von der Geschwindigkeit der Speicherzuweisung ab, wenn der Zwischenpufferspeicher zum Kopieren bereit ist, wird ArrayCopy() sehr schnell ausgeführt, wenn der Speicher nicht zugewiesen ist, werden Sie Anfragen an das Betriebssystem starten, um Speicher zuzuweisen

Sie können versuchen, es zu testen - machen Sie einen Aufruf von ArrayCopy() mit einer großen Datenmenge, wodurch der Pufferspeicher für das Swapping vorbereitet wird, und machen Sie dann eine Schleife mit ArrayCopy() mit einer kleineren zu kopierenden Datenmenge und messen Sie dann die Geschwindigkeit

In unserem aktuellen Beispiel wird das Kopieren in ein statisches Array ausgeführt, aber im Allgemeinen ist es natürlich interessant, wenn ArrayCopy langsamer ist als ein einfaches for. Wenn Sie Speicher zuweisen müssen, müssen Sie es sowieso tun, egal wie Sie es tun.

 
Ilya Malev:

In unserem aktuellen Beispiel wird in ein statisches Array kopiert, aber im Allgemeinen ist es natürlich interessant, wenn ArrayCopy langsamer ist als simple for. Wenn wir Speicher zuweisen müssen, müssen wir das sowieso tun.

Es spielt keine Rolle, ob statisch oder dynamisch, wir wissen nicht, wie ArrayCopy() implementiert ist, ich habe nur angenommen, dass es ein "Wrapper" über Standard-Cish-Funktionen ist, memmove() funktioniert normalerweise über zusätzliche Puffer... nun, wie üblich, so wurde es vorher geschrieben, es ist schwer zu sagen, wie und welcher Compiler arbeitet

SZY: Ich weiß einfach nicht, wie man die Laufzeit in MQL testet ((( - ich habe es ein paar Mal versucht, ich glaube, ich habe Beispiele aus der Hilfe genommen, die Ergebnisse sind irgendwie sehr unterschiedlich, und ich habe diese Frage aus der Notwendigkeit heraus ignoriert - ich teste die Leistung nicht, ich schaue normalerweise im Profiler, was und wie in der Zeit ausgeführt wird

 
Igor Makanu:

Ich weiß nur nicht, wie man die Ausführungsgeschwindigkeit in MQL ((( - Ich habe es ein paar Mal versucht, ich glaube, ich habe Beispiele aus der Hilfe, aber die Ergebnisse waren sehr unterschiedlich aus irgendeinem Grund, und ich gab auf dieses Problem, weil ich nicht die Leistung testen, ich in der Regel den Profiler verwenden , um zu sehen, wie und was in der Zeit ausgeführt wird

Hier ist der einfachste Weg, den ich oben verwendet habe

#property strict

#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}

void OnStart()
 {
  int arr1[100]={0},arr2[100]={0};
  test(7,"Копирование через ArrayCopy",ArrayCopy(arr1,arr2))
  test(7,"Копирование через for",for(int i=0;i<100;i++)arr1[i]=arr2[i])
 }  


 
Ilya Malev:

Hier ist die einfachste Methode, die ich oben verwendet habe


Danke, ich hab's, ich werde es morgen testen

 
Ilya Malev:

Ja, dies wird viel schneller funktionieren (wo möglich ersetzt durch ArrayCopy, der Rest ist derselbe):

Wie gesagt, ich habe das Erste geschrieben, was mir in den Sinn kam, ohne irgendwelche Tests))

Diese Variante unterscheidet sich nicht von meiner. Die Messungen (Mindestzeit von 10 Versuchen) beweisen es.

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber2
Time[TicksToIntArray(TicksIn,Array)] = 301036
IntArrayToTicks_fxsaber2
Time[IntArrayToTicks(Array,TicksOut)] = 315109
true

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 216101
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 203610
true

https://www.mql5.com/ru/forum/287618/page14#comment_9810247
TicksToIntArray_antfx2
Time[TicksToIntArray(TicksIn,Array)] = 303656
IntArrayToTicks_antfx2
Time[IntArrayToTicks(Array,TicksOut)] = 312008
true

Sie können sehen, dass die Variante mit Zyklus schneller ist, weil der Zyklus 60 /4 = 15 Elemente umfasst.

Dateien:
 
fxsaber:

Diese Variante unterscheidet sich nicht von meiner.

Offenbar ja, nur der Strukturtyp und der Arraytyp sind willkürlich.

 
fxsaber:

Sie sehen, dass die Schleifenvariante schneller ist, weil die Schleife aus 60 /4 = 15 Elementen besteht.

Seltsamerweise bekam ich schneller als ArrayCopy mit den gleichen MqlTicks und int...

 
Ilya Malev:

Seltsamerweise bekam ich schneller als ArrayCopy mit den gleichen MqlTicks und int...

Ich führe es in MT5x64 aus.

Ilya Malev:

Offensichtlich ja, aber der Strukturtyp und der Arraytyp sind willkürlich.

Ich habe absichtlich den Normalfall vermieden, um mehr Menschen die Teilnahme zu ermöglichen.


Bislang

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 213426
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 202693
true

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber3
Time[TicksToIntArray(TicksIn,Array)] = 192362
IntArrayToTicks_fxsaber3
Time[IntArrayToTicks(Array,TicksOut)] = 159932
true
 
fxsaber:

Läuft in MT5x64.

Der allgemeine Fall wurde absichtlich umgangen, damit mehr Personen teilnehmen konnten.


Bis jetzt.

Ich schätze, Ihr Code ist bereits schneller :)

Ich muss dort eine Menge Service Code hinzufügen, um die Funktionalität von ArrayCopy zu verbessern (source start, dest start, count) und die Parameter auf Korrektheit zu überprüfen...

Im Allgemeinen haben Sie so viele tolle Werke/Bibliotheken, dass es seltsam ist, dass Sie im Forum nach der besten Lösung fragen und diskutieren :)

 
Ilya Malev:

Es ist seltsam, dass Sie im Forum nach der besten Lösung fragen und diskutieren :)

Ich brauche eine für die HistoryTicks-Bibliothek. Vielen Dank für Ihre Teilnahme.