Mon approche. Le noyau est le moteur. - page 84

 
Maxim Kuznetsov:

Et oui, l'analyse syntaxique des textes en MQL est très amusante :-) Eh bien, il n'est pas conçu pour l'analyse de texte. Je veux dire, tu peux, mais c'est une déception...

Les tableaux et les ordres - c'est ce qui caractérise MQL

C'est de ça que je parle... :)

 
Nikolai Semko:

La polyvalence est souvent synonyme de lenteur, et encore plus avec la corde.
Laissez-moi vous donner un exemple.

Une fois, j'ai analysé une chaîne reçue d'une bourse de cryptage en utilisant WebRequest. Et je l'ai analysé en utilisantla bibliothèque JSON de Sergeev, qu'il a portée depuis la "bibliothèque C++ à grande vitesse". Et j'ai remarqué que la vitesse est très insatisfaisante. Là-bas, tout se faisait par le biais de cordes "universelles".

J'ai compris que la raison de la faible vitesse était la chaîne de caractères et je voulais éviter d'utiliser des fonctions de chaîne de caractères et j'ai écrit une fonction qui analyse directement le tableau uchar. Le résultat m'a beaucoup surpris. Ma vitesse d'analyse était de.... (roulement de tambour) 800 fois plus rapide. Si l'analyse d'une chaîne entière dans JSON prenait 0,3 seconde, ma fonction l'a analysée en moins d'une demi-milliseconde.

Voici un exemple de mon analyse syntaxique via un tableau uchar.

L'essentiel de votre suggestion est le suivant :

  1. On prend une chaîne de caractères (640 caractères), on l'envoie à la fonction StringToChar() ;
  2. Nous récupérons le tableau et le stockons dans la ressource.
  3. Obtenez le contenu de la ressource du second côté en utilisant ResourceReadImage() dans le second tableau.
  4. Envoyez le deuxième tableau à CharArrayToString() et obtenez la chaîne finale.
  5. Ensuite, divisez la chaîne par un délimiteur et écrivez les valeurs des paramètres dans le noyau.

À l'origine, je voulais utiliser des objets MT pour transférer des chaînes de caractères.

  1. Nous prenons une chaîne de caractères (640 caractères), et la divisons en parties de 64 caractères chacune.
  2. Nous faisons une boucle sur les objets de communication et écrivons les parties de la chaîne dans leur description.
  3. De l'autre côté, faire une boucle sur les objets de communication, obtenir des parties de la chaîne et chaque partie est séparée par un délimiteur, extraire le numéro et la valeur du paramètre.
  4. Nous écrivons les valeurs des paramètres dans le noyau.

La deuxième variante m'a semblé plus rapide au départ.

Lorsque vous avez autant de tâches à accomplir que moi, vous devez vous fier à votre intuition pour choisir une solution. Vous n'aurez pas assez de vie pour tout vérifier minutieusement. Vous avez besoin d'une équipe ou d'un grand sens de l'intuition pour choisir la bonne direction. Et bien sûr, il faut sacrifier le professionnalisme et supporter les lacunes dans les connaissances. Sinon, vous en resterez à l'artisanat (bien que professionnel) et vous ne terminerez jamais un mégaprojet. C'est la réalité.

 
Реter Konow:

L'essentiel de votre suggestion est le suivant :

  1. On prend une chaîne (640 caractères), on l'envoie à StringToChar() ;
  2. Nous obtenons un tableau et le stockons dans une ressource.
  3. Obtenez le contenu de la ressource du second côté en utilisant ResourceReadImage() dans le second tableau.
  4. Envoyez le deuxième tableau à CharArrayToString() et obtenez la chaîne finale.
  5. Ensuite, il faut diviser la chaîne par le séparateur et écrire les valeurs des paramètres dans le noyau.

Pas du tout comme ça.
Je suis occupé en ce moment - pas le temps d'expliquer.

Si vous démontez mon code en détail, de manière à ne laisser aucun espace vide, vous ferez beaucoup de découvertes par vous-même.
ZS. Mais sans débogueur, il sera beaucoup plus difficile de le comprendre. Je ne sais pas si vous avez commencé à l'utiliser ou si vous n'utilisez toujours pas cet outil important.

 
Nikolai Semko:

...

Si vous examinez mon code en détail et que vous ne laissez pas d'espaces vides, vous ferez beaucoup de nouvelles découvertes.
ZS. Seulement, sans utiliser le débogueur, il sera beaucoup plus difficile de comprendre. Je ne sais pas si vous avez commencé à l'utiliser ou si vous n'utilisez toujours pas cet outil important.

