Fehler, Irrtümer, Fragen - Seite 2165
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich erhalte kein Optimierungsdiagramm für negative Werte.
Die Daten sind in den Optimierungsergebnissen verfügbar.
Versuchen Sie, negative Werte in Ihren EAs einzustellen. Die Werte können * -1 sein, um zu prüfen.
Eine Überprüfung ergab dies:
Dieser Code wird zu folgendem SSE-Assembler-Code:
Das ist wirklich ein Kunstwerk. 8 Wurzeln wurden in 4 Aufrufen einer Assembler-Anweisung berechnet. Zwei doppelte Zahlen werden in einem Aufruf ausgewertet.
Die allgemeine Schlussfolgerung: Die Mathematik hat in MQL5 dank der perfekten Optimierung gewonnen. Nicht die Arrays verlieren hier, sondern die Mathematik gewinnt.
Vielen Dank für die wertvollen Informationen.
Die Nachricht ist natürlich viel erfreulicher. Das ist wirklich cool!
Ich habe schon immer gesagt, dass MQs etwas Schönes sind!
Aber mir ist auch klar, dass man beim Mischen von Datentypen sehr vorsichtig sein muss. Aber Vorsicht ist besser als Nachsicht.
Es wäre schön, von den Entwicklern diesbezüglich einen Ratschlag zu erhalten.
Jetzt werde ich mit den Typen von normalen Variablen und Arrays experimentieren. Ich bin gespannt, was dabei herauskommen wird.
Ich habe ein wenig experimentiert.
Ich scheine das Puzzle immer noch nicht zusammensetzen zu können.
Ich habe zwei Varianten gemacht. Die erste - alles in den Typ int konvertiert. Die zweite - zu verdoppeln.
Ja, es ist ein bisschen schneller geworden. Aber die Hauptbremsen sind immer noch vorhanden.
Hier ist der Hauptbremsblock mit der int-Variante:
Es hat nur den Typ int und keine Typenmischung. Das SQRT-Array selbst ist zu int geworden.
Er arbeitet nur 10 % schneller.
Ähnlich verhält es sich mit der doppelten Variante.
Nun, alles ist identisch - nur im ersten Fall wird die Funktion sqrt() berechnet und es gibt eine Typenvermischung.
Der zweite Fall hingegen bezieht sich auf ein int-Array, und es gibt keine Typenmischung, so dass theoretisch nur ALU verwendet werden sollte.
Aber der zweite Weg ist dreimal langsamer. Nun, was auch immer der Grund ist, es ist die Anordnung.
Es gibt noch eine weitere wichtige Sache.
Im Beispiel von int, wenn die Leinwand die Größe 100x100 hat, d.h. mit folgenden Parametern
erhalten wir einen Geschwindigkeitsvorteil beim Zugriff auf das Array.
D.h. wenn wir ein SQRT-Array der Größe 20 000 verwenden, gewinnen wir 15-20%, und wenn wir ein Array der Größe 3 000 000 verwenden, verlieren wir 200%, trotz absolut identischer Mathematik.
Die Größe des Feldes ist also die Ursache für das Bremsen?
Die Menschen sind schon lange nicht mehr in der Lage, die Ergebnisse moderner C++-Compiler zu verstehen.
Außerdem hat man ein Durcheinander von Code, was bedeutet, dass man fast keine Möglichkeit hat, naive Axiome zu erstellen, die besagen: "Wenn diese Bedingungen erfüllt sind, dann ist das Ergebnis dies". Das heißt, die daraus resultierende Optimierung wird alles so umgestalten, dass Ihre Hypothesen selbst bei geringfügigen Änderungen des Codes zu zig Prozent anderen Ergebnissen führen werden.
Schauen Sie sich noch einmal an, wie Sie 8 Wurzeln in 4 Assembler-Befehle packen und stellen Sie fest, dass Sie keine Chance haben, Ihre Logik zu behaupten, zu fordern oder zu appellieren. Optimierer haben lange Zeit auf einem unerschwinglichen Niveau gearbeitet, das für Programmierer unerreichbar war.
Die Art und Weise, wie der Compiler die Wurzeln zerlegt, ist eine Kunst. Und Sie versuchen, es mit Arrays zu schlagen, ohne auch nur die einfachste Einschränkung zu verstehen - das Lesen aus einem Array ist bereits ein Fehler. Perfekte Registerarbeit und Batch-Berechnung von Wurzeln vs. Verzweigungen (Strafen) und Klettern in den Speicher mit häufigen Cache-Misses.
Sie fragen, "warum es bei kleinen Puffern schneller ist und bei großen Puffern kläglich versagt", weil Sie keine Ahnung von L1/L2/L3-Caches der CPU haben. Wenn man in den Cache kam, wurde er schnell gezählt. Nicht gefangen - warten Sie ein paar Dutzend Zyklen des Lesens von Daten aus dem oberen Cache oder Speicher.Die Menschen sind schon lange nicht mehr in der Lage, die Ergebnisse moderner C++-Compiler zu verstehen.
Außerdem hat man ein Durcheinander von Code, was bedeutet, dass man fast keine Möglichkeit hat, naive Axiome zu erstellen, die besagen: "Wenn diese Bedingungen erfüllt sind, dann ist das Ergebnis dies". Das heißt, die daraus resultierende Optimierung wird alles so umgestalten, dass Ihre Hypothesen selbst bei geringfügigen Änderungen des Codes zu zig Prozent anderen Ergebnissen führen werden.
Schauen Sie sich noch einmal an, wie Sie 8 Wurzeln in 4 Assembler-Befehle packen und stellen Sie fest, dass Sie keine Chance haben, Ihre Logik zu behaupten, zu fordern oder zu appellieren. Optimierer haben lange Zeit auf einem unerschwinglichen Niveau gearbeitet, das für Programmierer unerreichbar war.
Ich kann Ihre VS-Vergleichsergebnisse sehr gut sehen und bin sehr zufrieden damit.
Aber die Frage bleibt.
Ich entschuldige mich für den chaotischen Arbeitscode, aber wir sprechen nur über diesen Abschnitt des Codes und vergleichen die beiden Ausführungsoptionen:
Hier gibt es keinen Müll.
Sie sagten: "Die Optimierung des dynamischen Array-Zugriffs ist hervorragend, mehr als lobenswert."
Aber... siehe meine vorherige Nachricht.
Wie erklären Sie sich mein letztes Experiment?
"Das heißt, wenn wir ein SQRT-Array der Größe 20.000 verwenden, haben wir einen Gewinn von 15-20%, und wenn wir ein Array der Größe 3.000.000 verwenden, verlieren wir 200% mit genau der gleichen Mathematik.
Die Größe des Feldes ist also die Ursache für die Bremsen?"
Lesen Sie meine vorherige Antwort sorgfältig durch - sie ist vollständig und enthält eine genaue Antwort.
Ich erkläre Ihnen Ihre Fragen ganz einfach: Lesen Sie fünf technische Artikel über die Entwicklung von Prozessoren im Hinblick auf ihre Leistung und die Faktoren, die sie beeinflussen. Ohne das kann man keine Diskussion führen, denn man muss die Grundlagen erklären.
Die Art und Weise, wie der Compiler die Wurzeln zerlegt hat, ist eine Kunst. Und Sie versuchen, es mit Arrays zu schlagen, ohne auch nur die einfachste Einschränkung zu verstehen - das Lesen aus einem Array ist bereits ein Fehler. Perfekte Registerarbeit und Batch-Berechnung von Wurzeln vs. Verzweigungen (Strafen) und Klettern in den Speicher mit häufigen Cache-Misses.
Sie fragen: "Warum ist er bei einem kleinen Puffer schneller und versagt bei einem großen ohrenbetäubend?", weil Sie keine Ahnung von L1/L2/L3-Caches von Prozessoren haben. Wenn man in den Cache kam, wurde er schnell gezählt. Wenn Sie es nicht haben, müssen Sie einige Dutzend Zyklen warten, um Daten aus dem oberen Cache oder Speicher zu lesen.Lesen Sie meine vorherige Antwort aufmerksam - sie ist mit einer genauen Antwort abgeschlossen.
Lassen Sie mich Ihre Fragen ganz einfach erklären: Lesen Sie fünf technische Artikel über die Entwicklung von Prozessoren im Hinblick auf ihre Leistung und die Faktoren, die sie beeinflussen, mit Bedacht. Ohne das kann man keine Diskussion führen, denn man muss grundlegende Dinge erklären.
Juhu!!!
Endlich!
Du, Renat, solltest für alles gekniffen werden.
Für mich ist das Bild jetzt klarer.
Ich hatte Unrecht, als ich Ihrem Compiler die Schuld gab. Es tut mir leid, ich habe mich geirrt. Ich hätte vermuten können, dass der Grund dafür in den begrenzten Caches des Prozessors liegt. Ich kenne mich wirklich schlecht mit modernen Prozessoren aus, und ich muss unbedingt darüber lesen.
Trotzdem habe ich nicht umsonst diesen Code geschrieben - Laborratte - und diese Welle gemacht.
Für die Programmierer, die diesen Thread lesen, werde ich also zusammenfassen, was ich persönlich als Ergebnis dieser Welle herausgefunden habe:
Ich habe meinen Code auf der Grundlage dieser Informationen korrigiert. Ich habe oft die Größe von Arrays missbraucht.
Ich danke Ihnen allen!
Woher weiß ich, ob die Fadenkreuztaste gedrückt oder losgelassen ist?
Sie können das Drücken des Mausrads auffangen, aber wie können Sie das tun, wenn die Maus nicht benutzt wird?
Woher weiß ich, ob die Fadenkreuztaste gedrückt oder losgelassen ist?
Sie können das Klicken des Mausrads auffangen, aber was ist, wenn die Maus nicht in Gebrauch ist?
Wie wäre es, sie zu erzwingen oder bei Bedarf zu verschieben?
DIAGRAMM_FADENKREUZ_WERKZEUG
Aktivieren/Deaktivieren des Zugriffs auf das "Fadenkreuz"-Werkzeug durch Drücken der mittleren Maustaste
bool (Standardwert true)
Kann sie notfalls erzwungen oder zurückgedrängt werden?
DIAGRAMM_FADENKREUZ_WERKZEUG
Aktivieren/Deaktivieren des Zugriffs auf das "Fadenkreuz"-Werkzeug durch Drücken der mittleren Maustaste
bool (standardmäßig true)
Soweit ich weiß, wird damit nur das Werkzeug aufgerufen, aber nicht ausgeschaltet.