¿Cómo puedo pasar por una enumeración de forma coherente? - página 3

 
Alexey Navoykov:

Los ejemplos mostrados aquí (caso 1: valor de retorno1; caso 2: valor de retorno2; caso 3: valor de retorno3... Una persona adecuada pondría todos los valores en un array y sólo obtendría el valor requerido por su índice. Y para la tarea inversa utilizaría la búsqueda binaria.

Estoy a dos manos a favor de un código bonito con arrays. Pero al escribir un NormalizeDouble más rápido que el normal, me he encontrado con un efecto optimizador - la bonita solución vía const-array era mucho más lenta que la engorrosa solución switch-case. He dejado la segunda variante porque NormalizeDouble se utiliza mucho en el probador. Lo pongo en el indicador y no miro a este monstruo. Pero las pruebas retrospectivas son más rápidas.
 
fxsaber:
Estoy a dos manos a favor de un código bonito con arrays. Pero al escribir un NormalizeDouble más rápido que el normal, me he encontrado con un efecto optimizador - una buena solución vía const-array era mucho más lenta que una engorrosa vía switch-case. He dejado la segunda variante porque NormalizeDouble se utiliza mucho en el probador. Lo pongo en el indicador y no miro a este monstruo. Pero las pruebas retrospectivas son más rápidas.

Recuerdo que una vez hubo un hilo en el que se discutía sobre switch, en el que los desarrolladores sólo hablaban de la implementación como búsqueda binaria, que por supuesto es mucho más lenta que el simple acceso por índice calculado.Pero ahora parece que lo han hecho de forma más inteligente: si un paso es constante, se calcula el índice, de lo contrario se realiza la búsqueda binaria. Por supuesto, la implementación nativa siempre es más rápida que la del wrapper.

Por supuesto, esto depende de tus prioridades. Pero, en mi opinión, si la velocidad es tan crucial que estás dispuesto a inventar muletas, entonces deberías abandonar la POO y el MQL también ;) Aunque estoy seguro de que con una codificación adecuada esta diferencia de velocidad no será tan significativa. En las mediciones de prueba sólo estás rebotando una función en un bucle millones de veces. Y lo usas más racionalmente en el código real, ¿no?

 
Alexey Navoykov:

Recuerdo que una vez hubo un hilo en el que se discutía sobre switch, en el que los desarrolladores sólo hablaban de la implementación como búsqueda binaria, que por supuesto es mucho más lenta que el simple acceso por índice calculado.Pero ahora parece que lo han hecho de forma más inteligente: si el paso es constante, entonces se calcula el índice, en caso contrario, búsqueda binaria. Por supuesto, la implementación nativa siempre es más rápida que la del wrapper.

El compilador, si no es tonto, tendría que convertir la matriz const y el único tipo de referencia a ella por el índice en código de conmutación.

Por supuesto, es posible que tenga que hacerlo en función de sus prioridades. Pero en mi opinión, si la velocidad es tan crucial que estás dispuesto a inventar muletas, entonces deberías abandonar la POO y el MQL en general ;) Aunque estoy seguro de que con una codificación correcta la diferencia de velocidad no será tan sustancial. En las mediciones de prueba simplemente estás corriendo una función a través de un bucle millones de veces. Y en el código real lo usas más racionalmente, ¿no?

La velocidad no es crucial, pero cuando escribo de forma irracional, siento incomodidad. No usar OOP en absoluto no es racional, por supuesto. De todas formas, mira los modestos esfuerzos en kodobase que has puesto y no has contado durante muchos días. Ahí entenderás donde aparecieron las muletillas en forma del mismo NormalizeDouble. Es el resultado de un hecho aleatorio de implementaciones a veces irracionales de los desarrolladores.
 
fxsaber:
El compilador, si no es tonto, se habría visto obligado a convertir la matriz const y la única referencia al tipo por índice en código de conmutación.

¿Así que la matriz es sólo una const? ¿Y la estática? Es una operación simple: comparar el valor del índice con el tamaño del array/enum, y si es menor, obtener la dirección del elemento requerido como dirección del array + índice, y luego leer el valor desde allí. Pensaba que semejantes tonterías debían compilar igualmente.

