Déclarer les variables derrière la boucle ou à l'intérieur de la boucle ? - page 5

 
pivalexander:

Je préfère diviser le code en blocs logiques et déclarer les variables nécessaires dans ces blocs, plutôt que de créer un tas de variables au début d'une fonction, dont la plupart ne sont nécessaires que dans un seul bloc, quelque part tout au fond.

Pour les variables nécessaires à un seul endroit - oui, il est logique de les déclarer avant le bloc lui-même, surtout lorsque le bloc est petit. Mais, si le bloc est assez grand et que les variables sont nécessaires ailleurs, je préfère les déclarer au début de la fonction. Il faut cependant faire preuve de bon sens.

 
pivalexander:

Le résultat de l'exécution avec un corps de boucle vide est très différent, et beaucoup plus rapide.

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

Que mesure-t-on en microsecondes ? .... Etes-vous sûr d'avoir un test réaliste ?

;)

Voici un autre test de ce type :

#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:

Que mesure-t-on en microsecondes ? .... Êtes-vous sûr que votre test correspond à la réalité ?

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

C'est comme ça que je le mesure.

 
pivalexander:

Je mesure de cette façon.

Je comprends ça, mais vous devez mesurer au moins quelques secondes

Windows n'est pas un système en temps réel, n'est-ce pas ? Et les tâches d'arrière-plan nécessitent également des ressources de Windows, donc vos tests sont au niveau de l'imprécision du minuteur du système et des processus d'arrière-plan.

imho, un test d'au moins 5 secondes est au moins une information fiable

 
Igor Makanu:

Je comprends, mais vous devez mesurer au moins quelques secondes

Windows n'est pas un système en temps réel, n'est-ce pas ? Et les tâches d'arrière-plan nécessitent également des ressources de Windows, donc vos tests se situent au niveau de l'imprécision du minuteur du système et des processus d'arrière-plan.

imho, un test d'au moins 5 secondes est au moins une info crédible

J'ai mesuré plusieurs secondes chacune, le résultat est le même, pourquoi avoir attendu si longtemps pour poster le résultat ici

 

En général, j'ai décidé de faire un test, mais 100% correct, pour que rien ne soit coupé.

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 mode non optimisé, la seconde variante s'avère en effet plus rapide, alors qu'en mode optimisé, c'est l'inverse. La deuxième variante, quant à elle, devient en quelque sorte plus lente qu'elle ne l'était avant l'optimisation).

 
pivalexander:

J'ai fait des mesures pendant quelques secondes à la fois, le résultat est le même, pourquoi attendre longtemps pour poster le résultat ici.

et plusieurs fois le même test doit être exécuté, parce qu'il ya une forte probabilité d'opérations de mise en cache dans le prochain test à obtenir, qui peut sortir que 2 tests identiques avec de petites différences seront effectuées différemment - vous ne voyez pas la différence du même test ?

C'est à vous de voir, comme je l'ai écrit plus haut, je ne fais confiance à personne, même à Windows, au processeur et à moi-même ;)


Alexey Navoykov:

En général j'ai décidé de faire un test, mais 100% correct, que rien n'a été coupé.

Alors qu'en mode non optimisé la seconde variante est effectivement plus rapide, en mode optimisé c'est l'inverse. Et la deuxième voie, pour une raison quelconque, devient plus lente qu'avant l'optimisation)

Ce n'est pas un fait, il n'y a pas de srand() , je vous ai dit que rand() est très bien optimisé par le compilateur ;)

Et copiez le texte du script au moins 2 fois - pour que vous puissiez voir ce que le compilateur a arraché ;)

 
pivalexander:

Qu'est-ce que la mémoire et le processeur ont à voir avec cela ? Il s'agit d'optimisation, vous êtes un théoricien livresque)

Si vous allez plus loin que les parenthèses de votre raisonnement et que vous comprenez le fonctionnement d'un compilateur et de son optimisation, vous verrez que l'objectif de tout compilateur est de réduire le nombre de cycles d'horloge d'exécution du code et de réduire au maximum les accès non séquentiels à la mémoire. Par conséquent, le résultat de l'optimisation de tout compilateur, s'il existe, vous sera connu d'avance sans aucun test bête. C'est comme utiliser des tests pour comprendre que 2 + 2 = 4...

Et à propos du théoricien du livre... Ce théoricien écrit depuis 87, en commençant par l'EC1020 et le ZX Spectrum, a écrit plus d'un compilateur et a engagé plus de 600 programmeurs dans sa société...

 
Aleksandr Matveev:

Si vous allez plus loin que les parenthèses dans votre raisonnement et que vous comprenez comment fonctionne le compilateur et comment fonctionne son optimisation, vous verrez que le but de tout compilateur est de réduire le nombre de cycles d'horloge d'exécution du code et de réduire au maximum les accès non séquentiels à la mémoire et, par conséquent, le résultat de l'optimisation de tout compilateur, s'il y en a une, vous sera connu à l'avance sans aucun test bête. C'est comme utiliser des tests pour comprendre que 2 + 2 = 4...

Et à propos du théoricien du livre... Ce théoricien travaille depuis 87, date à laquelle il a commencé à travailler avec l'EU1020 et le ZX Spectrum, a écrit plusieurs compilateurs de son cru et a invité plus de 600 programmeurs dans son entreprise...

Vous êtes occupés avec des livres, à vous louer, mais ils ne disent rien sur l'essence de la question, se contentant de danser autour de la théorie... Si vous lisez ceci, vous le comprendrez... Mémoire et CPU, CPU et mémoire, plus sur l'alimentation, elle est utilisée là aussi ...

 
Saviez-vous qu'une chaîne de caractères peut avoir un petit tampon interne et que, pour les petites chaînes de caractères, les données peuvent y aller dans leur intégralité ? Pour ainsi dire, pour accélérer les cas les plus triviaux. En jouant avec la méthode catching malloc(), j'ai remarqué que si la chaîne de caractères est plus courte qu'environ 15 caractères, malloc ne bouge pas du tout. Comment vos tests pourraient-ils...
Raison: