2013-04-20 65 views
-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)); 
    } 
} 
 
and test result: 
[[email protected] longer]$ ~/opt/taobao/install/jdk-1.7.0_10/bin/java TestSplit3 0 
newfile:0 
split:1772 
[[email protected] longer]$ ~/opt/taobao/install/jdk-1.7.0_10/bin/java TestSplit3 1 
newfile:6 
split:1763 
[[email protected] longer]$ ~/jdk-1.6.0_32/bin/java TestSplit3 0 
newfile:0 
split:2833 
[[email protected] longer]$ 
[[email protected] longer]$ ~/jdk-1.6.0_32/bin/java TestSplit3 1 
newfile:5 
split:3416 

E,在JDK7,運行時間是一致的。但在JDK6, 'TestSplit3 0' 比 'TestSplit3 1' 更快。 誰能告訴我爲什麼??以及如何改進jdk6

+0

是不是3416ms超過2833ms慢? – johnchen902 2013-04-20 06:29:07

+0

是的。 3416ms比2833ms慢。因爲testfile.i很困惑 – fengshen 2013-04-20 06:31:15

+0

你說'TestSplit3 1'比'TestSplit3 0'更快 – johnchen902 2013-04-20 06:32:23

回答

1

這很可能是由於您的基準測試存在缺陷。

Java中的基準測試需要考慮的,當您啓動執行程序中發生的「JVM熱身」效果的事實帳戶:

  • 代碼可「按需」加載。
  • 類按需「初始化」。
  • 方法是在執行一段時間後編譯JIT。
  • 默認情況下,堆開始「小」,並且可能會在每個GC週期後增長......

這些影響意味着您從基準循環獲得的初始結果可能是異常的。您的代碼只需要進行一次測量,並且無法判斷「熱身」效果是否會扭曲它。

參考:

+0

謝謝你..我知道你的意思,但拖曳的場景是hadoop 0.19.1 vs hadoop 0.23.6。所以我想知道爲什麼。如何解決缺陷?我不使用jdk7。 – fengshen 2013-04-20 06:57:12

+1

我不明白這是如何相關的。如果你想要有意義的數字(即值得討論的數字),你需要修正你的基準。如果某件事情沒有意義,那麼就不會推測它可能意味着什麼。 – 2013-04-20 07:00:54

+0

en謝謝。我使用-XX:CICompilerCount = 1運行時間在jdk6 – fengshen 2013-04-20 07:08:42