Heim > Backend-Entwicklung > C++ > Ist es immer schneller, „x*x...' anstelle von „pow(x, i)' zur Potenzierung zu verwenden?

Ist es immer schneller, „x*x...' anstelle von „pow(x, i)' zur Potenzierung zu verwenden?

Patricia Arquette
Freigeben: 2024-11-12 06:53:02
Original
598 Leute haben es durchsucht

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

Bestimmung der Effizienz von Potenzierungstechniken

Oft ist es effizient, eine Zahl mit sich selbst zu multiplizieren, anstatt eine Funktion zur Potenzierung zu verwenden. wie pow(). Es kann jedoch Ausnahmen von dieser Regel geben, insbesondere bei bestimmten Exponenten.

Betrachten Sie den folgenden Code, um die Leistung von xx... und pow(x,i) für verschiedene zu testen Exponenten '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";
}
Nach dem Login kopieren

Ergebnisse

Die Testergebnisse, die die für jede Potenzierungsmethode benötigte Zeit messen, zeigen, dass xx... ist tatsächlich schneller.

Es gibt jedoch bestimmte Ausnahmen

Bezüglich pow(x, 3) können die Ergebnisse je nach Compiler und Optimierung variieren Flags, insbesondere bei Verwendung von Gleitkommavariablen wie „double“.

In bestimmten Situationen ist xxx*... nicht immer schneller als pow(x, 3), as in einigen gemeldeten Benchmarks beobachtet. Dies ist auf Optimierungstechniken zurückzuführen, die von modernen Compilern verwendet werden.

Schlussfolgerung

Während xx... im Allgemeinen schneller bleibt für kleine Exponentenwerte wie 1, 2 oder 3 ist es wichtig, spezifische Implementierungsdetails und Compiler-Optimierungsoptimierungen zu berücksichtigen, wenn Sie den effizientesten Ansatz für Ihren Code bestimmen.

Das obige ist der detaillierte Inhalt vonIst es immer schneller, „x*x...' anstelle von „pow(x, i)' zur Potenzierung zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage