Errores, fallos, preguntas - página 2221

 

Herramienta sintética. Importo barras de minutos, cada barra de minutos difiere en 1 punto (5 dígitos).

Cierro la ventana con los símbolos, luego vuelvo a abrir esta ventana, pido las barras de minutos de la carga anterior, obtengo

Los símbolos son los mismos para cada día completo. ¿Cuál es el error?

 
elibrarius:

Mirando el código del paquete Alglib. Está lleno de estas construcciones, lo que hace que el código sea más difícil de leer:

¿No es más sencillo así?

Me parece que la velocidad de ejecución sería aún mayor.

¿Por qué han complicado tanto el código? ¿O simplemente lo han portado de otro idioma sin ninguna modificación? Pero sigo preguntándome por qué tanta complicación en el original.

Lo más probable es que esto se haga en el código original precisamente para acelerar las cosas.

Hay que medir si será más rápido en MQL, el "parece" no funcionará aquí.

 
Koldun Zloy:

Lomás probable es que esto se haga en el original para la aceleración.

Hay que medir si será más rápido en MQL, el "parece" no funcionará aquí.

"Lo más probable" tampoco funciona.
¿Cómo puede funcionar más rápido un formulario de este tipo? ¿De qué estás hablando?

Dos bucles extra y un array extra en lugar de una variable.

 

Nikolai Semko:

Dos bucles extra y un array extra en lugar de una variable.

Un razonamiento tan primitivo no es adecuado para los procesadores modernos.

 
Koldun Zloy:

Un razonamiento tan primitivo no es adecuado para los procesadores modernos.

Tú lo sabes mejor. Tienes más experiencia...

 


Koldun Zloy
:

Un razonamiento tan primitivo no es adecuado para los procesadores modernos.

En esencia, lo siento, pero estás alucinando.

Ningún procesador que exista hoy en día podrá

for(i=0;i<=npoints-1;i++)

más rápido en comparación con...

for(i=0;i<npoints;i++)

y acceder a un array nunca será más rápido que acceder a una simple variable,

tres bucles idénticos nunca serán más rápidos que un bucle combinado.


No he sido perezoso y he probado la velocidad de dos variantes diferentes directamente en el ALGLIB original para no ser insustancial:

      e=0;
      double tmp1;
      ulong t=GetMicrosecondCount();
      for(i=0;i<npoints;i++)
        {
         v=0.0;
         for(i_=0;i_<nvars;i_++)
           {
            tmp1=xy[i][i_]-ct[xyc[i]][i_];
            v+=tmp1*tmp1;
           }
         e=e+v;
        }
      t=GetMicrosecondCount()-t;
      Print("fast = "+(string)t+" микросекунд, e = "+DoubleToString(e) + " , npoints = " + (string)npoints+" , nvars = " + (string)nvars );



      e=0;
      t=GetMicrosecondCount();
      for(i=0;i<=npoints-1;i++)
        {
         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=xy[i][i_];
         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=tmp[i_]-ct[xyc[i]][i_];
         //--- calculation
         v=0.0;
         for(i_=0;i_<=nvars-1;i_++)
            v+=tmp[i_]*tmp[i_];
         e=e+v;
        }
      t=GetMicrosecondCount()-t;
      Print("slow = "+(string)t+" микросекунд, e = "+DoubleToString(e) + " , npoints = " + (string)npoints+" , nvars = " + (string)nvars );

resultado:

