【问题标题】:String Length() Trouble Performance [closed]字符串长度()故障性能[关闭]
【发布时间】:2013-09-10 19:19:09
【问题描述】:

从 String 类的代码中,我可以看到 length() 返回 value.length (here)

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

Q1)从以下代码sn-ps中更好的方法是什么:(如果您有更好的方法,请提出)

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

谢谢!

【问题讨论】:

  • 对于这样一个小程序,你可以编译程序并查看字节码。按照 wiki 文章了解字节码说明。 JVM 是另一回事。
  • 我不明白你要做什么...为什么要打印出str 的长度 11 次?
  • 调用length()所花费的时间与打印结果所花费的时间相比可以忽略不计。
  • 只要遵循这些简单的规则:程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅限专家!):不要这样做
  • @boxed__l 这两者有些不同,因为通过分解length() 调用,您允许编译器用并行索引替换模除法,它会这样做。在这里,分解length() 调用只会消除一个减法运算,它甚至不如除法那么密集。 (如果没有实际的性能测试表明这是必要的,他们也不应该这样做。)

标签: java


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    所有建议的 sn-ps 都是微优化,不会产生明显的性能提升。为了物有所值,这里还有另一种选择……

    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 编译器启动,任何 sn-ps 都不会比其他 sn-ps 快得多,真正重要的是哪个更容易阅读和理解。

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

    【讨论】:

    • i = 0n = str.length() 之间不需要逗号而不是分号吗?
    • @JoshuaTaylor 哎呀,错字了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2014-06-09
    相关资源
    最近更新 更多