Maison  >  Article  >  développement back-end  >  Est-il toujours plus rapide d'utiliser `x*x...` au lieu de `pow(x, i)` pour l'exponentiation ?

Est-il toujours plus rapide d'utiliser `x*x...` au lieu de `pow(x, i)` pour l'exponentiation ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-12 06:53:02516parcourir

Is it always faster to use `x*x...` instead of `pow(x, i)` for exponentiation?

Détermination de l'efficacité des techniques d'exponentiation

Souvent, il est efficace de multiplier un nombre par lui-même au lieu d'utiliser une fonction dédiée à l'exponentiation, comme pow(). Cependant, il peut y avoir des exceptions à cette règle, notamment avec certains exposants.

Considérez le code suivant pour tester les performances de xx... et pow(x,i) pour différents exposants 'i' :

#include <cstdlib>
#include <cmath>
#include <boost/date_time/posix_time/posix_time.hpp>

inline boost::posix_time::ptime now()
{
    return boost::posix_time::microsec_clock::local_time();
}

#define TEST(num, expression) \
double test##num(double b, long loops) \
{ \
    double x = 0.0; \
    boost::posix_time::ptime startTime = now(); \
    for (long i=0; i<loops; ++i) \
    { \
        x += expression; \
        x += expression; \
        x += expression; \
        x += expression; \
        x += expression; \
        x += expression; \
        x += expression; \
        x += expression; \
        x += expression; \
        x += expression; \
    } \
    boost::posix_time::time_duration elapsed = now() - startTime; \
    std::cout << elapsed << " "; \
    return x; \
}

// Test cases for exponentiation using x*x...
TEST(1, b)
TEST(2, b*b)
TEST(3, b*b*b)
TEST(4, b*b*b*b)
TEST(5, b*b*b*b*b)

// Test cases for exponentiation using pow()
template <int exponent>
double testpow(double base, long loops)
{
    double x = 0.0;
    boost::posix_time::ptime startTime = now();
    for (long i = 0; i < loops; ++i)
    {
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
        x += std::pow(base, exponent);
    }
    boost::posix_time::time_duration elapsed = now() - startTime;
    std::cout << elapsed << " ";
    return x;
}

int main()
{
    long loops = 100000000l;
    double x = 0.0;
    std::cout << "1 ";
    x += testpow<1>(rand(), loops);
    x += test1(rand(), loops);

    std::cout << "\n2 ";
    x += testpow<2>(rand(), loops);
    x += test2(rand(), loops);

    std::cout << "\n3 ";
    x += testpow<3>(rand(), loops);
    x += test3(rand(), loops);

    std::cout << "\n4 ";
    x += testpow<4>(rand(), loops);
    x += test4(rand(), loops);

    std::cout << "\n5 ";
    x += testpow<5>(rand(), loops);
    x += test5(rand(), loops);
    std::cout << "\n" << x << "\n";
}

Résultats

Le test Les résultats, qui mesurent le temps nécessaire pour chaque méthode d'exponentiation, démontrent que xx... est effectivement plus rapide.

Cependant, il existe certaines exceptions

Concernant pow(x, 3), les résultats peuvent varier en fonction du compilateur et des indicateurs d'optimisation, notamment lors de l'utilisation de variables à virgule flottante comme "double".

Dans certaines situations, xxx*... n'est pas toujours plus rapide que pow(x, 3), comme observé dans certains benchmarks rapportés. Cela est dû aux techniques d'optimisation utilisées par les compilateurs modernes.

Conclusion

Alors que xx... reste généralement plus rapide pour les petites valeurs d'exposant comme 1, 2 ou 3, il est essentiel de prendre en compte les détails d'implémentation spécifiques et les optimisations d'optimisation du compilateur lors de la détermination de l'approche la plus efficace pour votre code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn