I was implmenting string append feature in my simple VM.
I find that when there are string append in JAVA code. The binary codes generated are not the same as I thought.
I use a simple test to test it.
private static void testAdd() {
String a = "First";
String b = "Second";
String c = a + b;
Asserter.assertTrue(c.equals("FirstSecond"), "testAddEqual");
Asserter.assertTrue(!c.equals("First"), "testAddNotEqual");
}
The sentence following will generate quite lot of binary code. The most important thing for performance is it use StringBuffer. Yes, it is StringBuffer. So it has performance issue.
String c = a + b;
The codes generated are listed following.
6 new java.lang.StringBuffer [25]
9 dup
10 aload_0 [a]
11 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [27]
14 invokespecial java.lang.StringBuffer(java.lang.String) [33]
17 aload_1 [b]
18 invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [36]
21 invokevirtual java.lang.StringBuffer.toString() : java.lang.String [40]
24 astore_2 [c]
method StringBuffer.append is synchronized method. So be careful.
Following code also do the same thing. It also use StringBuffer
String a = "String";
a = a + 100;
Perhaps use some java compiler optimization will make it more efficiently. But I don't have time test it by now.