[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10095] Re: Java 言語で学 ぶデザインパターン入門第 6 回議事録



(株)ネットジーンの村山です.

断言はできませんが,
> > StringBuffer b = new StringBuffer();
> > synchronized (b)
> > {
> >   b.append(foo);
> >   b.append(bar);
> >   b.append(baz);
> > }
これって早くなりますかね?

モニタの取得/開放が一回ずつ増える分だけ,かえって
遅くなりそうな気がしますが.ロジックから見ても,よほど
器用な(或いはひねくれた)最適化をしない限り,まず早く
なることはないと思います.

synchronizedが厄介なのは,これを取り除くとプログラムの
ロジック/アルゴリズムが変化することです.このためJavaVM
やコンパイラ側での最適化は,まず不可能だと思います.不要な
同期を削除するのはプログラマーに任せる他ないでしょう.

このページの他の「最適化」にもざっと目を通しましたが,
正直言ってあまりお勧めできそうにありません.それこそ
インタプリタ時代の遺物という可能性も高いと思います.
最近の最適化機能を満載したJavaVMを使う場合には避けた
方が無難でしょう.

> > synchronizedの実装にもよるだろうけど、確かに速そうです。
実装者の考え方としては,
1,モニタを二回以上取得するのは稀だから,二回以上の時が
  若干遅くなっても一回だけの時に最適化してモニタを実装する.
2,二回以上の時も一回だけの時も,同じになるように実装する.

のどちらかでしょう.2の場合はまだいいんですが,
1の場合は明らかに遅くなりますね.