決定求冪技術的效率
通常,將數字與其本身相乘而不是使用專用於求冪的函數,會更有效,就像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中文網其他相關文章!