J'ai lu X ** 2 plus vite dans Ruby 3.0 et je voulais micro-bench, donc j'ai micro-benched.
Cela ne tient pas du point de vue pratique.
ruby est 2.7.2 et 3.0.0-preview1. L'environnement est macOS Catalina 10.15.6.Intel Core i7 quadricœur à 2,2 GHz.
Par exemple, supposons que vous vouliez calculer «x» à la puissance 11. Il existe les méthodes suivantes.
Nom | Méthode de calcul |
---|---|
x**n |
x**11 |
x*x*...*x |
x*x*x*x*x*x*x*x*x*x*x |
use variables |
z=x*x;y=x*z*z;x*y*y |
use '**2' |
((x**2)**2*x)**2*x |
Les deux premiers sont bons.
«Utiliser des variables» fait un effort décent pour réduire le nombre de multiplications.
Je n'ai pas essayé de le réduire de toutes mes forces, donc par exemple, dans le cas de 27, 7 fois de " z = x * x * x; y = z * z; z = x * y * y; x * z * z
" Il est devenu.
Si je fais de mon mieux, ce sera probablement 6 fois de " z = x * x * x; y = z * z * z; y * y * y
", mais je l'ai sauté.
Le dernier est calculé en utilisant beaucoup de «** 2».
x est défini sur «3.0». J'ai essayé l'index de 2 à 32. Si la valeur de l'exposant est petite, «x ** n» et «use» ** 2 »sont identiques, et« x * x * ... * x »et« use variables »sont également identiques.
Tous les graphiques sont des itérations par seconde, donc le sommet est rapide. Notez le graphique à un log.
«Utiliser des variables» semble être rapide jusqu'à la 10e puissance.
Jusqu'à environ 16ème puissance, ʻuse variableset
x ** n` sont extraits.
De plus, «x ** n» est plus rapide.
En regardant le graphique, il semble préférable de traiter jusqu'à «x ** 3» ou «x ** 4» spécialement, mais qu'en est-il?
Si vous regardez x ** n
, vous pouvez voir que 3.0.0-preview1 traite ** 2
spécialement.
Recommended Posts