1

只是好奇,哪个更有效?

这:

String a = someString + "." + anotherString;

或这个:

String a = someString + '.' + anotherString;
4

4 回答 4

13

你真的不应该关心,除非这是你所做的,每秒数千次,几个小时。

有传言说使用StringBuilder是最快的。

尝试它们,循环运行一百万次,并记录所花费的时间,然后向我们其他人报告。

于 2009-11-16T06:47:07.357 回答
12

查看StringBuilder.appendand的代码AbstractStringBuilder.append,我会期待'.' 形成更快。

它几乎没有什么可做的,基本上:

  • 它不需要进行空值检查,因为 char 不能为空
  • 它不会尝试对附加的空字符串进行优化
  • 它不需要获取要添加的长度 - 它始终为 1
  • 它只需要对数组执行一次赋值,而不是一次迭代循环

不过,和其他人一样,我不认为这种差异在实际应用程序代码中会很显着。

我不知道 Java 编译器意识到附加的是一个长度为 1 的常量字符串并将其转换为字符文字是否有效 - 或者即使它是有效的它是否会打扰这样做.

于 2009-11-16T07:23:25.200 回答
6

它们非常相似。'.'稍微快一点,但差异可以忽略不计(1000 万循环中大约 20 毫秒)。

这是我的测试:

$cat UsingC.java  UsingS.java  
public class UsingC { 
    public static void main( String [] args ) { 
        String someString  = "";
        String anotherString = "";

        int i = 0;
        while( i++ < 10000000 ) { 
            String a = someString + '.' + anotherString;
        }
    }
}
public class UsingS{ 
    public static void main( String [] args ) { 
        String someString  = "";
        String anotherString = "";

        int i = 0;
        while( i++ < 10000000 ) { 
            String a = someString + "." + anotherString;
        }
    }
}
$for i in 1 2 3 4 5 ; do time java UsingC; done

real    0m1.643s
user    0m1.424s
sys 0m0.108s

real    0m1.670s
user    0m1.468s
sys 0m0.056s

real    0m2.023s
user    0m1.448s
sys 0m0.080s

real    0m1.669s
user    0m1.432s
sys 0m0.088s

real    0m1.674s
user    0m1.416s
sys 0m0.104s
$for i in 1 2 3 4 5 ; do time java UsingS; done

real    0m2.344s
user    0m1.584s
sys 0m0.136s

real    0m2.057s
user    0m1.640s
sys 0m0.084s

real    0m2.112s
user    0m1.732s
sys 0m0.072s

real    0m2.482s
user    0m1.704s
sys 0m0.108s

real    0m2.134s
user    0m1.788s
sys 0m0.072s

您可以进行平均和/或创建更复杂的测试。

无论如何,他们都在内部使用 StringBuilder 。

于 2009-11-16T07:52:19.620 回答
1

Java 编译器会将任何字符串连接表达式转换为等价的 StringBuilder 操作序列。可以安全地假设该序列将接近最优。实际上,在这个特定示例中,我希望在两种情况下都生成相同的(最佳)序列。但即使不是这样,差异也可能很小。

如果分析器告诉您某个特定语句是代码中的瓶颈,那么这种事情才值得烦恼。过早的优化(充其量)是没有意义的,甚至可能是有害的。

Sun 人员的建议是,手动优化 Java 代码实际上可能是较慢的代码,因为生成的字节码序列变得过于复杂,以至于 JIT 编译器无法正确优化。最好的建议是简单地编写代码并相信 Javac 和 JIT 编译器会做得很好。

于 2009-11-16T07:12:55.060 回答