Java 字符串在一个代码后性能下降

Java 字符串在一个代码后性能下降,java,string,split,Java,String,Split,我在下面测试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

我在下面测试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));
  }
}
导入java.io.File;
公共类TestSplit3{
私有静态最终字符串PROCFS=“/proc/”;
公共静态void main(字符串[]args){
//split();
testfile(Integer.parseInt(args[0])>0);
split();
}
私有静态void测试文件(布尔标志){
长启动=System.currentTimeMillis();
国际单项体育联合会(旗){
对于(int i=0;i<1000;i++){
新文件(PROCFS+i);
}
}
System.out.println(“新文件:”+(System.currentTimeMillis()-start));
}
公共静态void split(){
长启动=System.currentTimeMillis();
对于(int j=0;j<1000;j++){
对于(int i=0;i<1000;i++){
String str=“asas asas asas asas as as as a”
+“asa sasa sa sas as as as as”
+“作为sas asdasdas dasd asda ada d”;
str.toString().split(“”);
}
}
System.out.println(“拆分:”+(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呢?很可能是因为您的基准存在缺陷

Java中的基准测试需要考虑在开始执行程序时发生的“JVM预热”效应:

  • 代码可以“按需”加载
  • 类是“按需”初始化的
  • 方法在执行一段时间后进行JIT编译
  • 默认情况下,堆从“小”开始并可能增长。。。在每个GC循环之后
这些影响意味着您从基准循环中获得的初始结果可能是异常的。您的代码只进行一次测量,无法判断“预热”效应是否正在扭曲它

参考:


3416毫秒不是比2833毫秒慢吗?是的。3416ms比2833ms慢。因为testfile。我很困惑你说的“TestSplit3 1”比“TestSplit3 0”快。步骤1:阅读我觉得循环实际上什么都不做,应该由JVM优化(热点)。如果是这样的话,这是一个完全没有意义的基准。谢谢你。我知道你的意思。但是两个场景是hadoop 0.19.1和hadoop 0.23.6。所以我想知道为什么。如何解决缺陷?我不使用jdk7。我不认为这有什么关系。如果你想要有意义的数字(即值得讨论的数字),你需要修正你的基准。如果某件事毫无意义,那么揣测它可能意味着什么是没有意义的。我使用-XX:CICompilerCount=1运行时间在JDK6中是一致的,我不明白你在说什么。和什么一致?自己呢?使用jdk7?不使用JVM选项? and test result: [mapred@r03c02038 longer]$ ~/opt/taobao/install/jdk-1.7.0_10/bin/java TestSplit3 0 newfile:0 split:1772 [mapred@r03c02038 longer]$ ~/opt/taobao/install/jdk-1.7.0_10/bin/java TestSplit3 1 newfile:6 split:1763 [mapred@r03c02038 longer]$ ~/jdk-1.6.0_32/bin/java TestSplit3 0 newfile:0 split:2833 [mapred@r03c02038 longer]$ [mapred@r03c02038 longer]$ ~/jdk-1.6.0_32/bin/java TestSplit3 1 newfile:5 split:3416