Alternative Implementierungen von Standardfunktionen/-ansätzen - Seite 11

 
Nikolai Semko:
Können Sie mir bitte den Link schicken?

Ich habe es nicht behalten. Erwähnt im Forum hier. Ich habe selbst die Suchmaschinen durchforstet.

Вопрос к сообществу программистов по поводу авторства
Вопрос к сообществу программистов по поводу авторства
  • 2017.11.24
  • www.mql5.com
Общее обсуждение: Вопрос к сообществу программистов по поводу авторства
 
fxsaber:

Ich habe es nicht behalten. Erwähnt im Forum hier. Ich habe selbst die Suchmaschinen durchsucht.

Ich habe es gesehen. Ohne Pixel-Farbmischung ist das alles sehr primitiv.
Es ist nur so, dass alles, was ich in den Foren gefunden habe, Kindergartenniveau hatte. Und ich bin schon in der 5. Klasse.
 
Nikolai Semko:
Es ist nur so, dass alles, was ich in den Foren gefunden habe, Kindergartenniveau hatte. Und ich bin schon in der 5. Klasse.

Offensichtlich wurden alle diese Fahrräder viele Male überholt. Es wurden sogar Bücher veröffentlicht, bis hin zu asm-Implementierungen.

Heutzutage sind die Grundlagen schwer zu finden, da fast jeder für alle Gelegenheiten entsprechende APIs verwendet.

Sie müssen sich also nur in Foren anmelden und herumfragen.

 
fxsaber:

Offensichtlich wurden alle diese Fahrräder viele Male überholt. Es wurden sogar Bücher veröffentlicht, bis hin zu asm-Implementierungen.

Nun sind die Grundlagen schwer zu finden, da fast jeder für alle Gelegenheiten entsprechende APIs verwendet.

Sie müssen sich also nur in Foren anmelden und fragen.

Das ist das Problem: Es ist schwierig. Wie auch immer, ich konnte es nicht finden. Vielleicht habe ich nicht genau genug hingesehen. In den Foren schickt man Sie zu den geschlossenen Standardbibliotheken und fragt sich, warum Sie diese brauchen, wo doch alles verfügbar ist. Natürlich würde ich mir nicht den Kopf zerbrechen, wenn ich in Java, JavaScript und dergleichen schreiben würde. oder wenn der Marktplatz nicht benötigt wurde.
Ok, ich habe mich schon daran gewöhnt, dass ich in dieser Angelegenheit vorerst stolz allein dastehe. Ich werde fortfahren, außerdem habe ich praktisch keine weißen Flecken im Verständnis von fast jeder Umsetzung in dieser Richtung. Andererseits habe ich einige einzigartige Fähigkeiten erworben.
 
pavlick_:

Warum verwenden Sie nicht LONG_MAX/MIN? Das würde irgendwie schöner aussehen. Es sieht gut aus, finde ich. Ich habe Ihre Tests mit gcc gespielt (mit min Modifikation, natürlich, Compiler ist sehr alt 5.4.0, was ich zur Hand hatte):


Nun, ja, das ist nicht schön. AberLONG_MAX= 9223372036854775807 ist mehr als 9007199254740992. Und hexadezimale Form dieser Zahl - 0x20000000000000 wird beschimpft, weil es nur für ulong Typ sein muss. Ich weiß nicht einmal, wie ich es noch deutlicher machen kann. Ich kann nicht (ulong)(1<<53) schreiben, weil das eine zeitraubende Operation ist.

Der Typ double beginnt, ganze Zahlen ohne Nachkommastellen nicht ab demLONG_MAX-Wert, sondern ab der maximal möglichen Mantisse zu enthalten. Aber 53 Bits sind für die Mantisse erlaubt, d.h. 2^53=9007199254740992.

pavlick_:

Das Timing Ihres Codes schlägt fehl - die Ausgabe erfolgt in Millisekunden (nicht in Nanosekunden), und ich verstehe immer noch nicht, warum wir minus t0 brauchen.

t0 ist die Zeit eines vollen Zyklus von 1000000 Durchläufen der Summe der Primzahl-Doppelgänger

während t die Zeit desselben Zyklus der Summe derselben Doppelwerte ist, die jedoch durch die Funktionen ceil, ceil, round usw. geleitet werden.

Ich bin von der Logik ausgegangen, dass die Differenz (t-t0) die für diese Funktionen aufgewendete Nettozeit ist.

