ページ

2012年9月3日

semaphoreのコスト

気になることがあって、semaphoreのコストがどれくらいあるのか、調べて見ました。サンプルコードは、githubにあります。やっていることはjava.util.concurrent.Semaphoreでacquire/releaseをループでぐるぐる回しているだけです。Semaphoreは順序付き実行と順序なしで実行しています。めんどかったので、計測は秒で、/usr/bin/timeコマンドで測った結果なので、プロセスの起動とかのオーバーヘッドはありますが、気にしないでください。結果は次のとおり。


回数 semaphoreあり/順序付き semaphoreあり/順序なし semaphoreなし     
1 0.05 0.05 0.05
10 0.05 0.05 0.04
100 0.07 0.06 0.04
1000 0.08 0.07 0.06
10000 0.25 0.20 0.07
100000 53.69 1.58 0.06

という結果になりました。semaphoreなしの方は、単なる参考までに。順序なしのほうは、順序ありにくらべて10000回ぐらいまでは誤差の範囲内でパフォーマンスはほとんど変わらないです。10000回ぐらいから順序の有無にかかわらず急激に悪化しますが、順序付きのほうが顕著に悪化します。当たり前か。

で、気になっていたことですが、semaphore を入れるとパフォーマンスがかなり落ちたんですが、上の結果からすると semaphore を激しく使わなければsemaphoreのオーバーヘッドはほとんどなさそうということです。で、実際のコードはそんなに激しくsemaphoreを使っているわけじゃないので、謎は謎のままです。
 

0 件のコメント: