Mi enfoque. El núcleo es el motor. - página 84

 
Maxim Kuznetsov:

Y sí, analizar textos en MQL es muy divertido :-) Bueno, no está diseñado para el análisis de texto. Es decir, se puede, pero es un fastidio...

Matrices y órdenes: así es MQL

A eso me refiero... :)

 
Nikolai Semko:

La versatilidad es a menudo sinónimo de pereza, y más aún de cuerda.
Déjenme darles un ejemplo.

Una vez analicé una cadena recibida de un criptointercambio utilizando WebRequest. Y lo analicé utilizandola biblioteca JSON de Sergeev, que portó de la "biblioteca C++ de alta velocidad". Y he notado que la velocidad es muy insatisfactoria. Allí todo se hacía a través de cuerdas "universales".

Entendí que la razón de la baja velocidad era el encadenamiento y quise evitar el uso de funciones de encadenamiento y escribí una función que parseaba directamente desde el array uchar. El resultado me sorprendió bastante. Mi velocidad de análisis era .... (redoble de tambores) 800 veces más rápido. Si el análisis de una cadena completa a través de JSON tardó 0,3 segundos, mi función lo analizó en menos de la mitad de un milisegundo.

Aquí está un ejemplo de mi parsing a través de uchar array.

La esencia de su sugerencia es la siguiente:

  1. Tomamos una cadena (640 caracteres), la enviamos a la función StringToChar();
  2. Obtenemos el array y lo almacenamos en el recurso.
  3. Obtener el contenido del recurso en el segundo lado usando ResourceReadImage() al segundo array.
  4. Envía el segundo array a CharArrayToString() y obtiene la cadena final.
  5. A continuación, divide la cadena por un delimitador y escribe los valores de los parámetros en el núcleo.

Originalmente quería usar objetos MT para transferir cadenas.

  1. Tomamos una cadena (640 caracteres) y la dividimos en partes de 64 caracteres cada una.
  2. Hacemos un bucle en los objetos de comunicación y escribimos las partes de la cadena en su descripción.
  3. En el segundo lado, hacer un bucle en los objetos de comunicación, obtener partes de la cadena y cada parte se divide por un delimitador, la extracción del número de parámetro y el valor.
  4. Escribimos los valores de los parámetros en el núcleo.

La segunda variante me pareció inicialmente más rápida.

Cuando tienes tantas tareas como yo, tienes que confiar en tu intuición a la hora de elegir una solución. No tendrás suficiente vida para revisar todo a fondo. Se necesita un equipo o un gran sentido de la intuición para elegir la dirección correcta. Y, por supuesto, hay que sacrificar la profesionalidad y aguantar las lagunas de conocimiento. De lo contrario, te quedarás haciendo garabatos (aunque sean profesionales) y nunca terminarás un megaproyecto. Esta es la realidad.

 
Реter Konow:

La esencia de su sugerencia es la siguiente:

  1. Tomamos una cadena (640 caracteres), la enviamos a StringToChar();
  2. Obtenemos un array y lo almacenamos en un recurso.
  3. Obtener el contenido del recurso en el segundo lado usando ResourceReadImage() al segundo array.
  4. Envía el segundo array a CharArrayToString() y obtiene la cadena final.
  5. A continuación, divide la cadena por el separador y escribe los valores de los parámetros en el núcleo.

No es para nada así.
Estoy ocupado en este momento - no hay tiempo para explicar.

Si desmontas mi código en detalle, para que no queden espacios en blanco, harás muchos descubrimientos por ti mismo.
ZS. Sólo que sin un depurador será mucho más difícil averiguarlo. No sé si has empezado a usarlo o todavía no utilizas esta importante herramienta.

 
Nikolai Semko:

...

Si examina mi código en detalle, y no deja espacios en blanco, hará un montón de nuevos descubrimientos.
ZS. Sólo que sin usar el depurador será mucho más difícil de entender. No sé si has empezado a usarlo o todavía no utilizas esta importante herramienta.

Mañana miraré más detenidamente tu código. (No olvides los husos horarios).

Tal vez, efectivamente, descubra algo nuevo. ))

 

Cualquier estructura es una cadena. Una matriz de estructuras es una matriz de cadenas con una descripción de su formato. Clase - estructura y métodos, implementación de la clase - conjunto de implementaciones (perdón por mi francés).

No es necesario convertir nada hasta el último momento. En todas partes sólo hay hilos. Simplemente, están normalizados: algunos toman 2, o 4 bytes, y otros toman 1, por lo que hay que alinearlos.

La primera vez que utilicé este enfoque fue en 1993, con el SGBD Clarion. Funcionó muy rápidamente.

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

Cualquier estructura es una cadena. Una matriz de estructuras es una matriz de cadenas con una descripción de su formato. Clase - estructura y métodos, implementación de la clase - conjunto de implementaciones (perdón por mi francés).

No es necesario convertir nada hasta el último momento. En todas partes sólo hay hilos. Simplemente, están normalizados: algunos toman 2, o 4 bytes, y otros toman 1, por lo que hay que alinearlos.

La primera vez que utilicé este enfoque fue en 1993, con el SGBD Clarion. Todo funcionó muy rápidamente.

Más o menos a la misma hora con lo mismo :-) Una escuela... por cierto el SGBD no era malo y estaba adelantado a su tiempo en muchos aspectos.

PD/ hay un cosquilleo muy querido a veces, a posteriori a nivel de concepto "todo es una cadena/texto". La velocidad está realmente al nivel de python.

 
Реter Konow:

Mañana miraré más de cerca tu código. (No te olvides de los husos horarios).

Tal vez descubra algo nuevo. ))

Puede ser útil

El ejemplo de indicador que utiliza la variable de recurso en el ejemplo doble, que no reinicializa su valor al cambiar de TF. Esta es una alternativa más conveniente a las variables globales de la terminal. Del mismo modo, se pueden utilizar diferentes estructuras de datos y matrices de estas estructuras como globales.

Archivos adjuntos:
 
Nikolai Semko:

todavía puede ser útil.

)

 
Реter Konow:
Por interés, voy a probar la variante con unión. Y conCharArrayToString y StringToCharArray. Aunque mi intuición me dice que difícilmente será más rápido que la comunicación a través de la descripción de МТ objetos. Pero puede que me equivoque. Veamos...

Peter, has hecho un comodín desde el principio, y ahora estás discutiendo sobre el rendimiento de la mensajería dentro de tu comodín. Ya lo has entendido: una cuerda es sólo un útil ***, nada más. Cualquier dato es en realidad una colección de bytes en la memoria. Así que se le aconseja que maneje los bytes directamente, pero es terco como siempre al no entender que la misma cadena es la misma matriz de bytes. Así que no pierdes nada en la conversión de la cadena a la matriz uchar. Pero cuando se analiza una cadena, su rendimiento realmente se ralentiza. Por eso toda tu intuición está perdida.

 
Vasiliy Sokolov:

1. Peter, originalmente hiciste un juego, y ahora estás discutiendo sobre el rendimiento de la mensajería dentro de tu juego.

2.Entiendes: una cadena es sólo un útil ***, nada más. Cualquier dato es en realidad una colección de bytes en la memoria. Así que te aconsejan que trabajes con bytes directamente, pero eres terco como siempre al no entender que la misma cadena es la misma matriz de bytes. Así que no pierdes nada en la conversión de cadena a matriz uchar. Pero cuando analizas una cadena, tu rendimiento realmente se ralentiza.

3. Así que toda tu intuición es sólo un fallo.

1. "Salvajismo" - en este caso, es su comprensión, no lo que hice. Han hecho falta 75 páginas para que entiendas de qué se trata y de qué es el motor. Entiéndase: los defectos y errores no caracterizan a una entidad. Ninguna forma de la esencia caracteriza a la propia esencia. Al igual que tu ropa no define el tipo de persona que eres. Sólo el pensamiento equivocado juzga el todo por lo particular.

2. Para mí está claro como es. Hoy comprobaré si hay una ganancia real de velocidad utilizando la función StringToChar.

3. Cada día compruebo mi intuición. Cada día lo dudo. Y con razón. Si falla, debe guiarse por la Razón. Pero la Razón es demasiado limitada, arrogante y estúpida para confiar siempre en ella. Por lo tanto, la intuición es la única alternativa. Si sabes lo que quiero decir...