URL: https://linuxfr.org/forums/programmation-c--2/posts/je-veux-bien-que-javascript-soit-optimise-mais-quand-meme Title: Je veux bien que JavaScript soit optimisé, mais quand même !... Authors: alouali Date: 2024年06月26日T16:28:52+02:00 License: CC By-SA Tags: javascript, langage_c, théorie_des_langages_de_programmation, langage_de_programmation, performance, calcul_scientifique et benchmark Score: 8 Bonjour à tou(te)s, je veux bien que JavaScript soit optimisé, mais quand même, de là à être du même ordre de grandeur que C en calcul simple je ne comprends pas ! En effet C étant un langage compilé et typé, je pensais que sur les calculs il serait au moins un ou deux ordres de grandeur plus rapide, mais pas du tout ! J'avoue : je n'avais pas retouché à C depuis au moins 10 ans, je suis donc bluffé par les progrès de vitesse d'exécution des langages type JavaScript. Les Détails ----------- Une amie a son fils qui passe le grand oral du bac en maths sur "Approximation de PI par l'intégrale de Wallis". Python sur son ordinateur étant un peu lent, je me suis dit tiens je vais le refaire en JavaScript et c'était effectivement plus rapide. Puis je me suis dit tiens le programme est tellement simple et court que je vais ressortir le C du placard ! Surtout que ce qui est rigolo est que vu de loin la syntaxe du JavaScript est proche de celle du C. Et là incroyable !!! Le C est plus lent, jusqu'à ce que je compile avec l'option -O3 ! Et même avec ça la différence est minime (quelques % d'écart) !!! S'il y a des spécialistes dans le coin (et il y en a j'en suis sûr), je veux bien des explications. La seule qui me vient est que le calcul avec des double est tellement lent que le reste est négligeable, mais ça me convient moyen comme explication... Le code Javascript et ses résultats ----------- ```javascript function wallis(n){ let a=1.0; let b=1; t = performance.now(); for(let i=1; i<=n ; i++){ a=a*((4.0*i**2)/(4.0*i**2-1)); if(i==10*b){ console.log(a*2, ", time=", (performance.now()-t)/1000.); t = performance.now(); b=i; } } return a*2; } wallis(10**9); ``` ` 3.0677038066434985 ', time=' 0 3.133787490628162 ', time=' 0 3.140807746030402 ', time=' 0.000 3.1415141186819566 ', time=' 0.001 3.141584799657247 ', time=' 0.001 3.141591868192149 ', time=' 0.003 3.1415925750808533 ', time=' 0.011 3.141592643066262 ', time=' 0.097 3.141592643066262 ', time=' 0.972 3.141592643066262` Le code C et ses résultats ----------- ```c #include #include #include #include double now(){ struct timespec t; clock_gettime(CLOCK_MONOTONIC, &t); return t.tv_sec + t.tv_nsec /1000000000.; } double wallis(unsigned long n){ double a = 1.; unsigned long b = 10; double t = now(); for(unsigned long i = 1; i<=n ; i++){ a *= (4.*i*i)/(4*i*i-1); if(i==b){ double t2 = now(); printf("%.16f, time=%.3fs\n", a*2, (t2-t)); t = t2; b *= 10; } } return a*2; } int main(){ unsigned long n = pow(10,9); printf("%.16f\n",wallis(n)); return 0; } ``` `3.0677038066434985, time=0.000s 3.1337874906281620, time=0.000s 3.1408077460304020, time=0.000s 3.1415141186819566, time=0.000s 3.1415847996572470, time=0.000s 3.1415918681921489, time=0.001s 3.1415925750808533, time=0.013s 3.1415926430662622, time=0.092s 3.1415926430662622, time=0.916s 3.1415926430662622`

AltStyle によって変換されたページ (->オリジナル) /