5

なぜHtmlUnitはGUIブラウザよりもはるかに遅いのですか?たとえば、HtmlUnitはこのページをhttp://oltexpress.airkiosk.com/cgi-bin/airkiosk/I7/181002i?O2=2で14秒(CSSサポートがオフの場合)にロードしますが、FFは5秒でロードします(キャッシュをクリアした後) 、CSSサポート付き)。最近のブラウザは、HtmlUnitがそうであるのに、悪いJSコードをそれほど制限的に処理していませんが、それでもここでの時間差は耐えられません。

HtmlUnitでの作業をスピードアップする方法はありますか?誰かがHtmlUnitキャッシュで遊んだことがありますか?

4

3 に答える 3

5

なぜ遅いのかという質問に答えるには:

これは純粋に、HTMLUnitがそれに反する多くのことを持っているためです。

  • これは、FireFoxなどのブラウザのネイティブ最適化の多くを持たないコンパイル言語で実行されています。
  • HTML(非厳密)とは対照的に、整形式のXMLが必要です。つまり、HTMLをXMLに変換する必要があります。
  • 次に、パーサーを介してJavaScriptを実行し、コードの問題を修正してから、Java自体の内部で処理する必要があります。
  • また、@ 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は実際にページをキャッシュします
于 2012-12-11T13:10:32.917 に答える
1

HTMLUnitで時間がかかる理由は、各リクエストが1つずつ実行されるためです。これが、ページの取得に非常に時間がかかる主な理由です。JSとcssはIMOに大きな違いをもたらすべきではありません

于 2012-06-20T21:07:01.670 に答える
0

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

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

@Leeが指摘したように、 WebConnectionWrapperはインターセプトの機会を提供します。リダイレクトを回避したり、選択したリソースのJS実行を無効にしたり、そのリソースを気にしない場合はモックデータを返したりするために使用します。

于 2015-05-07T16:24:21.800 に答える