2012-05-21 7 views
6

なぜHtmlUnitがGUIブラウザより遅いのですか?たとえば、HtmlUnitはこのページhttp://oltexpress.airkiosk.com/cgi-bin/airkiosk/I7/181002i?O2=2を14秒間(CSSサポートがオフになっている)、FFが5秒後に(キャッシュをクリアした後、CSSサポートで)読み込みます。私は知っている、現代のブラウザは、HtmlUnitは間違ったJSコードを扱うようにはそれほど制限されていませんが、ここではまだdiffrenceは耐えられません。HtmlUnitはGUIブラウザより遅いですか?

どのようにHtmlUnitで作業をスピードアップするためのアイデアですか?誰もHtmlUnitキャッシュで遊んだことはありますか?

+0

FFはGPUアクセラレーションを使用して[ページの一部]ページをレンダリングします。 – Blender

+0

@Blender htmlUnitでページを高速化することは可能ですか? HtmlPage page1 = webClient.getPage(url); – muthu

答えて

5

大きな違いを生むべきではありません。

HTMLUnitはそれに逆行して多くのものがあるので、これは純粋である:それはある

  • をFireFoxなどのブラウザのネイティブ最適化の多くを持っていないコンパイル言語で動作します。
  • HTML(非厳密)とは対照的に整形式のXMLが必要です。つまり、HTMLをXMLに変換する必要があります。
  • それから、JavaScriptをパーサで実行し、コードの問題を修正してから、Java内部でそのJavaScriptを処理する必要があります。
  • また、@Aryaが指摘したように、一度に1つずつリクエストするので、多くのjavascriptファイルが遅くなり、多くの画像が遅くなります。

    を(それらが必要とされない限り)私は無効に一般的なルールとして:

はそれをスピードアップする方法についてのあなたの質問に答えるために

  • はJavaScript
  • イメージを
  • CSS
  • アプレット。

私もソースコードを取得し、ActiveXサポートを削除して再コンパイルしました。コードが余分なページを読み込まないようにするには、以下のコードを使用してWebからダウンロードせずに応答してください。

WebClient browser; 
browser.setWebConnection(new WebConnectionWrapper(browser) { 
    @Override 
    public WebResponse getResponse(final WebRequest request) throws IOException { 
     if (/* Perform a test here */) { 
      return super.getResponse(request); // Pass the responsibility up. 
     } else { 
      /* Give the program a response, but leave it empty. */ 
      return new StringWebResponse("", request.getUrl()); 
     } 
    } 
}); 
私が気づいた

他のもの:

  • HTMLUnitあなたはおそらく、スレッドごとに新しいものを作成する必要があること、安全な意味をスレッドではありません。
  • HTMLUnitは実際に
+0

"それから、オブジェクト全体を解析する必要があります。各タグは別々のオブジェクトです(オブジェクトの作成は高価です)。 & "それから、JavaScriptをパーサーで実行し、コードの問題を修正してから、Java内部で処理しなければなりません。 - 私は確信していませんが、私は "普通の"ブラウザでもそうしていると思います。 あなたの答えに感謝します! – biera

+0

私はあなたの意見を見ます。私は、言語とライブラリが高密度解析と実行のために特別に設計されていないことを指摘しようとしていました。 – Lee

+0

@Lee htmlUnitでページを高速化することは可能ですか? HtmlPage page1 = webClient.getPage(url); – muthu

1

HTMLUnitで時間がかかる理由は、各リクエストが1つずつ実行されるからです。それがページを検索するのに時間がかかる主な理由です。 JSとCSSはそれが遅い理由について、あなたの質問に答えるためにIMO

0

Webクライアントオブジェクトは静的リソースのキャッシュを保持したページをキャッシュしません。 WebClientオブジェクトを閉じて別のオブジェクトを作成する場合は、キャッシュを再構築する必要があります。

これを回避するには、WebClientオブジェクトを複数のセッションにわたって再利用するか、WebClientオブジェクトのプールを維持することができます。また、Cacheオブジェクトを維持できるかどうかを確認してください。WebClientのクッキーをプールに戻す前にクリアすることができます。

@Leeが指摘しているように、WebConnectionWrapperはあなたに傍受の機会を与えます。リダイレクトを避けたり、選択したリソースのJS実行を無効にしたり、そのリソースを気にしなければモックデータを返すために使用します。

関連する問題