2013-04-20 67 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