¿Declaración de variables detrás del bucle o dentro del bucle? - página 5

 
pivalexander:

Prefiero dividir el código en bloques lógicos y declarar en ellos las variables necesarias, en lugar de crear un montón de variables al principio de una función, la mayoría de las cuales sólo se necesitan en un bloque, en algún lugar muy abajo

En el caso de las variables que se necesitan en un solo lugar, sí, tiene sentido declararlas antes del propio bloque, especialmente cuando éste es pequeño. Pero, si el bloque es lo suficientemente grande y las variables se necesitan en otro lugar, preferiría declararlas al principio de la función. Sin embargo, hay que utilizar el sentido común.

 
pivalexander:

El resultado de ejecutar con un cuerpo de bucle vacío es muy diferente, mucho más rápido

Test1, время выполнения: 0.548275 сек.
Test2, Время выполнения: 0.313978 сек.

¿Qué se mide en microsegundos? .... ¿Está seguro de que tiene una prueba realista?

;)

Aquí hay otra prueba como esta:

#define  N 8

#define    test(M,S,EX,res) {                             \
uint mss=GetTickCount();                                 \
ulong nn=(ulong)pow(10,M);                               \
for(ulong tst=0;tst<nn && !_StopFlag;tst++) \
{ EX;  res }                                             \
printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string result;
   string s1;  test(N,"1. s1=",s1=(string)tst, result = s1;);
   string s2;  test(N,"2. s2=",s2=(string)tst, result = s2;);
   string s3;  test(N,"3. s3=",s3=(string)tst, result = s3;);
   string s4;  test(N,"4. s4=",s4=(string)tst, result = s4;);
   string s5;  test(N,"5. s5=",s5=(string)tst, result = s5;);

   test(N,"1. q=",string q=(string)tst, result = q;);
   test(N,"2. w=",string w=(string)tst, result = w;);
   test(N,"3. e=",string e=(string)tst, result = e;);
   test(N,"4. r=",string r=(string)tst, result = r;);
   test(N,"5. t=",string t=(string)tst, result = t;);
  }

2019.08.18 12:14:20.765 SpeedTest (EURUSD,H1) 1. s1=: loops=100000000 ms=8156

2019.08.18 12:14:29.127 SpeedTest (EURUSD,H1) 2. s2=: loops=100000000 ms=8359

2019.08.18 12:14:37.353 SpeedTest (EURUSD,H1) 3. s3=: loops=100000000 ms=8235

2019.08.18 12:14:45.464 SpeedTest (EURUSD,H1) 4. s4=: loops=100000000 ms=8109

2019.08.18 12:14:53.557 SpeedTest (EURUSD,H1) 5. s5=: loops=100000000 ms=8094

2019.08.18 12:15:01.446 SpeedTest (EURUSD,H1) 1. q=: loops=100000000 ms=7890

2019.08.18 12:15:09.159 SpeedTest (EURUSD,H1) 2. w=: loops=100000000 ms=7703

2019.08.18 12:15:16.903 SpeedTest (EURUSD,H1) 3. e=: loops=100000000 ms=7750

2019.08.18 12:15:24.716 SpeedTest (EURUSD,H1) 4. r=: loops=100000000 ms=7813

2019.08.18 12:15:32.661 SpeedTest (EURUSD,H1) 5. t=: loops=100000000 ms=7937

 
Igor Makanu:

¿Qué se mide en microsegundos? .... ¿Está seguro de que su prueba se corresponde con la realidad?

   ulong  time_finish = GetMicrosecondCount();
   ulong  res = time_finish - time_start;

Así es como lo mido.

 
pivalexander:

Estoy midiendo de esta manera.

Lo entiendo, pero hay que medir al menos unos segundos

Windows no es un sistema en tiempo real, ¿verdad? Y las tareas en segundo plano también requieren recursos de Windows, por lo que tus pruebas están a la altura de la inexactitud del temporizador del sistema y de los procesos en segundo plano

imho, una prueba de al menos 5 segundos es al menos una información fiable

 
Igor Makanu:

Lo entiendo, pero hay que medir al menos unos segundos

Windows no es un sistema en tiempo real, ¿verdad? Las tareas en segundo plano también requieren recursos de Windows, por lo que sus pruebas se basan en la inexactitud del temporizador del sistema y los procesos en segundo plano

imho, una prueba de al menos 5 segundos es al menos una información creíble

He medido varios segundos cada uno, el resultado es el mismo, ¿por qué esperar tanto tiempo para publicar el resultado aquí

 

En general decidí hacer una prueba, pero 100% correcta, para que no se cortara nada.

void OnStart()
{
  int count= (int)10 e6;

  { 
    uint t= GetTickCount();
    int sum=0;
        
    for (int i=0; i<count; i++)
    {
       string st = (string)i;
       sum += st[rand()%10];
    }
    Print("Test1, время выполнения: ", GetTickCount()-t," ms,  sum=",sum);
  }
  
  {
    uint t = GetTickCount();
    int sum=0;
    string st = "";
    for (int i=0; i<count; i++)
    {
       st = (string)i;
       sum += st[rand()%10];
    }
    Print("Test2, время выполнения: ", GetTickCount()-t," ms,  sum=",sum);
  }
}

En el modo no optimizado, la segunda variante resulta efectivamente más rápida, mientras que en el modo optimizado ocurre lo contrario. La segunda variante, por su parte, se vuelve de alguna manera más lenta que antes de la optimización)

 
pivalexander:

Hizo mediciones durante unos segundos a la vez, el resultado es el mismo, ¿por qué esperar mucho tiempo para publicar el resultado aquí

y varias veces la misma prueba debe ser ejecutada, porque hay una alta probabilidad de las operaciones de almacenamiento en caché en la próxima prueba de conseguir, que puede salir que 2 pruebas idénticas con pequeñas diferencias se llevará a cabo de manera diferente - no se ve la diferencia de la misma prueba?

Depende de ti, como escribí arriba, no me fío de nadie, ni siquiera de Windows, del procesador y de mí mismo ;)


Alexey Navoykov:

En general decidí hacer una prueba, pero 100% correcta, que no se recortara nada.

Mientras que en el modo no optimizado la segunda variante es efectivamente más rápida, en el modo optimizado es viceversa. Y el segundo camino, por alguna razón, se vuelve más lento que antes de la optimización)

No es un hecho, no existe srand() , ya te dije que rand() está muy bien optimizado por el compilador ;)

Y copie el texto de la secuencia de comandos al menos 2 veces - para que pueda ver lo que el compilador ha arrancado ;)

 
pivalexander:

¿Qué tienen que ver la memoria y el procesador? Se trata de la optimización, eres un teórico de libro)

Si vas más allá de los paréntesis de tu razonamiento y comprendes cómo funciona un compilador y cómo funciona su optimización, verás que el objetivo de cualquier compilador es reducir el número de ciclos de reloj de ejecución del código y reducir al máximo los accesos no secuenciales a la memoria. En consecuencia, el resultado de la optimización de cualquier compilador, si existe, lo conocerás de antemano sin necesidad de hacer pruebas tontas. Es como usar pruebas para averiguar que 2 + 2 = 4...

Y sobre el teórico del libro... Este teórico lleva escribiendo desde el año 87, empezando por el EC1020 y el ZX Spectrum, escribió más de un compilador y contrató a más de 600 programadores para su empresa...

 
Aleksandr Matveev:

Si vas más allá de los paréntesis de tu razonamiento y entiendes cómo funciona el compilador y cómo funciona su optimización, verás que el objetivo de cualquier compilador es reducir el número de ciclos de reloj de ejecución del código y reducir al máximo los accesos no secuenciales a la memoria y, en consecuencia, el resultado de la optimización de cualquier compilador, si la hay, lo conocerás de antemano sin necesidad de hacer pruebas tontas. Es como usar pruebas para averiguar que 2 + 2 = 4...

Y sobre el teórico del libro... Este teórico lleva trabajando desde el año 87, cuando empezó a trabajar con el EU1020 y el ZX Spectrum, escribió varios compiladores propios e invitó a más de 600 programadores a su empresa...

Estáis ocupados con los libros, alabándoos a vosotros mismos, pero no han dicho nada sobre la esencia de la cuestión, sólo han bailado alrededor de la teoría... Si lees esto lo entenderás... La memoria y la CPU, la CPU y la memoria, más sobre la fuente de alimentación, se utiliza allí también ...

 
¿Sabías que una cadena puede tener un pequeño búfer interno y que, en el caso de las cadenas pequeñas, los datos pueden ir allí en su totalidad? Es decir, para acelerar la mayoría de los casos triviales. Mientras jugaba con la captura de malloc(), me di cuenta de que si la cadena es más corta que unos 15 caracteres, malloc no se mueve en absoluto. Cómo serían sus pruebas...
Razón de la queja: