2013-08-23 20 views
5

私はチュートリアルやポストインクリメント注文の古典的なfor-loop witoutを示した講義を見たことがありません。プリインクリメントとポストインクリメント - forループの速度

for (int i=0; i<array.length; i++) {} 

POSTインクリメントを使用すると、変数「i」がインクリメントされる前にキャッシュされます。しかし、コマンドは直接終了するので、これは意味をなさない。私の意見で

、これはより理にかなって:

for (int i=0; i<array.length; ++i) {} 

あなたが今まで理解していなかった場合、私は(私の英語のためのSRY)さらに少し行く:最初のループでは

  1. iの実際の値をキャッシュします。

    1. インクリメント私に直接
    2. ゴー:(注:これを行うので、理由もなく、間には移動)は、第2のループでは
    3. インクリメント私
    4. 移動先

    先に。

したがって、2番目のループは、品質の低下がないためにパフォーマンスが向上します。他の意見はありますか?

+1

2番目のループがより性能が高いかどうかを知る唯一の方法は、それを測定することです(生成されたアセンブリコードが異なると仮定して)。 'int'では、それは違いを生むのではないかと疑います。おそらく、いくつかのイテレータタイプを使用します。 **編集**私はここでC++を話しています。 – juanchopanza

+2

"変数*がキャッシュに入れられる*"と言えば、状況の理解や研究を利用しているのですか、まったく推測していますか? –

+6

私はC++のタグを見ましたが、それは消えてしまいました。私はJavaしか見ないので、javaのdupを投稿しました。 –

答えて

6

Javaでは、このレベルでは考え方がありません。 Javaランタイムは、これまでのところ、Javaソースコードで文字通り書かれているものから削除され、この種の推論は意味を失います。具体的には、JITコンパイラは、マシンコードレベルでコードを不明確に歪ませます。

+0

どのような場合に書くかは関係ありません。コンパイラはそれが属するものにしますか?私は生徒にこれを教えるだろう。事後条件と事前条件は(もし私が教師になれば)いつも面白いことができる「背景知識」を持っているからだ。しかし興味深いことに、それは問題ではない。 Thx、あなたの答えです! :) – codepleb

+0

Javaのジャストインタイムコンパイラはこれほど多くの複雑なことがあり、これはほとんど画像にも入っていません。たとえば、副作用がないことを認識すると、* loop *全体を消去することがあります。 –

+0

それは正しいかもしれませんが、プログラミングロジックがよりフィットするでしょう、私がこれを "私"のやり方で行うなら、私はこれを理解しています。もちろん、それは問題ではないかもしれませんが、私はロジックを書くべきではありません、コンパイラーも書くだろうか?とにかく、良いanwser、しかし、私は現時点で何を変更することはありません。 :) – codepleb

関連する問題