如果将literalstrings (literally "foo” +“bar
)合并起来,汇编者在汇编时,而不是在操作时间进行。
如果你有两条非诉讼地,并加入<条码>+条码>,则汇编者(无论哪条)将使用封面的<条码>,但不一定是最有效的方式。 例如,如果你有:
String repeat(String a, int count) {
String rv;
if (count <= 0) {
return "";
}
rv = a;
while (--count > 0) {
rv += a;
}
return rv;
}
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 类似:
String repeat(String a, int count) {
String rv;
if (count <= 0) {
return "";
}
rv = a;
while (--count > 0) {
rv = new StringBuilder().append(rv).append(a).toString();
}
return rv;
}
(事实上,见本答复结尾的解调)。) 请注意,它创建了一个新的<条码>每个条码的编码编码>,然后将结果转换为<条码>。 这是低效的(但除非你重新做lot),因为所有临时记忆分配都: 它分配了<条码>StringBuilder及其缓冲,很有可能在第一个<条码>上重新分配缓冲。 [如果rv
具有16个以上特性,即为缺漏的缓冲尺寸],如果没有,则在第二个<代码>适用<>/代码>上几乎肯定会出现这种情况,那么最终将分配一个<代码>String,然后在下一个版本上再分配。
如有必要,可以通过重新写法明确使用<代码>来提高效率。 StringBuilder:
String repeat(String a, int count) {
StringBuilder rv;
if (count <= 0) {
return "";
}
rv = new StringBuilder(a.length() * count);
while (count-- > 0) {
rv.append(a);
}
return rv.toString();
}
我们在那里使用了明确的<代码>StringBuilder,并确定了其最初的缓冲能力,足以保持这一结果。 这提高了记忆效率,但当然略微不太明显,没有经验的密码保持者,而且稍微增加了书写的痛苦。 因此,if,你发现一个表现问题,有了一个紧凑的星座,这可能是解决这一问题的途径。
您可在与以下试验类别一起采取行动时看到这一次检查编码:
public class SBTest
{
public static final void main(String[] params)
{
System.out.println(new SBTest().repeat("testing ", 4));
System.exit(0);
}
String repeat(String a, int count) {
String rv;
if (count <= 0) {
return "";
}
rv = a;
while (--count > 0) {
rv += a;
}
return rv;
}
}
......解体(使用<条码>javap - c SB :条码>)
Compiled from "SBTest.java"
public class SBTest extends java.lang.Object{
public SBTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static final void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: new #3; //class SBTest
6: dup
7: invokespecial #4; //Method "<init>":()V
10: ldc #5; //String testing
12: iconst_4
13: invokevirtual #6; //Method repeat:(Ljava/lang/String;I)Ljava/lang/String;
16: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
19: iconst_0
20: invokestatic #8; //Method java/lang/System.exit:(I)V
23: return
java.lang.String repeat(java.lang.String, int);
Code:
0: iload_2
1: ifgt 7
4: ldc #9; //String
6: areturn
7: aload_1
8: astore_3
9: iinc 2, -1
12: iload_2
13: ifle 38
16: new #10; //class java/lang/StringBuilder
19: dup
20: invokespecial #11; //Method java/lang/StringBuilder."<init>":()V
23: aload_3
24: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: aload_1
28: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
31: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
34: astore_3
35: goto 9
38: aload_3
39: areturn
}
请注意,如何在each上设立新的<代码>StringBuilder,并使用缺省缓冲能力创建。
所有这些临时拨款都很 sound,但是,如果你重新处理实质性的住宿和(或)实质性的扼杀,则再次出现。 此外,在使用由此产生的星号时,证书制度可能大大优化。 例如,Sun shotSpot JVER是一个非常成熟的JIT优化汇编器。 一旦确定 lo为热点,它就很可能找到一种方式来重新证明它。 当然不是:-
在我看到一个表现问题时,或者如果我知道我做一个“<>位置<>>/位置>的分类,并且它有很有可能成为业绩问题的<>,而且如果我使用“/code>,则从可维持的角度来看,该代码会受到严重影响。 反预谋主义联盟可能不同意我关于其中第二点的意见。