De todos modos, mira los modestos esfuerzos en kodobase, que he puesto y no he contado durante muchos días. Ahí entenderás donde aparecieron las muletillas en forma de ese mismo NormalizeDouble. Es el resultado de un hecho accidental de implementaciones a veces irracionales de los desarrolladores.
Y por cierto, ¿hace cuánto tiempo realizó estas comparaciones? ¿Quizás el compilador era todavía "tonto" en aquella época?
 
Alexey Navoykov:

¿Así que la matriz es sólo una const? ¿Y la estática? Es una operación simple: comparar el valor del índice con el tamaño del array/enum, y si es menor, obtener la dirección del elemento requerido como dirección del array + índice, y luego leer el valor desde allí. Pensé que estas tonterías debían compilar de la misma manera.

No recuerdo con certeza si se pueden crear matrices estáticas usando métodos const - ciertamente no. Por principio de cuentas estaba haciendo contras y no estáticas. Contar con la inteligencia del compilador. Después de la compilación, no debería haber ningún indicio de matriz en las tripas. Un statik es una estructura mucho más complicada que el const, por lo que estaba seguro de que el compilador no podría hacer frente al statik. Pero tendría que probarlo.

No tengo muy claro a qué "esfuerzos" te refieres. Y por cierto, ¿hace cuánto tiempo realizaste estas comparaciones? ¿Quizás el compilador era todavía "tonto" entonces?
El esfuerzo será visible en cuanto uno de los moderadores pulse algunos botones y dé el visto bueno para publicar el código en kodobase. Hice una solución conveniente para mí, sin pensar en el rendimiento, y resultó ser casi un orden de magnitud mejor en la build 1383 de 32 bits.
 
fxsaber:

No recuerdo exactamente si las matrices estáticas pueden hacerse const. métodos - definitivamente no. Por principio, estaba haciendo contras, no estáticas. Contar con la inteligencia del compilador. Después de la compilación, no debería haber ningún indicio de matriz en las tripas. Un statik es una estructura mucho más complicada que el const. Por eso estaba seguro de que el compilador no se enfrentaría al statik. Pero tendría que probarlo.

Oh, bueno, eso lo explica. No deberías confiar en la excesiva inteligencia del compilador, que optimiza aún más una solución mal diseñada para ti. Si tú mismo eres demasiado vago para hacerlo correctamente, diciendo que "la estática es mucho más complicada" (aunque lo que es complicado ahí, no lo entiendo), entonces ¿por qué acusar al compilador?

 
Alexey Navoykov:

Oh, bueno, eso lo explica. No hay que confiar en la excesiva inteligencia del compilador, ya que éste optimizará por ti una solución mal diseñada. Si tú mismo eres demasiado vago para hacerlo correctamente, diciendo que "la estática es mucho más complicada" (aunque lo que es complicado ahí, no lo entiendo), entonces ¿por qué acusar al compilador?

He añadido estática a la matriz. Funcionó casi tres veces más rápido que el interruptor. Tira ese interruptor. Gracias por el consejo.
 
fxsaber:
He añadido estática a la matriz. Funcionó casi tres veces más rápido que el interruptor. Deshazte de este interruptor. Gracias por el consejo.

De nada. Me servirá de lección para el futuro, que debo pensar 7 veces, antes de andar inventando muletas).

Ahora resulta que alabé el interruptor, o más bien a sus desarrolladores demasiado pronto. Así que todo se implementa allí a través de la búsqueda binaria solamente, incluso cuando la enumeración va con múltiplos. No es bueno.

 
Alexey Navoykov:

De nada, será una lección para el futuro, para pensar 7 veces antes de correr a inventar muletas )

Casi cuatro veces más rápido que el estándar NormalizeDouble (build 1395)... es una muleta de los desarrolladores.

 
fxsaber:
Casi cuatro veces más rápido que el estándar NormalizeDouble (build 1395)... es una muleta de los desarrolladores.

Todo el mundo no está libre de pecado )