2018.06.27 04:36:50.265 TestClasses (GBPUSD,M6) fast = 571 микросекунд, e = 534.47773777 , npoints = 1500 , nvars = 40
2018.06.27 04:36:50.266 TestClasses (GBPUSD,M6) slow = 841 микросекунд, e = 534.47773777 , npoints = 1500 , nvars = 40
2018.06.27 04:36:50.630 TestClasses (GBPUSD,M6) fast = 577 микросекунд, e = 531.85904819 , npoints = 1500 , nvars = 40
2018.06.27 04:36:50.631 TestClasses (GBPUSD,M6) slow = 812 микросекунд, e = 531.85904819 , npoints = 1500 , nvars = 40
2018.06.27 04:36:51.143 TestClasses (GBPUSD,M6) fast = 599 микросекунд, e = 537.42685690 , npoints = 1500 , nvars = 40
2018.06.27 04:36:51.144 TestClasses (GBPUSD,M6) slow = 853 микросекунд, e = 537.42685690 , npoints = 1500 , nvars = 40
2018.06.27 04:36:51.955 TestClasses (GBPUSD,M6) fast = 600 микросекунд, e = 531.17444713 , npoints = 1500 , nvars = 40
2018.06.27 04:36:51.956 TestClasses (GBPUSD,M6) slow = 809 микросекунд, e = 531.17444713 , npoints = 1500 , nvars = 40
2018.06.27 04:36:52.344 TestClasses (GBPUSD,M6) fast = 567 микросекунд, e = 540.39509565 , npoints = 1500 , nvars = 40
2018.06.27 04:36:52.344 TestClasses (GBPUSD,M6) slow = 813 микросекунд, e = 540.39509565 , npoints = 1500 , nvars = 40
2018.06.27 04:36:52.857 TestClasses (GBPUSD,M6) fast = 690 микросекунд, e = 550.68494369 , npoints = 1500 , nvars = 40
2018.06.27 04:36:52.858 TestClasses (GBPUSD,M6) slow = 820 микросекунд, e = 550.68494369 , npoints = 1500 , nvars = 40
2018.06.27 04:36:53.229 TestClasses (GBPUSD,M6) fast = 585 микросекунд, e = 547.94313745 , npoints = 1500 , nvars = 40
2018.06.27 04:36:53.230 TestClasses (GBPUSD,M6) slow = 811 микросекунд, e = 547.94313745 , npoints = 1500 , nvars = 40
2018.06.27 04:36:53.736 TestClasses (GBPUSD,M6) fast = 560 микросекунд, e = 568.39404456 , npoints = 1500 , nvars = 40
2018.06.27 04:36:53.737 TestClasses (GBPUSD,M6) slow = 813 микросекунд, e = 568.39404456 , npoints = 1500 , nvars = 40

Es decir, puedes ver que la ganancia de velocidad es superior al 40%.

Archivos adjuntos:
dataanalysis.mqh  1150 kb
TestClasses.mqh  2762 kb
 
Nikolai Semko:

Bueno, en esencia, lo siento, pero estás alucinando.

Ningún procesador que exista hoy en día podrá

más rápido en comparación con...

y acceder a un array nunca será más rápido que acceder a una simple variable,

tres bucles idénticos nunca serán más rápidos que un bucle combinado.


No he sido perezoso y he probado la velocidad de dos variantes diferentes directamente en el ALGLIB original para no ser insustancial:

resultado:

Es decir, puedes ver que la ganancia de velocidad es superior al 40%.

Gracias por la prueba. Creo que funcionará más rápido no sólo en MQL, sino en todos los idiomas.

Las razones que se me ocurren son que el programador que lo escribió no sólo cobraba por el programa que funcionaba, sino por el número de líneas. Un programa de 500 líneas no es tan impresionante para un cliente como un programa de 5000 líneas. Es una pena que la velocidad y la legibilidad del código se vean afectadas por ello.

 
elibrarius:
Creo que funcionará más rápido no sólo en MQL sino en todos los idiomas.

Claro que sí.

 
Me he dado cuenta de que al entrar en MQL hay un error y en el estado del navegador hay una respuesta larga (probablemente de autorización) de Facebook
 
SEM:

Herramienta sintética. Importo barras de minutos, cada barra de minutos difiere en 1 punto (5 dígitos).

Cierro la ventana con los símbolos, luego vuelvo a abrir esta ventana, pido las barras de minutos de la carga anterior, obtengo

Los símbolos son los mismos para cada día completo. ¿Cuál es el error?

¿Se está reproduciendo de forma constante? ¿Qué construcción?