uri*_*ium 11 c# java string performance compiler-optimization
我经常想知道,在最初为字符串赋值时,是否存在将字符串拆分为多行以提高可读性的性能成本.我知道字符串是不可变的,因此每次都需要创建一个新的字符串.此外,由于今天真正快速的硬件(除非你处于一些恶魔般的循环中),性能成本实际上是无关紧要的.例如:
String newString = "This is a really long long long long long" +
" long long long long long long long long long long long long " +
" long long long long long long long long long string for example.";
Run Code Online (Sandbox Code Playgroud)
JVM或.Net的编译器和其他优化如何处理这个问题.它会创建一个字符串吗?或者它会创建1个字符串然后一个新的连接值,然后另一个连接值再次?
这是出于我自己的好奇心.
coo*_*ird 14
实际上,在Java中,编译器会将其String转换为常量.
class LongLongString
{
public LongLongString()
{
String newString = "This is a really long long long long long" +
" long long long long long long long long long long long long " +
" long long long long long long long long long string for example.";
}
public static void main(String[] args)
{
new LongLongString();
}
}
Run Code Online (Sandbox Code Playgroud)
编译成:
Compiled from "LongLongString.java"
class LongLongString extends java.lang.Object{
public LongLongString();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: ldc #2; //String This is a really long long long long long long long long long long long long long long long long long long long long long long long long long long string for example.
6: astore_1
7: return
public static void main(java.lang.String[]);
Code:
0: new #3; //class LongLongString
3: dup
4: invokespecial #4; //Method "<init>":()V
7: pop
8: return
}
Run Code Online (Sandbox Code Playgroud)
可以看出,第4行加载了一行,而不是String加载了多个实例.
编辑:源文件是使用javac版本1.6.0_06 编译的.看看Java语言规范,第三版(和Jon Skeet的答案中提到的相同部分),我无法找到关于编译器是否应该将多行连接String成单个的任何参考String,所以这种行为可能是编译器实现特定的.
自己测试一下.在C#代码中(等效的Java也可以):
string x = "A" + "B" + "C";
string y = "ABC";
bool same = object.ReferenceEquals(x, y); // true
Run Code Online (Sandbox Code Playgroud)
你会看到结果是true.
顺便说一句,您将看到该字符串也在运行时的字符串池中实现:
bool interned = object.ReferenceEquals(x, string.Intern(x)); // true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |