0

私は、Integer:s のリストを単純に (数回) 繰り返して合計を計算する、非常に単純なシングル スレッド Java アプリケーションを作成しました。Linux マシン (Intel X5677 3.46GHz クアッドコア) でこれを実行すると、プログラムが完了するまでに約 5 秒かかります。タスクセットを使用して jvm を 2 つの特定のコアに制限すると、同じ時間になります (アプリケーションがシングル スレッドであり、CPU 負荷がすべてのコアで 0.1% 未満であるため、これは予想されていたことです)。ただし、jvm を単一のコアに制限すると、プログラムの実行が突然非常に遅くなり、終了するまでに 350 秒以上かかります。jvmがメインスレッドに加えて他のいくつかのスレッドを実行しているため、単一のコアに制限されている場合にわずかに遅くなるかどうかは理解できましたが、この極端な違いは理解できません. シングルコアの古いラップトップで同じプログラムを実行しましたが、約 15 秒で実行されます。ここで何が起こっているのかを理解している人はいますか、またはこのようなことを経験せずに jvm をマルチコアシステムのシングルコアに制限することに成功した人はいますか? ところで、ホットスポット 1.6.0_26-b03 と 1.7.0-b147 の両方でこれを試しましたが、同じ問題です。

どうもありがとう

4

2 に答える 2

1

これは、相互依存関係を持つ 2 つ以上のスレッドがある場合の正常な動作です。2 つのスレッドがメッセージやデータをピンポンするプログラムを想像してみてください。両方が実行されている場合、これにはピンポンごとに 10 ~ 100 ns かかることがあります。コンテキスト スイッチを実行する必要がある場合、それぞれ 10 ~ 100 マイクロ秒かかることがあります。1000倍の増加は驚くべきことではありません。

プログラムを 1 つのコアに制限したい場合は、その一部を書き直して、1 つのコアで効率的に実行するように設計する必要がある場合があります。

于 2012-04-04T06:24:02.047 に答える