20

些細なループがどれほど高速になるかを分析しているときに、この奇妙な現象に遭遇しました。

変数に対して何もしないのは、変数に対して何かを行うよりもはるかに遅くなります。

もちろん、何もしないコードを書きたいという衝動を感じることはあまりないので、これは本当の問題ではありませんが、これは私を驚かせました。

これが私が見つけたものです:

     tic,for t= 1:1e6, x=x; end,toc %This runs very fast, about 0.07 sec
y=x; tic,for t= 1:1e6, y=x; end,toc %This runs fast, about 0.11 sec
     tic,for t= 1:1e6, x; end,toc   %This takes over half a second?!

ループが最適化されないようにループに簡単な計算を追加しようとしましたが、結果は変わりませんでした。


要約すると、私の質問は次のとおりです。

何が起こっているのか、心配する必要はありますか?

4

2 に答える 2

11

JIT アクセラレーターは移動するターゲットであり、それが何を加速するのかを推測しようとすることはほとんど不可能です。私のマシンでは 64 ビット Linux R2013ax=xy=x同じ時間がかかりますが、xはるかに遅くなります。JIT アクセラレータをオフfeature accel offにするx=xy=x、さらに時間がかかりxますが、同じままです。実際にはアクセルオフで、(少し遅い)x=xと同じくらいの時間がかかります。これは、JIT アクセラレータが で機能しないことを示唆しています。TMW が加速しないことを選択した理由については、あなたの推測は私の推測と同じくらい正しいです。xy=xxx

于 2013-09-19T15:52:30.447 に答える
7

スクリプト内またはコマンド ラインでコードを実行したと思います。関数内で実行すると、3 つのバリアントすべてでほぼ同じ時間がかかることがわかります。コマンド ラインでは、Matlab は利用可能な最適化をすべて採用することはできないため、最初の 2 つのバリアントは最適化されますが、3 番目のバリアントは最適化されません。Matlab コードは通常、最適化の効果が最大化される関数内で実行されるため、これはあまり問題ではありません。

さまざまな実行パスのパフォーマンスを比較するときは、コマンド プロンプトでテストするのと同じくらい魅力的で簡単なように、常に関数内でテストする必要があります。

ps - この特定のケースでは、障害があるのは JIT ではなく、インタープリターの他の (非 JIT) 加速のセットです。コマンドラインと関数に対する動作は JIT と同じです。つまり、関数内で利用可能な多くの最適化は CL では利用できません。これは、タイミングの変動性に関して実際の違いがないことを確認することで確認できますfeature jit off(バリアント #1+#2 は遅くなりますが、バリアント #3 よりも依然として高速です)。ただし、実行するfeature accel offと、バリアント間のすべての違いが解消され、それらはすべてバリアント #3 の低速で実行されます (CL で 0.5 秒、関数で 0.25 秒)。JIT は明らかに accel のサブセットであるため、accel をオフにすると JIT もオフになります (ただし、その逆はありません)。

于 2013-12-25T14:01:28.247 に答える