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

 
Vasiliy Sokolov:
s.s. Speziell zum Thema der Speicherung von Zeichenketten in MT-Objekten gibt es eine seltsame Panne. Wenn Sie mit der Komprimierung der Daten beginnen und unausgedruckte Zeichen im Objektnamen verwenden, können Sie in manchen Fällen nicht mehr auf das Objekt zugreifen. Der Fehler ist wahrscheinlich immer noch da, weil er sehr spezifisch ist und nicht viele Leute ihn kennen, aber Sie könnten trotzdem darüber stolpern.

Verstehe. Nur die Praxis wird helfen, es endgültig herauszufinden.

 
Реter Konow:

Liebe Gegner.

Hier ist der Skriptcode, der:

  1. Misst die Zeit für die Übertragung einer Zeichenkette in ein Char-Array, für die Übergabe der Zeichenkette an ein anderes Programm über eine Ressource und die Zeit für das Abrufen einer Zeichenkette aus einem Char-Array für die anschließende Aufteilung und den Abruf von Informationen.
  2. Misst die Zeit für das Schreiben der Zeichenkette in die MT-Objektbeschreibung und die Zeit für das Abrufen der Zeichenkette aus der MT-Objektbeschreibung für das anschließende Aufteilen und Abrufen von Informationen.

Ergebnis:


Peter, Sie testen das Falsche an der falschen Stelle. Was Sie testen, sollte in Bezug auf die String-Logik ungefähr die gleiche Geschwindigkeit haben.

Sie haben meine Botschaft völlig missverstanden.

Meine Botschaft war, dass Sie aufhören sollten, Strings zu verwenden, um double, long, time, int usw. zu übergeben. Und wenn Sie Text übergeben müssen, dann übersetzen Sie einen Text-String in ein uchar-Array. Und alle gemischten Daten unterschiedlichen Typs über Union-Datenstrukturen oder Arrays dieser Strukturen, die über Union in uint-Arrays umgewandelt werden, sollten durch Ressourcen geleitet werden, und auf der Empfängerseite sollten diese uint-Arrays über Union in die ursprünglichen Strukturen zurückgewandelt werden. Glaube mir, Peter, Tangas sind sehr langsam, du solltest sie nach Möglichkeit immer vermeiden. String wird nur für Text- und Druckausgaben benötigt.

Und in Ihrem Beispiel haben Sie den Begriff der Leistungsmessung völlig falsch verstanden.

Insbesondere über die Eigenschaft OBJPROP_TEXT können Sie eine Zeichenkette mit einer maximalen Größe von 63 Byte übergeben. Das ist nichts.

Obwohl Ihr Beispiel überhaupt keinen Sinn ergibt, habe ich es zu Demonstrationszwecken in etwas Korrekteres umgewandelt, und so sieht es aus, wenn ich 1000 verschiedene Zeichenfolgen mit einer Größe von 63 Byte kopiere:

Der Skriptcode ist beigefügt. Es funktioniert sowohl auf MT4 als auch auf MT5

MT4:

2018.12.19 00:50:14.542 TestStringVsCharArray NZDUSD,Weekly: время через свойство объекта:      2309 правильность копирования - true
2018.12.19 00:50:14.542 TestStringVsCharArray NZDUSD,Weekly: время через uchar массив:          1882 правильность копирования - true

MT5:

2018.12.19 00:32:30.857 TestStringVsCharArray (NZDUSD,M1)       время через свойство объекта:      32811 правильность копирования - true
2018.12.19 00:33:00.678 TestStringVsCharArray (NZDUSD,M1)       время через uchar массив:          364   правильность копирования - true

Es scheint, dass MT5 asynchron ist, so dass Ihre Methode 100 mal langsamer ist und für MT5 überhaupt nicht geeignet ist. Sie sollten sich mehr und mehr auf MT5 konzentrieren

Und was ist das?

StringToCharArray(qwerty,Arr,0,WHOLE_ARRAY);

Sie sollten zumindest die Hilfe lesen

