- - PR -
JSPのコンパイルと実行速度
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2002-04-26 15:53
JSP+servlet+EJBによるシステム構築
を考えています。 これらのソースはコンパイルの必要があるかどうか を色々調べてみた結果、 @servletとEJBは予めコンパイルする必要がある AJSPは初回のリクエストでサーブレットに変換 後コンパイルされ、メモリ上にセッションが残る。 以降のリクエストではメモリ上のセッションにいる ものを利用する。 という事までは分かりました。 これによると、JSPは初回の実行が遅いという事の 様ですが、これを回避することはできますでしょうか。 (例えば予めコンパイルしておく等) また、実際にどの位遅いのか、具体的に知りたく、 他のCGIと比較したベンチマークなどがあると わかり易いので探してみたのですが 、残念ながら そういった資料は見つまりませんでした。 何か資料をご存じないでしょうか。 | ||||||||
|
投稿日時: 2002-04-26 16:26
>これを回避することはできますでしょうか。
>(例えば予めコンパイルしておく等) たとえば、Tomcatならbin/jspcがあります。 http://jakarta.apache.org/tomcat/tomcat-3.3-doc/tomcat-ug.html | ||||||||
|
投稿日時: 2002-04-30 10:37
ほとんどのコンテナにプリコンパイルの手段があります。 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の導入時にプリコンパイル指定が可能です。
一概に単純比較できないと思います。JSP->javaソースのコンパイルは コンテナごとに実装が異なりますし、javaソース->classのコンパイルも 選択肢があります。 また、ページの記述内容によっても大幅に異なります。1つのJSPファイルが 部品化され、複数の部品jspを取り込んでいるような場合、<jsp:include >で 取り込んでいる場合と、<%@ include %>を利用しているのでは、コンパイル 時間が著しく違います。前者では個々の部品jspが翻訳単位になりますが、 後者ではソースを取り込んでからコンパイルしますので、単一の翻訳単位と なるからです。前者の場合でも、取り込まれる部品jspが他のページで利用 されていて、既にコンパイル済みであれば、レスポンスタイムは縮小されます。 _________________ Paul K.Nakagome | ||||||||
|
投稿日時: 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 20:17
WebSphereのJspBatcheCompilerってのが漏れなくついています。
ただいくつか制限がありますが。 | ||||||||
|
投稿日時: 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 ) | ||||||||
|
投稿日時: 2002-05-02 15:07
裏技的に、コンパイル済みクラスもまとめて3台に配布、というのも手かと。 あと、web.xml に .jsp を preload させるという手もあるかも。 # 全部書くのは面倒ですし、実装されてるか不安ではありますが。 ## 個人的には、コンテナ固有の機能には依存したくないんで…:) [ メッセージ編集済み 編集者: しょむ 編集日時 2002-05-02 15:11 ] | ||||||||
1
