-1

以下で sting.split をテストします。

import java.io.File;

public class TestSplit3 {
  private static final String PROCFS = "/proc/";

  public static void main(String[] args) {
    //split();
    testfile(Integer.parseInt(args[0]) > 0);
    split();
  }

  private static void testfile(Boolean flag) {
    long start = System.currentTimeMillis();
    if (flag) {
      for (int i = 0; i < 1000; i++) {
        new File(PROCFS + i);
      }
    }
    System.out.println("newfile:" + (System.currentTimeMillis() - start));
  }

  public static void split() {
    long start = System.currentTimeMillis();
    for (int j = 0; j < 1000; j++) {
      for (int i = 0; i < 1000; i++) {
        String str = "asas asa s asas asas asa sa sas as as as a a"
            + "asa sasa sa sa sas as as asas as as as as as as"
            + "as as a sas asdasdas dasd asda sd ada d";
        str.toString().split(" ");
      }
    }
    System.out.println("split:" + (System.currentTimeMillis() - start));
  }
}
およびテスト結果:
[mapred@r03c02038 以上]$ ~/opt/taobao/install/jdk-1.7.0_10/bin/java TestSplit3 0
新しいファイル:0
スプリット:1772
[mapred@r03c02038 以上]$ ~/opt/taobao/install/jdk-1.7.0_10/bin/java TestSplit3 1
新しいファイル:6
スプリット:1763
[mapred@r03c02038 以上]$ ~/jdk-1.6.0_32/bin/java TestSplit3 0
新しいファイル:0
分割:2833
[mapred@r03c02038 長い]$
[mapred@r03c02038 以上]$ ~/jdk-1.6.0_32/bin/java TestSplit3 1
新しいファイル:5
分割:3416

e、jdk7では、実行時間は一貫していますが、jdk6では、「TestSplit3 0」は「TestSplit3 1」よりも高速です。誰が理由を教えてくれますか??そしてjdk6で改善する方法

4

1 に答える 1

1

ベンチマークに欠陥があることが原因である可能性が最も高いです。

Java のベンチマークでは、プログラムの実行を開始したときに発生する「JVM ウォームアップ」効果を考慮する必要があります。

  • コードは「オンデマンド」でロードできます。
  • クラスは「オンデマンド」で初期化されます。
  • メソッドは、実行を少し実行した後に JIT コンパイルされます。
  • デフォルトでは、ヒープは「小さく」開始され、GC サイクルごとに成長する可能性があります。

これらの影響は、ベンチマーク ループから得られる初期結果が異常である可能性があることを意味します。あなたのコードは 1 回の測定しか行わず、「ウォームアップ」効果がコードを歪ませているかどうかを判断する方法はありません。

参照:

于 2013-04-20T06:39:46.713 に答える