2011-12-31 10 views
9

ジャックシラジの「Javaパフォーマンス・チューニング」を読んでいる間、私は次の文に出くわした:Javaの静的/インスタンス変数の演算性能

「インスタンスと静的変数は、とき 上で動作するように大きさのオーダーまで遅くなることがメソッドの引数やローカル変数と比較して。 "

これはJava 6/7にも適用できますか?そしてもしそうなら、その背後にある理由は何ですか? (彼はローカル変数/パラメータにアクセスするための特別なバイトコードを持っていることについて説明しましたが、私はそれを理解しませんでした)。

答えて

9

ここでキーワードはです。です。問題はローカルとパラメタ(本質的には地元の人々です)が登録されていますが、インスタンス変数と静的変数は最終的にメモリに格納されます(レジスタを操作するのに必要な時間はレジスタに入りますが最終的に彼らの記憶に戻る)。

3

アクセスが10倍遅い場合でも、非常に長いループであっても問題はありません。また、Javaメモリモデルは、インスタンス変数へのメモリアクセスを最適化することに関してかなりスマートです(スマートすぎることもあります)。長いループでインスタンスvarを使用すると、たとえば100,000倍を合計すると、JVMはそのアクセスを最適化する可能性が非常に高く、実際にではなく、の結果を毎回メモリに書き出します。例外は揮発性フィールドです。実際、この全体的な最適化の問題は、揮発性フィールドが存在する理由です。