Dateien:
 
Реter Konow:

Liebe Gegner.

Hier ist der Skriptcode, der:

  1. Misst die Zeit für die Übertragung einer Zeichenkette in ein Char-Array, für die Übergabe der Zeichenkette an ein anderes Programm über eine Ressource und die Zeit für das Abrufen einer Zeichenkette aus einem Char-Array für die anschließende Aufteilung und den Abruf von Informationen.
  2. Misst die Zeit für das Schreiben der Zeichenkette in die MT-Objektbeschreibung und die Zeit für das Abrufen der Zeichenkette aus der MT-Objektbeschreibung für das anschließende Aufteilen und Abrufen von Informationen.

Ergebnis:


Lesen Sie sorgfältig und schließen Sie: https://docs.mql4.com/ru/basis/types/stringconst
Das hilft bei den Schlussfolgerungen:
1. Für jedes Zeichen in der Zeichenkette werden 2 Byte zugewiesen, Unicode-Kodierung. Nicht volle Nutzung der String-Kapazität.
2. Bei der Verwendung der Funktion CharArrayToString (und umgekehrt) wird die Konvertierung entsprechend der Kodierung der Zeichen im uchar-Array durchgeführt, was ebenfalls CPU-Zeit kostet. Verwenden Sie ShortArrayToString (und umgekehrt).
Probieren Sie es aus, aber beachten Sie, dass eine Zeichenkette in Unicode mit Null enden muss.
 
Aliaksandr Hryshyn:
Lesen Sie sorgfältig und schließen Sie: https://docs.mql4.com/ru/basis/types/stringconst
Ich werde bei den Schlussfolgerungen helfen:
1. Für jedes Zeichen in der Zeichenkette werden 2 Byte zugewiesen, Unicode-Kodierung. Nicht volle Nutzung der String-Kapazität.
2. Bei der Verwendung der Funktion CharArrayToString (und umgekehrt) wird die Konvertierung entsprechend der Kodierung der Zeichen im uchar-Array durchgeführt, was ebenfalls CPU-Zeit frisst. Verwenden Sie ShortArrayToString (und umgekehrt).
Probieren Sie es aus, aber beachten Sie, dass string in Unicode mit null enden muss.

nicht zustimmen. Wir brauchen uchar array für string als Zwischenprodukt. Und es findet keine Konvertierung statt, sondern es werden einfach nur Bytes kopiert.

 
Nikolai Semko:

Dem stimme ich nicht zu. Wir benötigen ein uchar-Array für den String als Zwischenprodukt. Und es findet keine Konvertierung statt, sondern nur ein Kopieren von Bytes.

Versuchen Sie, kyrillische Zeichen zu übergeben. Und vergleichen Sie die Zeichencodes im uchar-Array und in der Zeichenkette, die Zeichenkette wird als ushort-Array übergeben.
 
Aliaksandr Hryshyn:
Versuchen Sie, kyrillische Zeichen zu verwenden. Und vergleichen Sie Zeichencodes in uchar Array und in String, String ist wie ushort Array.

Ich weiß, was Unicode ist. Aber in unserem Fall brauchen wir uchar Array nur um uint Array durch Union zu erhalten, um es weiter durch die Ressource zu übergeben und wenn immer zurück Kette von String Recovery. Es wird keine Verluste geben. Und in diesem Fall brauchen wir keine Zeichen aus dem uchar-Array zu extrahieren.

Die Kodierung kann geändert werden und ist standardmäßig nicht Unicode.

 
Nikolai Semko:

Peter, du testest das Falsche am falschen Ort. Was Sie testen, sollte in Bezug auf die String-Logik ungefähr die gleiche Geschwindigkeit haben.

Nikolai, bei allem Respekt, das sind leere Worte für nichts. Ich habe ein Skript gemessen und beigefügt. "Der richtige Weg, der falsche Weg...", "sollte ungefähr die gleiche Geschwindigkeit in Bezug auf die String-Logik haben"... Nur Worte.

