2012-05-03 12 views
1

私はHTMLストリッパー(Javaで書かれた)のいくつかのパフォーマンステストを行っています、つまり、実際にHTMLコンテンツを文字列(HTMLストリッパー )に渡し、後者はプレーンテキストを返しますおよびメタ情報)。ここ メソッド呼び出しのjvmキャッシュ?

毎回200回計算される具体的な実装

public void performanceTest() throws IOException { 
    long totalTime; 
    File file = new File("/directory/to/ten/different/htmlFiles"); 
    for (int i = 0; i < 200; ++i) { 
     for (File fileEntry : file.listFiles()) { 

      HtmlStripper stripper = new HtmlStripper(); 
      URL url = fileEntry.toURI().toURL(); 
      InputStream inputStream = url.openStream(); 
      String html = IOUtils.toString(inputStream, "UTF-8"); 
      long start = System.currentTimeMillis(); 
      String text = stripper.getText(html); 
      long end = System.currentTimeMillis(); 
      totalTime = totalTime + (end - start); 

     //The duration for the stripping of each file is computed here 
    // (200 times for each time). That duration value decreases and then becomes constant 
    //IMHO if the duration for the same file should always remain the same. 
    //Or is a cache technique used by the JVM?   


     System.out.println("time needed for stripping current file: "+ (end -start)); 
     } 
    } 
    System.out.println("Average time for one document: " 
      + (totalTime/2000)); 

} 

しかし、各ファイルのストリッピングのための期間の例であり、異なる減少値を有します。同じファイルXの継続時間が常に同じになる必要がある場合はIMHO !?または、JVMで使用されるキャッシュ手法ですか?

ご協力いただければ幸いです。事前に おかげ

ホレス

はN.B: - 私は私のマシン上でローカルテスト(NOリモート、NO HTTP)を行っています。 - 私はUbuntu 10.04でJava 6を使用しています

答えて

4

これは全く正常です。 JITはメソッドをネイティブコードにコンパイルし、ますます頻繁に使用されるようにそれらをより大きく最適化します。 (「定数」あなたのベンチマークは、最終的にJITの最適化機能のピークであるために収束する。)

あなたはが前方法を何度も実行せずにJavaで良いベンチマークを取得することはできませんあなたがすべてでタイミングを開始します。私見

+0

[Google Caliper](http://code.google.com/p/caliper/)のようなマイクロベンチマーキングフレームワークが存在していますが、そのような初期化を行うのに役立ちますが、まだ書くことについては賢明でなければなりませんベンチマークそのもの。キャリパー自体はまだ少し生のままですが、私はそれが非常に有用であることを発見しました。私は他のベンチマークフレームワークも存在すると確信しています。 –

+0

FYI、Caliperはあまりにも遠くない将来、srs bsnsのリリースに向けて準備中です。 –

+0

大変ありがとうございます。それは全体を説明します:-) – Horace

0

いずれかの期間と同じファイルXは、常に最適化するジャストインタイムコンパイラの存在下で

同じではありません残っている必要があります。とりわけ、特定のメソッド/ブランチが何回使用されたかを追跡し、Javaバイトコードをネイティブコードに選択的にコンパイルします。

関連する問題