43 votes

Pourquoi le cube est plus rapide que carré

J'ai écrit ceci:

   var max = 0xffffff * 4;
  var step = 1 / max;
  function cube() {
    var result = 0.;
    for (var x = 0.; x < 1; x += step) {
      result += x * x * x;
    }
    return result;
  }
  function mul() {
    var result = 0.;
    for (var x = 0.; x < 1; x += step) {
      result += x * x;
    }
    return result;
  }
  function go() {
    var r = '';
    r += cube() + ' \n';
    r += mul() + ' \n';
    alert(r);
  }
 

et voyez le résultat dans le profileur Chrome:

 mul: 106ms 
cube: 87ms
 

Comment est-ce possible?

34voto

Votre affirmation est simplement faux. cube n'est pas plus rapide que la mul et votre exemple n'est pas le prouver.

En fait, ce qui se passe est que le fonctionnement interne de l'exécution de Javascript prendre plus de temps que la multiplication, résultant en très semblable fois pour mul et le cube. J'ai couru les deux fonctions dans une boucle, juste pour augmenter la différence et le testeur affiche 20219 vs 20197, ce qui est insignifiant. Et BTW, le cube est le "plus lent" un ici.

En outre, cette méthode de profilage ne fonctionne pas parce que Chrome et Firefox sont l'optimisation d'un sort avant de faire des maths à l'intérieur des boucles. Ce que vous pensez est une boucle peut très bien utiliser une valeur mise en cache ou même une fonction mathématique que l'optimisation sait renvoie le même résultat.

Voici le code que j'ai utilisé:

<script>
 var max = 0xffffff * 4;
  var step = 1 / max;
  function cube() {
    var result = 0.;
    for (var x = 0.; x < 1; x += step) {
      result += x * x * x;
    }
    return result;
  }
  function mul() {
    var result = 0.;
    for (var x = 0.; x < 1; x += step) {
      result += x * x;
    }
    return result;
  }
  function go() {
    var s='';
    for (var i=0; i<100; i++) {
        s+=cube();
        s+=mul();
    }
    console.log(s);
  }
  go();
</script>

En outre, à titre de référence seulement, regardez la vidéo ici: https://fosdem.org/2016/schedule/event/mozilla_benchmarking_javascript_tips/ où un Firefox gars explique pourquoi microbenchmarking ne veut pas vraiment dire grand-chose.

0voto

C L K Kissane Points 23

Cela est probablement dû au fait que, puisque tous vos nombres sont inférieurs à 1, la fonction de cube ajoute des nombres plus petits que le carré et (je ne suis pas sûr que ce soit ainsi que cela fonctionne) prend donc moins de temps. Ceci est juste une supposition. Et comme les chiffres sont si petits, cela pourrait aussi être dû à une précision insuffisante. J'ai aussi testé avec des nombres supérieurs à un, le cube est plus lent avec eux.

0voto

dmh2000 Points 380

peut-être que l'optimiseur décide de l'un d'eux pourrait être exécuté avec le vecteur instructions tandis que l'autre utilise un bon vieux fmul. Je suis spéculent que le 'carré' utilise fmul et cube utilise vecteur d'instruction mulpd qui peuvent se multiplier jusqu'à 4 doubles dans une instruction. J'ai ajouté un "quad", ce qui ne 4 se multiplie et que son temps est assez proche de cube. mais quand je suis allé à 'cinq' il a ralenti plus lent que le carré. C'est une preuve indirecte que le vecteur des instructions sont en cours d'utilisation pour le cube et quad.

Il serait intéressant de voir les résultats sur un processeur intel vs bras sur une tablette.

-5voto

Russell Hankins Points 355

Sur certains navigateurs, javascript commence tel qu'interprété alors que le JIT le compile en arrière-plan. Une fois que le javascript est compilé, il commence à courir plus vite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X