Erreurs, bugs, questions - page 2315

 
A100:

D'où vient-il ?

#define  ITERATIONS 1000000

void OnStart()
{
   string Str = "1";
   
   for (int i = 0; i < 10; i++)
     Str += Str;
   
   for (int j = 0; j < 5; j++)
   {
     {
        ulong time = GetMicrosecondCount();
        ulong sum = 0;
        for(int i=0; i<ITERATIONS; i++){
           string r = string(rand()) + Str;
           sum += by_ref(r);
        }
        time = GetMicrosecondCount() - time;
        printf("%s took %.3f milliseconds: sum=%dll", "by_ref", time/1000.0, sum);
     }{
        ulong time = GetMicrosecondCount();
        ulong sum = 0;
        for(int i=0; i<ITERATIONS; i++)
           sum += by_val(string(rand()) + Str);
        time = GetMicrosecondCount() - time;
        printf("%s took %.3f milliseconds: sum=%dll", "by_val", time/1000.0, sum);
     }
     
     Print("");
   }
}
//+------------------------------------------------------------------+

int by_ref(string &var){ return int(var) % 100; }
int by_val(string  var){ return int(var) % 100; }


by_ref took 15119.806 milliseconds: sum=-1000000 ll
by_val took 13872.479 milliseconds: sum=-1000000 ll

by_ref took 14433.781 milliseconds: sum=-1000000 ll
by_val took 13817.533 milliseconds: sum=-1000000 ll

by_ref took 13889.424 milliseconds: sum=-1000000 ll
by_val took 14135.603 milliseconds: sum=-1000000 ll

by_ref took 16047.643 milliseconds: sum=-1000000 ll
by_val took 14494.432 milliseconds: sum=-1000000 ll

by_ref took 15542.276 milliseconds: sum=-1000000 ll
by_val took 13843.121 milliseconds: sum=-1000000 ll
 
Nikolai Semko:

Je voulais mettre une note sur le KB et ça n'a pas marché. Et à en juger par le fait que les publications récentes n'ont pas de notes du tout, il semble que je ne sois pas le seul à avoir ce problème.

Oui, ça ne marche pas.

 
fxsaber:
Mes boucles ref et val ont le même code (la comparaison est plus ou moins correcte), mais le vôtre est différent
 
A100:
Dans mes boucles, ref et val ont le même code (la comparaison est plus ou moins correcte), alors que le vôtre est différent

Oui, différent. Mais la question reste valable. Pourquoi val-variant est-il sensiblement plus rapide que ref ?

 
fxsaber:

Oui, différent. Mais la question reste valable. Pourquoi la val-variante est-elle sensiblement plus rapide que la ref ?

Peut-être que la variante ref est moins optimisée par le compilateur - qui sait.

À mon avis, les deux variantes devraient compiler presque le même code ou même complètement le même code, mais le compilateur gère les choses différemment.

 
TheXpert:

Peut-être que la variante ref est moins bien optimisée par le compilateur - qui sait ?

Il me semble que les deux devraient compiler à peu près le même code ou même exactement le même, mais le compilateur pense différemment.

La question s'adressait en fait aux développeurs, de sorte qu'il y a une base pour les divergences dans les raisons des divergences.

En général, j'essaie de tout passer par référence pour plus de rapidité. Et cela était justifié dans certaines constructions. Mais il me semble maintenant.

 
Alexey Kozitsyn:

+1. Quelque chose semble être cassé. Bild 1881 x64. Win 10. Au démarrage, le processeur est chargé de plus de 20 % (i5 8600k) et la RAM de 650 à 700 Mo (pas d'augmentation).

Le gestionnaire des tâches affiche le statut "Ne répond pas".

Et l'autre terminal 1881 (pas Opening) fonctionne bien.

Ajouté :

Finalement, il a démarré. Cependant, le démarrage a été extrêmement long - ce n'est pas normal. Puis j'ai fermé le terminal et l'ai rouvert. Il s'est ouvert instantanément. Apparemment, il y a eu un problème avec le chargement des données.

Résolu en réinstallant le terminal. J'ai accidentellement supprimé le dossier contenant tous les paramètres et les graphiques) J'ai tout redessiné, mais ça marche comme sur des roulettes maintenant.
 
reztor:
La solution était de réinstaller le terminal. J'ai aussi accidentellement supprimé le dossier contenant tous les paramètres et les graphiques) J'ai tout redessiné, mais ça marche comme sur des roulettes maintenant.

Ce n'était pas nécessaire. Vous auriez pu simplement supprimer le fichier news.dat.

 
TheXpert:

peut-être que la variante ref est moins bien optimisée par le compilateur - qui sait ?

A mon avis, les deux options devraient compiler approximativement le même code ou même complètement le même code, mais le compilateur compte d'une manière différente

Quel est le lien entre le code final et son temps d'exécution ?

Par exemple, changeons.. . de sorte que les boucles deviennent absolument identiques

#define  ITERATIONS 1000000
void OnStart()
{
   string Str = "1";
   for (int i = 0; i < 10; i++)
     Str += Str;
   for (int j = 0; j < 5; j++)
   {
     {
        ulong time = GetMicrosecondCount();
        ulong sum = 0;
        for(int i=0; i<ITERATIONS; i++)
           sum += by_ref(string(rand()) + Str);
        time = GetMicrosecondCount() - time;
        printf("%s took %.3f milliseconds: sum=%dll", "by_ref", time/1000.0, sum);
     }
     {
        ulong time = GetMicrosecondCount();
        ulong sum = 0;
        for(int i=0; i<ITERATIONS; i++)
           sum += by_val(string(rand()) + Str);
        time = GetMicrosecondCount() - time;
        printf("%s took %.3f milliseconds: sum=%dll", "by_val", time/1000.0, sum);
     }    
     Print("");
   }
}
int by_ref(string var){ return int(var) % 100; }
int by_val(string var){ return int(var) % 100; }

Le résultat.. :

by_ref a pris 18354.547 millisecondes : sum=1865600ll
by_val a pris 18318.319 millisecondes : sum=1861628ll

by_ref a pris 18416.747 millisecondes : sum=1904488ll
by_val a pris 18221.978 millisecondes : sum=1907860ll

by_ref a pris 18301.009 millisecondes : sum=1757988ll
by_val a pris 18545.258 millisecondes : sum=1949720ll

by_ref a pris 18373.648 millisecondes : sum=1867160ll
by_val a pris 17972.432 millisecondes : sum=1760308ll

by_ref a pris 19426.076 millisecondes : sum=1795564ll
by_val a pris 19177.485 millisecondes : sum=1826360ll

est à peu près la même... Ou pensez-vous que le compilateur a créé un code différent dans les mêmes boucles ?

Laissez-moi vous rappeler - il y avait quelque chose comme ça

by_ref a pris 13889.424 millisecondes : sum=-1000000ll
by_val a pris 14135.603 millisecondes : sum=-1000000ll

et un code différent... et il y a à peu près la même différence de temps, mais le code et les fonctions elles-mêmes sont exactement les mêmes

 
fxsaber:

La question s'adressait en fait aux développeurs, afin que les divergences puissent être justifiées par les raisons de ces divergences.

Compte tenu de ce résultat, la base n'est pas encore visible