-3

从 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) 编译器是否在为该程序生成的字节码中内联长度?

谢谢!

4

2 回答 2

4

java的一般规则:在出现性能问题之前不要优化。

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

于 2013-09-10T19:23:07.523 回答
1

所有建议的片段都是微优化,不会产生明显的性能改进。对于什么是值得的,这里还有另一种选择......

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

有什么区别?它n是在使用它的块的范围内定义的,++i 可能会更快(这是开放讨论,请参阅this question)并且String对象可能会final被优化,以便编译器更快地访问(我在推测) 但仅此而已。一旦 JIT 编译器启动,任何一个片段都不会比其他片段快得多,真正重要的是哪个更容易阅读和理解。

关于另外两个问题:三个选项(我的四个选项)实际上是等效的,因为 JIT 基础设施可能会在迭代期间将长度存储在它自己的寄存器中,因为它没有改变并且它被用于一个循环,所以手动完成编译器的工作是没有意义的。优化可读性,忘记早期优化(这是万恶之源),如果有疑问,请先分析,然后再优化。

于 2013-09-10T19:22:06.500 回答