15

私はEffectiveJavaから、同期がない場合、以下のシーケンスAを仮想マシンによってシーケンスBに変換できることを読みました。これは、と呼ばれhoistingます。また、変数が揮発性命令として宣言されていない場合、変数を含む命令を並べ替えることができることもどこかで読みました。巻き上げと並べ替えは同じですか?

  while (!done)    sequence A     
    i++;

  if (!done)
     while (true)    sequence B
        i++;
4

3 に答える 3

21

それらはわずかに異なります。

巻き上げとは、ループ自体が操作の結果に影響を与えないため、ループからいくつかの操作を引き出したことを意味します。あなたの場合、whileループから条件付きテストを引き上げています。

並べ替えとは、結果に影響を与えない方法で命令の順序を変更することを意味します。通常、これはデータ依存関係のない隣接する命令になります。たとえば、次の2つのステートメントを実行する順序は関係ありません。

int a = x;
int b = y;
于 2012-07-11T10:06:58.183 に答える
1

The term "reordering" as it's used in the Java Memory Model refers to all possible optimizations that may affect correctness of improperly synchronized programs.

So, reordering in this sense is a generic term that includes optimizations such as hoisting, effects of out-of-order execution, inconsistencies caused by memory hierarchy (i.e. caches), and so on.

于 2012-07-11T10:11:54.260 に答える
0

並べ替えは実​​行のパフォーマンスに関連しますが、並べ替えはパフォーマンスに影響しません。

巻き上げは、メモリバリア命令の並べ替えに対して行われます。

于 2012-07-11T10:10:03.037 に答える