Micro-benchmark pour les nombres à virgule flottante à la puissance des entiers dans Ruby

Qu'est-ce que c'est?

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.

Que mesurer

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.

Que mesurer

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.

résultat

Tous les graphiques sont des itérations par seconde, donc le sommet est rapide. Notez le graphique à un log.

image.png

«Utiliser des variables» semble être rapide jusqu'à la 10e puissance. Jusqu'à environ 16ème puissance, ʻuse variablesetx ** 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?

image.png

Si vous regardez x ** n, vous pouvez voir que 3.0.0-preview1 traite ** 2 spécialement.

Recommended Posts

Micro-benchmark pour les nombres à virgule flottante à la puissance des entiers dans Ruby
AtCoder ABC 169 C virgule flottante qui tient dans Ruby
Integer # pow est recommandé pour résoudre à plusieurs reprises la méthode du carré dans Ruby
Informations de répertoire de DEFAULT_CERT_FILE dans Mac ruby 2.0.0
Liste des coupes ponctuelles pour réaliser des coupes ponctuelles plus fines
Résumé des hachages et symboles dans Ruby
[Ruby] Distinction et utilisation des boucles dans Ruby
Conseils pour la gestion des erreurs de gRPC dans Ruby