Eine größere Objektivität kann natürlich nur durch mehrere Messungen erreicht werden.

- Im Nanobereich rechne ich auf der Grundlage der Zeit, die benötigt wird, um eine von 1.000.000 Funktionen auszuführen. Genau in nano ist richtig.

pavlick_:

Ich lief Ihre Tests auf gcc (mit min Änderung, natürlich, Compiler ist sehr alt 5.4.0, was zur Hand war):

1. Kompilieren mit -O3.

2. Zusammenstellung mit -Ofast

Das hat sich herausgestellt. Dass der kompilierte MQL5-Code schneller läuft als sogar Ofast? Es ist schwer zu glauben, aber Sie müssen einen 32-Bit-Compiler verwendet haben.
 
Nikolai Semko:

Nicht (ulong)(1<<53) zu schreiben, da dies bereits eine zeitaufwändige Operation ist.

Diese Operation ist nicht zeitaufwendig, wie alle Operationen mit Konstanten, einschließlich Zeichenketten.

input long l = (ulong)1 << 53;
input string s = (string)__DATETIME__ + __FILE__;
 
fxsaber:

Diese Operation ist zeitlos wie alle Konstanten, einschließlich Zeichenketten.

Wow - cool! Danke. Und ich dachte, das zählt jedes Mal. Ja, das ist logisch, das kann man schon zur Kompilierzeit berechnen.
Nun, das war's dann:

double Ceil (double x) { return double((x>(long)1 << 53 || x<-(long)1 << 53 )?x:(x-(long)x>0)?(long)x+1:(long)x);}
double Round(double x) { return double((x>(long)1 << 53 || x<-(long)1 << 53 )?x:(x>0)?(long)(x+0.5):(long)(x-0.5));}
double Floor(double x) { return double((x>(long)1 << 53 || x<-(long)1 << 53 )?x:(x>0)?(long)x:((long)x-x>0)?(long)x-1:(long)x);}
2018.08.26 18:04:07.638 TestRound (EURUSD,M1)   Время цикла без округления = 1.302 наносекунд, сумма = 115583114403605978808320.00000000
2018.08.26 18:04:07.642 TestRound (EURUSD,M1)   Время выполнения функции ceil =  2.389 наносекунд, Контрольная сумма = 1.15583114403606 e+23
2018.08.26 18:04:07.644 TestRound (EURUSD,M1)   Время выполнения функции Ceil =  0.223 наносекунд, Контрольная сумма = 1.15583114403606 e+23
2018.08.26 18:04:07.648 TestRound (EURUSD,M1)   Время выполнения функции floor = 2.884 наносекунд, Контрольная сумма = 1.15583114403606 e+23
2018.08.26 18:04:07.649 TestRound (EURUSD,M1)   Время выполнения функции Floor = 0.122 наносекунд, Контрольная сумма = 1.15583114403606 e+23
2018.08.26 18:04:07.654 TestRound (EURUSD,M1)   Время выполнения функции round = 3.413 наносекунд, Контрольная сумма = 1.15583114403606 e+23
2018.08.26 18:04:07.656 TestRound (EURUSD,M1)   Время выполнения функции Round = 0.222 наносекунд, Контрольная сумма = 1.15583114403606 e+23
2018.08.26 18:04:07.656 TestRound (EURUSD,M1)   Идет бесконечный поиск расхождения по случайным числам double ... Прервите скрипт, когда надоест ждать

Es wäre jedoch korrekter,DBL_MANT_DIG anstelle von 53 zu schreiben

double Ceil (double x) { return double((x>(long)1 << DBL_MANT_DIG || x<-(long)1 << DBL_MANT_DIG )?x:(x-(long)x>0)?(long)x+1:(long)x);}
double Round(double x) { return double((x>(long)1 << DBL_MANT_DIG || x<-(long)1 << DBL_MANT_DIG )?x:(x>0)?(long)(x+0.5):(long)(x-0.5));}
double Floor(double x) { return double((x>(long)1 << DBL_MANT_DIG || x<-(long)1 << DBL_MANT_DIG )?x:(x>0)?(long)x:((long)x-x>0)?(long)x-1:(long)x);}

Fall des minimalen Gewinns, wenn alle Werte von double gebrochen sind.

