Tomcatの姑息な最適化
家で社内に流れているtracのメールを見ていたらTomcatの一部のデフォルト設定がデバッグ向けになっていることを知りました。下記リンク先のdevelopment設定です。
知りませんでした。
Tomcatの設定ファイルのリファレンスのトップ(http://tomcat.apache.org/tomcat-6.0-doc/config/index.html)から1クリックのリンク先はすべて目を通していた(覚えているわけではない)のですが、上記のJSP周りの設定は別にあるので全然知りませんでした。設定ファイルリファレンスにすべてが網羅されていると思っていたので、だまされた気分です。
それはともかく。
ここで注目したいのがgenStringAsCharArrayです。名前からしてCっぽい最適化の匂いがします。
この設定を使っているのは
- [Tomcatのソースツリー]/java/org/apache/jasper/compiler/Generator.java
内の
- public void visit(Node.TemplateText n) throws JasperException {
の中です。
次の1900行目です。
visitメソッドのやっていることは、JSPファイル内の通常テキストをJavaのサーブレット用コードのout.write("...")に変換することです。簡単に言えば、JSPファイル内に abc と書くと、Javaのサーブレット用コードの out.write("abc") になり、HTTPのレスポンス出力の一部になる、という理屈です。CGIを知っている人はout.writeが標準出力処理に相当すると考えてください。
以下、説明が繁雑になるのでエスケープ処理は無視しています。
genStringAsCharArrayがfalseの場合(デフォルト)、普通に out.write("abc") 相当の文字列を生成します。
genStringAsCharArrayをtrueにすると、次のようなコードを生成します(JSPに書いた文字列が abc の場合)。
static char[] _jspx_char_array_1 = "abc".toCharArray(); // 実際にはクラスフィールド out.write(_jspx_char_array_1);
上記の _jspx_char_array_ の部分は固定文字列です。1 の部分は内部的にインクリメントする数値です。
高速化のポイントは、一度現れた"abc"をキーにして_jspx_char_array_1の名前を内部で記憶しておくことです。2度目に同じ文字列"abc"がJSPに現れると、生成されるコードは次の行だけになります。
out.write(_jspx_char_array_1);
姑息です。少しTomcatが好きになりました。
ところで、これ本当にパフォーマンスの効果はあるのでしょうか。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/tomcat-tuning/tbping