gpt4 book ai didi

java - 字符串初始化和性能

转载 作者:行者123 更新时间:2023-12-02 09:49:15 27 4
gpt4 key购买 nike

这是一个与性能相关的问题:

repeatPrint1() 方法中,我将一些 String 属性初始化为 null,然后再在循环中使用它们。在 repeatPrint2() 方法中,我直接在循环内初始化了一些 String 属性。

当我测试时,结果令人惊讶 - repeatPrint2() 的性能比 repeatPrint1() 更好多达近 2500 条记录,但此后 repeatPrint1() 的性能开始优于 repeatPrint2()

谁能解释一下为什么会发生这种情况?在代码审查中,什么才是正确的做法?

代码片段:

public static void main(String[] args) throws Exception {    
long startTime1 = System.nanoTime();
repeatPrint1();
long estimatedTime1 = System.nanoTime() - startTime1;
long startTime2 = System.nanoTime();
repeatPrint2();
long estimatedTime2 = System.nanoTime() - startTime2;
System.out.println("estimatedTime1: " + estimatedTime1);
System.out.println("estimatedTime2: " + estimatedTime2);
}


private static void repeatPrint1() {
String name1 = null;
String name2 = null;
String name3 = null;
String name4 = null;
String name5 = null;

for(int x = 10; x < 2500; x = x + 1) {
name1 = "My Name is AAAA" + x;
name2 = "My Name is BBBB" + x;
name3 = "My Name is CCCC" + x;
name4 = "My Name is DDDD" + x;
name5 = "My Name is EEEE" + x;

System.out.print("name1 : " + name1);
System.out.print("name2 : " + name2);
System.out.print("name3 : " + name3);
System.out.print("name4 : " + name4);
System.out.print("name5 : " + name5);

System.out.println("value of x : " + x);
}
}


private static void repeatPrint2() {
for(int x = 10; x < 2500; x = x + 1) {
String Sname1 = "My Name is AAAA" + x;
String Sname2 = "My Name is BBBB" + x;
String Sname3 = "My Name is CCCC" + x;
String Sname4 = "My Name is DDDD" + x;
String Sname5 = "My Name is EEEE" + x;

System.out.print("Sname1 : " + Sname1 );
System.out.print("Sname2 : " + Sname2 );
System.out.print("Sname3 : " + Sname3 );
System.out.print("Sname4 : " + Sname4 );
System.out.print("Sname5 : " + Sname5 );

System.out.println("value of x : " + x );
}
}

最佳答案

看看这个 question ,它描述了如何设置良好的微基准。

有两个要点是:

  • 有一个预热阶段,在此阶段您将调用您的方法一万次。
    这样 JIT 就会缓存该方法。
  • 如果在repeatPrint2()之前调用repeatPrint1()将会有区别,反之亦然

每次运行时,您使用代码获得的结果都会有所不同。花一些时间建立一个良好的基准以获得有值(value)的结果。

关于java - 字符串初始化和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25581221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com