2018.08.26 18:20:35.408 TestRound (EURUSD,M1)   Время выполнения функции sqrt = 1.083 наносекунд, сумма = 81969849.90928555
2018.08.26 18:20:35.413 TestRound (EURUSD,M1)   Время выполнения функции ceil =  3.579 наносекунд, Контрольная сумма = 5250492895.0
2018.08.26 18:20:35.416 TestRound (EURUSD,M1)   Время выполнения функции Ceil =  1.249 наносекунд, Контрольная сумма = 5250492895.0
2018.08.26 18:20:35.422 TestRound (EURUSD,M1)   Время выполнения функции floor = 3.931 наносекунд, Контрольная сумма = 5249492896.0
2018.08.26 18:20:35.424 TestRound (EURUSD,M1)   Время выполнения функции Floor = 0.513 наносекунд, Контрольная сумма = 5249492896.0
2018.08.26 18:20:35.427 TestRound (EURUSD,M1)   Время выполнения функции round = 1.519 наносекунд, Контрольная сумма = 5249992896.0
2018.08.26 18:20:35.429 TestRound (EURUSD,M1)   Время выполнения функции Round = 0.571 наносекунд, Контрольная сумма = 5249992896.0
Dateien:
TestRound.mq5  11 kb
 
Nikolai Semko:
Das hat sich herausgestellt. Dass der kompilierte MQL5-Code schneller arbeitet als sogar Ofast? Es fällt mir schwer zu glauben, dass Sie einen 32-Bit-Compiler gehabt haben müssen.

Ich habe das Minus t0 aus allem herausgenommen (ich dachte, es sei eine Art Fehler), und meine Ausgabe hat die gesamte Schleife gemessen, nicht nur einen einzigen Durchgang. Wenn wir in Ihre Form der Ausgabe in Nanosekunden pro Iteration umrechnen (in der ersten Zeile "Zykluszeit ohne Rundung" - wir haben die gleiche Zählweise), erhalten wir:

-O3
Время цикла без округления = 1.099 наносекунд, сумма = 1.15583114 e+23
-Ofast
Время цикла без округления = 0.552 наносекунд, сумма = 1.15583114 e+23

Es gibt nicht viel Beschleunigung auf gcc (und noch langsamer auf -Ofast). Auf mcc gibt es eine signifikante Beschleunigung nach Ihrem Test zu urteilen, aber:

haben Sie 985'651 von 1'000'000, d.h. fast alle Iterationen erfüllen die Bedingung x < MIN || x > MAX.


-Ofast deaktiviert alle inf/nan-Prüfungen, errno-Einstellung, d.h. die bloße Rundung auf der fpu bleibt erhalten. Und diese bloße Rundung kann nicht durch einen einfachen Vergleich von x < MIN || x > MAX überwunden werden.

 
pavlick_:

Es gibt nicht viel Beschleunigung auf gcc (und noch langsamer auf -Ofast). Auf µl ist das signifikant.

Aber es ist schwer zu sagen. Wir haben t0 für schöne Zahlen rausgeschmissen und 20-fache Differenz bekommen. Selbst minimaler zusätzlicher Code in Form einer Schleife (+t0) macht das schöne Ergebnis in mehreren Dutzend Mal zu weniger attraktiv in etwa zwei Mal. Und was kann man sagen, wenn es nicht nur eine Schleife ist, sondern ein echter Algorithmus, der etwas Nützliches tut? Der Unterschied wird überhaupt nicht sichtbar sein, er wandert irgendwo weit hinter dem Komma und wird kaum zu einem Engpass werden. In einer realen Anwendung sind Mutex-Pickup, CPU-Sperren und Speicherzuweisung viel kostspieliger als Rundungen. Alles in allem ist es das Risiko nicht wert, finde ich.

 
pavlick_:

Ja, der Unterschied wird überhaupt nicht sichtbar sein, liegt irgendwo weit hinter dem Komma und wird wahrscheinlich keinen Engpass darstellen. In einer realen Anwendung sind Mutex, CPU-Barrieren und Speicherzuweisung viel kostspieliger als Rundungen. Alles in allem ist es das Risiko nicht wert, finde ich.

Das trifft in 99 % der Fälle zu, ja.

Bevor Sie optimieren, sollten Sie sich vergewissern, dass Sie etwas zum Optimieren haben.

In meiner Praxis kann ich mich nur an einen einzigen Fall erinnern, in dem meine eigene Implementierung von atof wirklich geholfen hat. Obwohl ich den Eindruck hatte, dass es so war.

Und Sie sollten bedenken, dass jede Optimierung (außer ***) nicht kostenlos ist.