Je regarderai de plus près votre code demain. (N'oubliez pas les fuseaux horaires).

Peut-être qu'en effet, je vais découvrir quelque chose de nouveau. ))

 

Toute structure est une chaîne de caractères. Un tableau de structures est un tableau de chaînes de caractères avec une description de leur format. Classe - structure et méthodes, implémentation de la classe - tableau d'implémentations (pardonnez mon français).

Vous n'avez pas besoin de convertir quoi que ce soit jusqu'au dernier moment. Il n'y a que des ficelles partout. Simplement, ils sont normalisés : certains prennent 2, ou 4 octets, et d'autres 1, il faut donc les aligner.

J'ai utilisé cette approche pour la première fois vers 1993, avec le SGBD Clarion. Cela a fonctionné très rapidement.

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

Toute structure est une chaîne de caractères. Un tableau de structures est un tableau de chaînes de caractères avec une description de leur format. Classe - structure et méthodes, implémentation de la classe - tableau d'implémentations (pardonnez mon français).

Vous n'avez pas besoin de convertir quoi que ce soit jusqu'au dernier moment. Il n'y a que des ficelles partout. Simplement, ils sont normalisés : certains prennent 2, ou 4 octets, et d'autres 1, il faut donc les aligner.

J'ai utilisé cette approche pour la première fois vers 1993, avec le SGBD Clarion. Tout s'est déroulé très rapidement.

A peu près au même moment avec le même :-) Une école... d'ailleurs le SGBD n'était pas mauvais et était en avance sur son temps à bien des égards.

PS/ il y a parfois un chatouillement, a posteriori au niveau du concept "tout est une chaîne/un texte". La vitesse est vraiment au niveau de celle de python.

 
Реter Konow:

Je regarderai de plus près votre code demain. (N'oubliez pas les fuseaux horaires).

Peut-être que je vais vraiment découvrir quelque chose de nouveau. ))

Peut-être que cela sera utile

L'exemple d'indicateur qui utilise la variable ressource sur l'exemple double, qui ne réinitialise pas sa valeur lors du changement de TF. C'est une alternative plus pratique aux variables globales du terminal. De la même manière, différentes structures de données et des tableaux de ces structures peuvent être utilisés comme des structures globales.

Dossiers :
 
Nikolai Semko:

ça peut toujours être utile.

)

 
Реter Konow:
Par souci d'intérêt, je vais essayer la variante avec l'union. Et avecCharArrayToString et StringToCharArray. Bien que mon intuition me dise que ce ne sera guère plus rapide que la communication via la description d'objets МТ. Mais je peux me tromper. Voyons voir...

Peter, vous avez créé un joker dès le début, et maintenant vous vous disputez sur les performances de la messagerie au sein de votre joker. Vous l'avez compris : une corde est juste un *** pratique, rien de plus. Toute donnée n'est en fait qu'une collection d'octets en mémoire. On vous conseille donc de manipuler les octets directement, mais vous êtes toujours aussi têtu pour ne pas comprendre qu'une même chaîne est un même tableau d'octets. Ainsi, vous ne perdez rien lors de la conversion d'une chaîne de caractères en tableau uchar, mais lors de l'analyse syntaxique d'une chaîne de caractères, vos performances sont vraiment ralenties. C'est pourquoi toute votre intuition est juste absente.

 
Vasiliy Sokolov:

1. Peter, à l'origine vous avez fait un jeu, et maintenant vous vous disputez sur les performances de la messagerie dans votre jeu.

2. vous comprenez : une chaîne n'est qu'un *** pratique, rien de plus. Toute donnée n'est en fait qu'une collection d'octets en mémoire. Ils vous conseillent donc de travailler directement avec les octets, mais vous êtes toujours aussi têtu et ne comprenez pas que la même chaîne de caractères est le même tableau d'octets. Vous ne perdez donc rien lors de la conversion de la chaîne de caractères en tableau d'uchar, mais lorsque vous analysez une chaîne de caractères, vos performances ralentissent vraiment.

3. Donc toute votre intuition est juste un manque.

1. "Sauvage" - dans ce cas, c'est votre compréhension, pas ce que j'ai fait. Il a fallu 75 pages pour que vous compreniez de quoi il s'agit et ce qu'est le moteur. Comprendre : les défauts et les erreurs ne caractérisent pas une entité. Aucune forme de l'essence ne caractérise l'essence elle-même. Tout comme vos vêtements ne définissent pas le genre de personne que vous êtes. Seule la pensée erronée juge le tout par le particulier.

2. Pour moi, c'est clair comme de l'eau de roche. Je vais vérifier aujourd'hui s'il y a un réel gain de vitesse en utilisant la fonction StringToChar.

3. Chaque jour, je vérifie mon intuition. J'en doute tous les jours. Et à juste titre. Si elle échoue, vous devez vous laisser guider par la Raison. Mais la Raison est trop limitée, arrogante et stupide pour qu'on puisse toujours s'y fier. L'intuition est donc la seule alternative. Si vous voyez ce que je veux dire...