Mathworksのパワー機能では、特殊な四角形が使用されているようです(残念ながら、見ることのできないすべてのクローズドソースです)。 R2013bのテストでは、.^
、power
、およびrealpow
が同じアルゴリズムを使用しているように見えます。正方形の場合、私は彼らがx.*x
であることを特別扱いしていると信じています。
1.0x (4.4ms): @()x.^2
1.0x (4.4ms): @()power(x,2)
1.0x (4.5ms): @()x.*x
1.0x (4.5ms): @()realpow(x,2)
6.1x (27.1ms): @()exp(2*log(x))
キューブの場合、ストーリーが異なります。彼らはもはや特別なケースはありません。今回再び、.^
、power
、およびrealpow
すべてが似ていますが、はるかに遅い:だから
1.0x (8.1ms): @()x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x
2.2x (17.4ms): @()x.^2.^2.^2.^2
3.5x (27.9ms): @()exp(16*log(x))
7.9x (63.8ms): @()power(x,16)
7.9x (63.9ms): @()realpow(x,16)
8.3x (66.9ms): @()x.^16
:
1.0x (4.5ms): @()x.*x.*x
1.0x (4.6ms): @()x.*x.^2
5.9x (26.9ms): @()exp(3*log(x))
13.8x (62.3ms): @()power(x,3)
14.0x (63.2ms): @()x.^3
14.1x (63.7ms): @()realpow(x,3)
はどのようにこれらのアルゴリズムは、規模見るための16乗までジャンプレッツ.^
、 power
およびrealpow
は、特別なケースでない限り、指数に関して一定の時間内にすべて実行されます(-1も特別なケースで表示されます)。 exp(n*log(x))
のトリックを使用すると、指数に関する一定の時間も短縮されます。唯一の結果は、繰り返しの二乗がなぜ乗算よりも遅いのかを私は理解していません。
予想通り、x
のサイズを100倍にすると、すべてのアルゴリズムで同様に時間が増加します。
だから、物語の道徳的な?スカラー整数指数を使用する場合、常に乗算を自分で行います。 power
と友人(指数は浮動小数点、ベクトルなど)にはたくさんのスマートがあります。唯一の例外は、Mathworksが最適化を行った場所です。 2013bでは、x^2
とx^(-1)
と思われます。うまくいけば、時間が経つにつれて彼らはさらに追加されます。しかし一般に、べき乗は難しく、乗算は簡単です。パフォーマンスに影響を受けやすいコードでは、常にx.*x.*x.*x
と入力して間違っているとは思われません。 (もちろん、あなたのケースでは、Luis`のアドバイスに従うと、各期間内の中間結果の利用を作る!)
function powerTest(x)
f{1} = @() x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x.*x;
f{2} = @() x.^2.^2.^2.^2;
f{3} = @() exp(16.*log(x));
f{4} = @() x.^16;
f{5} = @() power(x,16);
f{6} = @() realpow(x,16);
for i = 1:length(f)
t(i) = timeit(f{i});
end
[t,idxs] = sort(t);
fcns = f(idxs);
for i = 1:length(fcns)
fprintf('%.1fx (%.1fms):\t%s\n',t(i)/t(1),t(i)*1e3,func2str(fcns{i}));
end
おそらくX 'で行われる最適化。* X * X * X 'の動作不思議なことに。私は 'x。*。x。*。。*。x"の数を2から8まで変化させて試しました。時間は多少直線的に増加しています。私はバンプを期待していただろう。たとえば、 "8"の場合(=> 'x。^ 2.^2^2':3つの電源操作)は、「7」よりも時間がかかります(=>より多くの電源操作) –
@LuisMendoわからない確認する方法はありますが、1ステップ(ネストされた最適化なし)しかないと想像することができます。 7では、 'x。^ 2 * x。^ 2 * x。^ 2。* x'のように' x。^ 2 * x。^ 2 * x。^ 2より遅くならない。* x。^ 2'を8にすると、8を実行した方がこのように7を実行するよりも速い場合、Mathworksはおそらくこのような最適化を電源関数に含めることになりました。 –
はい、それは説明かもしれません:入れ子なし –