Nikolai Semko:

...

Sie haben meine Botschaft völlig missverstanden.

Meine Botschaft war, dass Sie aufhören sollten, Strings zu verwenden, um double, long, time, int usw. zu übergeben. Und wenn Sie Text übergeben müssen, dann konvertieren Sie einen Text-String in ein uchar-Array. Und alle gemischten Daten unterschiedlichen Typs über Union-Datenstrukturen oder Arrays dieser Strukturen, die über Union in uint-Arrays umgewandelt werden, sollten durch Ressourcen geleitet werden, und auf der Empfängerseite sollten diese uint-Arrays über Union in die ursprünglichen Strukturen zurückgewandelt werden. Glaube mir, Peter, Tangas sind sehr langsam, du solltest sie nach Möglichkeit immer vermeiden. String wird nur für Text- und Druckausgaben benötigt.

Das ist genau Ihre Botschaft, die ich perfekt verstanden habe. UND DAS IST FALSCH.

Warum? - Denn dann müsste man das System der Arbeit mit Kontrollparametern sehr verkomplizieren. Die Architektur des Speicherns, Übergebens und Verwaltens von Parametern wird um ein Vielfaches komplizierter und verwirrender, was zu vielen Problemen und einer allgemeinen Verlangsamung führen wird.

Sie verstehen die interne Architektur nicht. Sie wissen nicht, wie Programme interagieren und Parameterwerte je nach Typ und Eigenschaften verwalten. Was Sie vorschlagen, würde die Dinge noch viel komplizierter und verwirrender machen. Und es wird das Kommunikationsproblem nicht lösen. Es wird weiterhin eine Krücke bleiben.

Nikolai Semko:

...

Darüber hinaus können Sie über die Eigenschaft OBJPROP_TEXT eine Zeichenkette mit einer maximalen Größe von 63 Byte übergeben. Das ist noch gar nichts.

Obwohl Ihr Beispiel überhaupt keinen Sinn macht, habe ich es zu Demonstrationszwecken in etwas Korrekteres umgewandelt, und so sieht es aus, wenn ich 1000 verschiedene Zeichenfolgen mit einer Größe von 63 Byte kopiere:

...

Sie können eine Zeichenkette von 64 Zeichen in der Beschreibung eines MT-Objekts angeben. Das ist genug. Ich benötige 20-30 Zeilen, um Daten aus großen Tabellen zu übertragen. Ohne große Tabellen brauche ich höchstens 2-3 Zeilen.

Ich interessiere mich im Moment für MT4.

Der MT5 entwickelt sich ständig weiter. Die Entwickler können einfach den gemeinsamen Speicher von MT-Programmen hinzufügen (so dass sie sich nicht um die Ressourcen kümmern müssen) und die Frage wird beseitigt.

 

Nikolai Semko:

...

Meine Botschaft war, dass wir aufhören sollten, Strings zu verwenden, um double, long, time, int usw. zu übergeben.

...

Wie übertragen Sie double, long, time, int usw.? ???

Trotzdem müssen wir sie in einen String und dann in einen Char umwandeln, um sie in die Ressource zu schreiben.

Oder schlagen Sie die Verwendung von lparam,dparam vor?

Das heißt, die Ereigniswarteschlange überladen...

 
Реter Konow:


Schade. Ich bin vom Thema abgekommen.
Kindergarten, zweites Quartal.
Du langweilst mich, Peter, mit deinem Analphabetismus und deiner Ignoranz und deinem überheblichen Gefühl der Selbstherrlichkeit und des Anspruchs.
 
Nikolai Semko:


Außerdem haben Sie bei Ihren Messungen vergessen, die Zeit zum Speichern und Lesen der Ressource hinzuzufügen...

Selbst wenn Sie also 1000 Zeilen schreiben (was wirklich besser ist, um die Ressource zu durchlaufen), gewinnen Sie aufgrund der Kosten für das Speichern und Abrufen aus der Ressource nicht an Geschwindigkeit.

Grund der Beschwerde: