0

xhtmlのすべてのテキストノードを処理するためにSTAXパーサーを使用しています。アプリケーションはUnixボックスにデプロイされます。解析操作は、最初に実行されるインスタンスに時間がかかります。2回目の実行では、比較的短時間で済み、その後の呼び出しでは、2回目の実行よりもはるかに短時間で済み、その後はほぼ一貫した結果が得られます。以下は私が使用しているコードです。同じ入力の解析にかかる時間に一貫性がない理由がわかりません。助けてください。

XmlInputFactoryの1回の作成(クラスレベルの静的メソッド)

    static {
    if (xmlInputFactory == null) {
    xmlInputFactory = XMLInputFactory.newInstance();
    xmlInputFactory.setProperty(javax.xml.stream.XMLInputFactory.IS_NAMESPACE_AWARE, false);
    }
    }

同じ入力ファイルに対して一貫性のない異なる応答時間を与える解析コード、

    private static void parse(String xhtmlInput) throws XMLStreamException {
    ByteArrayInputStream arrayInputStream = new ByteArrayInputStream      (xhtmlInput.getBytes(Charset.forName("UTF-8")));
    XMLStreamReader parser = xmlInputFactory.createXMLStreamReader(arrayInputStream);
    while (true) {
    int currentEvent = parser.next();
    if (currentEvent == XMLStreamConstants.CHARACTERS) {
        // Do operation
    } else if (currentEvent == XMLStreamConstants.END_DOCUMENT) {
    parser.close();
    break;
    }
    }
    }
4

1 に答える 1

3

それがどの実装であるかを知らなければ、これは少し推測ですが、Javaライブラリまたはアプリケーションがしばらくするとより速く実行される2つの一般的な理由があります。

  • JVM自体がバイトコードのジャストインタイムコンパイルを実行し、その場で最適化します。これはJITウォームアップと呼ばれ、非常に迅速に(最初の10秒程度で)発生します。
  • ファイルを読み取るとき、基盤となるオペレーティングシステムは通常、読み取られているディスクブロックをキャッシュします。同じコンテンツを再度読み取ると、ディスクからではなく、メモリ内のディスクバッファから読み取られます。

これらは、ナイーブなJavaテストベンチマークが役に立たない結果をもたらす最も一般的な理由でもあります。両方を考慮しない場合(つまり、テストをしばらくウォームアップし、初期結果を破棄し、ディスクではなくメモリからテストデータを読み取る)、結果は無意味です。

于 2011-01-13T18:51:29.753 に答える