- PR -

JSPのコンパイルと実行速度

1
投稿者投稿内容
てすた
会議室デビュー日: 2002/04/26
投稿数: 1
投稿日時: 2002-04-26 15:53
JSP+servlet+EJBによるシステム構築
を考えています。

これらのソースはコンパイルの必要があるかどうか
を色々調べてみた結果、
@servletとEJBは予めコンパイルする必要がある
AJSPは初回のリクエストでサーブレットに変換
 後コンパイルされ、メモリ上にセッションが残る。
 以降のリクエストではメモリ上のセッションにいる
 ものを利用する。
という事までは分かりました。
これによると、JSPは初回の実行が遅いという事の
様ですが、これを回避することはできますでしょうか。
(例えば予めコンパイルしておく等)

また、実際にどの位遅いのか、具体的に知りたく、
他のCGIと比較したベンチマークなどがあると
わかり易いので探してみたのですが 、残念ながら
そういった資料は見つまりませんでした。

何か資料をご存じないでしょうか。

miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-04-26 16:26
>これを回避することはできますでしょうか。
>(例えば予めコンパイルしておく等)

たとえば、Tomcatならbin/jspcがあります。
http://jakarta.apache.org/tomcat/tomcat-3.3-doc/tomcat-ug.html
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-04-30 10:37
引用:

これによると、JSPは初回の実行が遅いという事の
様ですが、これを回避することはできますでしょうか。
(例えば予めコンパイルしておく等)


ほとんどのコンテナにプリコンパイルの手段があります。
Tomcatではmikiさんのご指摘のとおりですが、
WebLogicでは、
http://edocs.beasys.co.jp/e-docs/wls61/jsp/reference.html#68996
JRUNでは
http://jrun.itfrontier.co.jp/docs/jrun31j/html/Developing_Applications_with_JRun/jspcompile3.html
WebSphereでは、WARの導入時にプリコンパイル指定が可能です。

引用:

また、実際にどの位遅いのか、具体的に知りたく、
他のCGIと比較したベンチマークなどがあると


一概に単純比較できないと思います。JSP->javaソースのコンパイルは
コンテナごとに実装が異なりますし、javaソース->classのコンパイルも
選択肢があります。
また、ページの記述内容によっても大幅に異なります。1つのJSPファイルが
部品化され、複数の部品jspを取り込んでいるような場合、<jsp:include >で
取り込んでいる場合と、<%@ include %>を利用しているのでは、コンパイル
時間が著しく違います。前者では個々の部品jspが翻訳単位になりますが、
後者ではソースを取り込んでからコンパイルしますので、単一の翻訳単位と
なるからです。前者の場合でも、取り込まれる部品jspが他のページで利用
されていて、既にコンパイル済みであれば、レスポンスタイムは縮小されます。

_________________
Paul K.Nakagome
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-01 13:26
<ページURL>?jsp_precompile
というのが JSP の spec で定義されています。

http://mogemoge/fugafuga/hoge.jsp?jsp_precompile
へのダミーアクセスをかませば、コンパイルだけやってくれるはず。
確か JSP 1.1 でもできたはず。

あと、

>JSPは初回のリクエストでサーブレットに変換
> 後コンパイルされ、メモリ上にセッションが残る。
> 以降のリクエストではメモリ上のセッションにいる
> ものを利用する。

は「セッション」というのがなにか不明ですが、
ふつうは .jsp を .java に変換、コンパイルして working ディレクトリにキャッシュされます。メモリ上ではありません。

.jsp を動的に生成/変更しない限り実際に動かしてテストするでしょうから、初回起動時のコンパイル時間というのが問題になることはほぼないでしょう。

[ メッセージ編集済み 編集者: しょむ 編集日時 2002-05-01 13:33 ]
うどん
会議室デビュー日: 2002/05/01
投稿数: 1
投稿日時: 2002-05-01 20:17
WebSphereのJspBatcheCompilerってのが漏れなくついています。
ただいくつか制限がありますが。
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-05-02 10:18
>.jsp を動的に生成/変更しない限り実際に動かしてテストするでしょうから、
> 初回起動時のコンパイル時間というのが問題になることはほぼないでしょう。
一般的にそうだと思います。
たいていは、本番機にWeb Applicationを導入したり、保守を行った後に
Web Clientから各JSPへリクエストを出すことでコンパイルをしておくことが
多いと思います。

しかしながら、大規模なアプリケーションになりますと、そうは簡単に
行かないことがあります。たとえば3台のマシンで負荷分散をしているような
環境で、しかもJSPファイルの数がそれぞれ3桁に及ぶような場合です。
各マシンにデプロイされているJSPにすべてリクエストを出すというのは
現実的ではありません。

そこで、商用のアプリケーションサーバでサポートされているバッチ形式の
プリコンパイル機能が意味を持つわけです。

>WebSphereのJspBatcheCompilerってのが漏れなくついています。
WAS4.0では、Tomcatのコードベースを利用して、エンタープライズレベルの
運用をターゲットにしたさまざまな拡張を施しているようです。これは
jasperのJSPコンパイラをバッチ利用できるようにしたものですね。

Weblogic Server6.0では、web.xmlに以下のように記述することで、Server
起動時にJSPをプリコンパイルすることができます。
<context-param>
<param-name>weblogic.jsp.precompile</param-name>
<param-value>true</param-value>
</context-param>

Weblogic Server6.1では、weblogic.xmlに以下のように記述することで、デプロイ
(再デプロイ)時またはServer起動時にプリコンパイルすることができます。
<jsp-descriptor>
<jsp-param>
<param-name>
precompile
</param-name>
<param-value>
true
</param-value>
</jsp-param>
</jsp-descriptor>

中込 潔人( mailto:nakagome@nakagome.co.jp )
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-02 15:07
引用:

しかしながら、大規模なアプリケーションになりますと、そうは簡単に
行かないことがあります。たとえば3台のマシンで負荷分散をしているような
環境で、しかもJSPファイルの数がそれぞれ3桁に及ぶような場合です。
各マシンにデプロイされているJSPにすべてリクエストを出すというのは
現実的ではありません。



裏技的に、コンパイル済みクラスもまとめて3台に配布、というのも手かと。
あと、web.xml に .jsp を preload させるという手もあるかも。
# 全部書くのは面倒ですし、実装されてるか不安ではありますが。

## 個人的には、コンテナ固有の機能には依存したくないんで…:)

[ メッセージ編集済み 編集者: しょむ 編集日時 2002-05-02 15:11 ]
1

スキルアップ/キャリアアップ(JOB@IT)