[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の場合は明らかに遅くなりますね.