首頁 >後端開發 >C++ >使用'x*x...”而不是'pow(x, i)”進行求冪總是更快嗎?

使用'x*x...”而不是'pow(x, i)”進行求冪總是更快嗎?

Patricia Arquette
Patricia Arquette原創
2024-11-12 06:53:02560瀏覽

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

決定求冪技術的效率

通常,將數字與其本身相乘而不是使用專用於求冪的函數,會更有效,就像pow() 一樣。但是,此規則可能有例外,特別是對於某些指數。

考慮以下程式碼來測試xx... 和pow(x,i) 對於不同的效能指數'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";
}

結果

測試結果測量每種求冪方法所需的時間,證明xx...確實更快。

但是,也有一些例外

關於pow(x, 3),結果可能會因編譯器和優化而異標誌,特別是在使用“double”等浮點變數時。

在某些情況下,xxx*... 並不總是比 pow(x, 3) 更快,因為在一些報告的基準中觀察到。這是由於現代編譯器採用的最佳化技術。

結論

雖然xx... 對於小指數值(例如1、2 或3,在決定最有效的程式碼方法時,必須考慮具體的實作細節和編譯器最佳化。

以上是使用'x*x...”而不是'pow(x, i)”進行求冪總是更快嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn