Mein Ansatz. Der Kern ist der Motor. - Seite 84

 
Maxim Kuznetsov:

Und ja, das Parsen von Texten in MQL macht viel Spaß :-) Nun, es ist nicht für das Parsen von Text gedacht. Ich meine, du kannst es, aber es ist ein Flop...

Arrays und Aufträge - das ist es, worum es bei MQL geht

Das ist es, wovon ich spreche... :)

 
Nikolai Semko:

Vielseitigkeit ist oft gleichbedeutend mit Trägheit, und das gilt erst recht für Saiten.
Ich möchte Ihnen ein Beispiel nennen.

Ich habe einmal eine von einer Krypto-Börse empfangene Zeichenkette mit WebRequest geparst. Und ich habe es mit derJSON-Bibliothek von Sergeev geparst, die er aus der "High-Speed-C++-Bibliothek" portiert hat. Und ich habe festgestellt, dass die Geschwindigkeit sehr unbefriedigend ist. Dort wurde alles über "universelle" Strings abgewickelt.

Ich verstand, dass der Grund für die niedrige Geschwindigkeit Stringing war und wollte die Verwendung von String-Funktionen vermeiden und schrieb eine Funktion, die direkt vom uchar-Array parst. Das Ergebnis hat mich ziemlich überrascht. Meine Parsing-Geschwindigkeit war.... (Trommelwirbel) 800 Mal schneller. Wenn das Parsen einer ganzen Zeichenkette durch JSON 0,3 Sekunden dauert, hat meine Funktion sie in weniger als einer halben Millisekunde geparst.

Hier ist ein Beispiel für mein Parsing über uchar-Array.

Die Kernaussage Ihres Vorschlags lautet wie folgt:

  1. Wir nehmen einen String (640 Zeichen) und senden ihn an die Funktion StringToChar();
  2. Wir holen das Array und speichern es in der Ressource.
  3. Holen Sie den Inhalt der Ressource auf der zweiten Seite mit ResourceReadImage() in das zweite Array.
  4. Senden Sie das zweite Array an CharArrayToString() und erhalten Sie die endgültige Zeichenkette.
  5. Anschließend wird die Zeichenkette durch ein Trennzeichen geteilt und die Parameterwerte in den Kernel geschrieben.

Ursprünglich wollte ich MT-Objekte zur Übertragung von Zeichenketten verwenden.

  1. Wir nehmen eine Zeichenkette (640 Zeichen) und teilen sie in Teile von je 64 Zeichen auf.
  2. Wir führen eine Schleife über die Kommunikationsobjekte durch und schreiben die Teile der Zeichenkette in deren Beschreibung.
  3. Auf der zweiten Seite führen Sie eine Schleife über die Kommunikationsobjekte aus, erhalten Teile der Zeichenkette und jeder Teil wird durch ein Trennzeichen geteilt, wobei die Parameternummer und der Wert extrahiert werden.
  4. Wir schreiben Parameterwerte in den Kernel.

Die zweite Variante schien mir zunächst schneller zu sein.

Wenn man so viele Aufgaben hat wie ich, muss man sich bei der Auswahl einer Lösung auf seine Intuition verlassen. Sie werden nicht genug Zeit haben, um alles gründlich zu überprüfen. Man braucht entweder ein Team oder eine gute Intuition, um die richtige Richtung zu wählen. Und natürlich muss man Abstriche bei der Professionalität machen und Wissenslücken in Kauf nehmen. Andernfalls werden Sie nur noch kritzeln (wenn auch professionell) und nie ein Megaprojekt abschließen. Das ist die Realität.

 
Реter Konow:

Die Kernaussage Ihres Vorschlags lautet wie folgt:

  1. Wir nehmen eine Zeichenkette (640 Zeichen) und senden sie an StringToChar();
  2. Wir erhalten ein Array und speichern es in einer Ressource.
  3. Holen Sie den Inhalt der Ressource auf der zweiten Seite mit ResourceReadImage() in das zweite Array.
  4. Senden Sie das zweite Array an CharArrayToString() und erhalten Sie die endgültige Zeichenkette.
  5. Als Nächstes wird die Zeichenkette durch ein Trennzeichen geteilt und die Parameterwerte in den Kernel geschrieben.

Ganz und gar nicht so.
Ich bin im Moment sehr beschäftigt und habe keine Zeit für Erklärungen.

Wenn Sie meinen Code im Detail auseinandernehmen, so dass keine leeren Stellen übrig bleiben, werden Sie selbst viele Entdeckungen machen.
ZS, aber ohne Debugger wird es viel schwieriger sein, es herauszufinden. Ich weiß nicht, ob Sie damit angefangen haben oder ob Sie dieses wichtige Instrument immer noch nicht nutzen.

 
Nikolai Semko:

...

Wenn Sie meinen Code im Detail untersuchen und keine leeren Stellen lassen, werden Sie viele neue Entdeckungen machen.
ZS. Nur ohne Debugger wird es viel schwieriger zu verstehen sein. Ich weiß nicht, ob Sie damit angefangen haben oder ob Sie dieses wichtige Instrument immer noch nicht nutzen.

Ich werde mir Ihren Code morgen genauer ansehen. (Vergessen Sie nicht die Zeitzonen).

Vielleicht entdecke ich tatsächlich etwas Neues. ))

 

Jede Struktur ist eine Zeichenkette. Ein Array von Strukturen ist ein Array von Zeichenketten mit einer Beschreibung ihres Formats. Klasse - Struktur und Methoden, Klassenimplementierung - Reihe von Implementierungen (entschuldigen Sie mein Französisch).

