字符串长度()故障性能

时间:2013-09-10 19:19:10

标签: java

从Code for String类我可以看到length()返回value.length (here)

假设我想要打印字符串str length()的长度。

Q1)从以下代码片段中做到这一点的更好方法是:(如果你有更好的方法,请建议)

代码1:

public static void main(String[] args) {        
        String str="Hello World";
        for(int i=0;i<str.length();++i){
            System.out.println(str.length());
        }        
}

代码2 (我更喜欢这个提供程序可读性的原因......)

public static void main(String[] args) {        
        String str="Hello World";
        final int len=str.length();
        for(int i=0;i<len;++i){
            System.out.println(len);
        }        
    }

代码3:

public static void main(String[] args) {        
        String str="Hello World";
        int len=str.length();
        for(int i=0;i<len;++i){
            System.out.println(len);
        }        
    }

Q2)哪种方式最优化或者它们是相同的?

Q3)编译器是否内联为该程序生成的字节码的长度?

谢谢!

2 个答案:

答案 0 :(得分:4)

java的一般规则:在遇到性能问题之前不要进行优化。

特别是在像这样的情况下。您可以考虑网络连接或数据库的性能。这些事情可能需要几秒钟。

答案 1 :(得分:1)

所有建议的代码段都是微优化,并且不会产生明显的性能提升。值得一提的是,这是另一种选择......

final String str = "Hello World";
for (int i = 0, n = str.length(); i < n; ++i) {
    System.out.println(n);
}

有什么区别? n是在使用它的块的范围上定义的,++i 可能更快(这可以讨论,请参阅此question)和String对象,final可能进行优化,以便编译器更快地访问(我正在推测),但这就是全部。一旦JIT编译器启动,所有片段都不会比其他片段更快更快,真正重要的是哪一个更容易阅读和理解。

关于另外两个问题:三个选项(四个计数我的)实际上是等价的,因为JIT基础设施可能会在迭代期间将长度存储在它自己的寄存器中,因为它没有改变,它是在循环中使用,所以手动编译器的工作是没有意义的。优化可读性,忘记早期优化(这是所有邪恶的根源),如果有疑问,首先配置文件并稍后进行优化。