2017-05-03 26 views
0

在本徵,與徵:與smalll整數指數係數明智戰俘慢

ArrayXXf a; 
a = ArrayXXf::Random(1000, 10000); 

a = a.pow(4); 

大約需要在我的電腦500毫秒,而做

a = a.square().square(); 

需要只有約5ms。我正在編譯最近發佈的GCC。

這是預期的行爲還是我做錯了什麼?我認爲,至少對於小整數來說(例如,如果不使用成本函數,則爲< 20),那麼應該存在可以捕獲這種情況的重載。

+0

你可以建立一個自定義的二進制函數,它調用'__builtin_powi'(在gcc/clang) – chtz

+0

@chtz,而第一眼看起來不錯,就像你說的不可移植。特別是如果你想使用英特爾編譯器。 – yar

回答

0

隨着C++ 17 if constexpr這可能是可能的,但否則它不是。所以目前,a.pow(x)相當於每i調用std::pow(a[i],x)

+2

理論上我們可以提供一個'.pow <4>()'函數(可能用不同的名字) – chtz

+0

@chtz,這將是一個非常棒的功能!這是一個或多或少頻繁的使用案例,性能增益巨大。 – yar