【问题标题】:Direct String quicker than a String Variable?直接字符串比字符串变量更快?
【发布时间】:2013-11-28 00:22:15
【问题描述】:
    final String string1 = "somestring1";
    for (int i = 0; i < 30; i++) {
        final String string2 = "somestring2";
        if (string2.equals(string1)) { // Using variable
            // do stuff
        }
    }

    for (int i = 0; i < 30; i++) {
        final String string2 = "somestring2";
        if (string2.equals("somestring1")) { // Not using variable
            // do stuff
        }
    }

实际上哪个会更快?

1)第一个将其保存为变量并使用该变量直到循环完成。

2) 第二个每次都会生成一个新的字符串,不是吗?

这只是一个例子,在我的例子中毫秒很重要。

提前致谢。

【问题讨论】:

  • #2 不会每次都创建新字符串,但每次都必须检查池并检索实习生。见字符串实习:en.wikipedia.org/wiki/String_interning
  • @Radiodef:是什么让您认为每次都必须查找被实习的字符串?
  • @LouisWasserman 我已经读过几个地方了。为什么不需要找回来? JLS 声明字符串文字是通过 String#intern 方法进行实习的,该方法的文档指定查询池。
  • 它不必被检索,因为当类加载时字符串被实习一次,之后它只是成为实习池中字符串的固定指针。

标签: java string variables


【解决方案1】:

最简单的方法是尝试看看会发生什么:

    public static void main(String[] args) {

    final int numOfTrials = 100000;

    long first = 0;
    for (int index = 0; index < numOfTrials; index++) {
        long start = System.nanoTime();
        final String string1 = "somestring1";
        for (int i = 0; i < 30; i++) {
            final String string2 = "somestring2";
            if (string2.equals(string1)) { // Using variable
                // do stuff
            }
        }
        first+= (System.nanoTime()-start);
    }

    long second = 0;
    for (int index = 0; index < numOfTrials; index++) {
        long start = System.nanoTime();
        for (int i = 0; i < 30; i++) {
            final String string2 = "somestring2";
            if (string2.equals("somestring1")) { // Not using variable
                // do stuff
            }
        }
        second+= (System.nanoTime()-start);
    }


    System.out.println("First : "+(first/numOfTrials)+"ns");
    System.out.println("Second : "+second/numOfTrials+"ns");
}

numOfTrials = 10000

输出

First : 139ns
Second : 59ns

JVM 内部有一种缓存机制,如果已经有一个匹配的字符串对象,JVM 将不会创建新的字符串对象,而是使用现有的。有一些方法可以强制 jvm 创建新的字符串,比如关键字“new”。如果您想深入了解,您可能需要找到一篇文章并阅读它。


numOfTrials = 100 万

输出:

First : 42ns
Second : 34ns

numOfTrials = 1 亿

输出:

First : 31ns
Second : 31ns

【讨论】:

    【解决方案2】:

    第一个版本(如下所列)将执行得更快,因为它只创建一次字符串。

    final String string1 = "somestring1";
    for (int i = 0; i < 30; i++) {
        final String string2 = "somestring2";
        if (string2.equals(string1)) { // Using variable
            // do stuff
        }
    }
    

    【讨论】:

      【解决方案3】:

      这些都将是 100% 等效的。没有区别,甚至毫秒都没有。

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 1970-01-01
        • 2013-02-12
        • 2021-11-20
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多