从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)编译器是否内联为该程序生成的字节码的长度?
谢谢!
答案 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基础设施可能会在迭代期间将长度存储在它自己的寄存器中,因为它没有改变,它是在循环中使用,所以手动编译器的工作是没有意义的。优化可读性,忘记早期优化(这是所有邪恶的根源),如果有疑问,首先配置文件并稍后进行优化。