Sie brauchen nichts bis zum letzten Moment umzuwandeln. Es sind überall nur Fäden im Spiel. Sie sind einfach normalisiert: einige benötigen 2 oder 4 Bytes, andere 1, so dass man sie ausrichten muss.

Ich habe diesen Ansatz zum ersten Mal um 1993 verwendet, mit Clarion DBMS. Es hat sehr schnell funktioniert.

 
Алексей Тарабанов:

Jede Struktur ist eine Zeichenkette. Ein Array von Strukturen ist ein Array von Zeichenketten mit einer Beschreibung ihres Formats. Klasse - Struktur und Methoden, Klassenimplementierung - Reihe von Implementierungen (entschuldigen Sie mein Französisch).

Sie brauchen nichts bis zum letzten Moment umzuwandeln. Es sind überall nur Fäden im Spiel. Sie sind einfach normalisiert: einige benötigen 2 oder 4 Bytes, andere 1, so dass man sie ausrichten muss.

Ich habe diesen Ansatz zum ersten Mal um 1993 verwendet , mit Clarion DBMS. Es ging alles sehr schnell.

Etwa zur gleichen Zeit mit dem gleichen :-) Eine Schule... Übrigens war das DBMS nicht schlecht und seiner Zeit in vielerlei Hinsicht voraus.

PS/ es gibt manchmal ein heiß geliebtes Kitzeln, a posteriori auf der Ebene des Konzepts "alles ist ein String/Text". Die Geschwindigkeit ist wirklich auf dem Niveau von Python.

 
Реter Konow:

Ich werde mir Ihren Code morgen genauer ansehen. (Vergessen Sie nicht die Zeitzonen).

Vielleicht entdecke ich tatsächlich etwas Neues. ))

Vielleicht wird es nützlich sein

Das Beispiel eines Indikators, der eine Ressourcenvariable für ein doppeltes Beispiel verwendet, die ihren Wert nicht neu initialisiert, wenn sich die TF ändert. Dies ist eine bequemere Alternative zu globalen Variablen des Terminals. In gleicher Weise können verschiedene Datenstrukturen und Arrays dieser Strukturen als globale Strukturen verwendet werden.

Dateien:
 
Nikolai Semko:

könnte es sich noch als nützlich erweisen.

)

 
Реter Konow:
Interessehalber werde ich die Variante mit Union ausprobieren. Und mitCharArrayToString und StringToCharArray. Meine Intuition sagt mir allerdings, dass dies kaum schneller sein wird als die Kommunikation über die Beschreibung von МТ-Objekten. Aber ich könnte mich irren. Schauen wir mal...

Peter, Sie haben von Anfang an einen Joker eingesetzt, und jetzt streiten Sie sich über die Leistung der Nachrichtenübermittlung innerhalb Ihres Jokers. Du verstehst schon: eine Schnur ist nur ein handlicher ***, mehr nicht. Alle Daten sind eigentlich nur eine Sammlung von Bytes im Speicher. Es wird Ihnen also geraten, Bytes direkt zu verarbeiten, aber Sie sind stur wie immer und verstehen nicht, dass dieselbe Zeichenfolge dasselbe Byte-Array ist. Sie verlieren also nichts bei der Konvertierung von Strings in ein uchar-Array, aber beim Parsen eines Strings wird die Leistung wirklich verlangsamt. Deshalb fehlt Ihnen einfach die Intuition.

 
Vasiliy Sokolov:

1. Peter, Sie haben ursprünglich ein Spiel entwickelt, und jetzt streiten Sie sich über die Leistung der Nachrichtenübermittlung in Ihrem Spiel.

2. du verstehst: eine Zeichenkette ist nur ein handliches ***, mehr nicht. Alle Daten sind eigentlich nur eine Sammlung von Bytes im Speicher. Sie raten dir also, direkt mit Bytes zu arbeiten, aber du bist stur wie immer und verstehst nicht, dass dieselbe Zeichenfolge dasselbe Byte-Array ist. Bei der Konvertierung von String in ein uchar-Array geht also nichts verloren, aber beim Parsen eines Strings verlangsamt sich die Leistung erheblich.

3. Ihre ganze Intuition ist also nur ein Versehen.

1. "Wildheit" - in diesem Fall ist es Ihr Verständnis, nicht das, was ich getan habe. Es hat 75 Seiten gedauert, bis Sie verstanden haben, worum es geht und was es mit dem Motor auf sich hat. Verstehen Sie: Schwächen und Fehler kennzeichnen eine Einheit nicht. Keine Form der Essenz charakterisiert die Essenz selbst. Genauso wie Ihre Kleidung nicht definiert, was für ein Mensch Sie sind. Nur falsches Denken beurteilt das Ganze nach dem Besonderen.

2. für mich ist es klar, wie es ist. Ich werde heute prüfen, ob die Funktion StringToChar wirklich einen Geschwindigkeitsgewinn bringt.

3. ich überprüfe jeden Tag meine Intuition. Das bezweifle ich jeden Tag. Und das zu Recht. Wenn dies nicht gelingt, sollten Sie sich von der Vernunft leiten lassen. Aber die Vernunft ist zu begrenzt, arrogant und dumm, um sich immer auf sie zu verlassen. Daher ist die Intuition die einzige Alternative. Wenn Sie wissen, was ich meine...

Grund der Beschwerde: