Tuesday, February 26, 2013

StringBuilder with modern compilers



Modern Java compiler convert your + operations by StrinBuilder's append. I mean to say if you do str = str1+sr2+str3 then compiler will generate following code
StringBuilder sb = new StringBuilder();
str = sb.append(str1).append(str2).append(str3).toString();
So now its more of matter of choice than performance benefit to use + or StringBuilder :)

JVM: Finding the process id


package com.kk.memory.tool;

import sun.management.VMManagement;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class FindJavaProcessId {

public static void main(String[] args) {

try {
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
Field jvmField = runtimeMXBean.getClass().getDeclaredField("jvm");
jvmField.setAccessible(true);
VMManagement vmManagement = (VMManagement) jvmField.get(runtimeMXBean);
Method getProcessIdMethod = vmManagement.getClass().getDeclaredMethod("getProcessId");
getProcessIdMethod.setAccessible(true);
Integer processId = (Integer) getProcessIdMethod.invoke(vmManagement);
System.out.println("################    ProcessId = " + processId);
} catch (Exception e) {
e.printStackTrace();
}
}

}

String vs StringBuilder performance trade-offs


public class StringTest {

public static void main(String[] args) {

int[] runfor = { 10, 100, 1000, 10000 };

for (int i = 0; i < runfor.length; i++) {
long start = System.currentTimeMillis();
String s = "";
for (int j = 0; j < runfor[i]; j++) {
s += "Hello" + "--" + "World!!!";
}
long end = System.currentTimeMillis();
System.out.println("String concatenation x " + runfor[i] + " times: " + (end - start) + " miliseconds");

start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int j = 0; j < runfor[i]; j++) {
sb.append("Hello");
sb.append("--");
sb.append("World!!!");
}
end = System.currentTimeMillis();
System.out.println("StringBuilder concatenation x " + runfor[i] + " times: " + (end - start) + " miliseconds");
}
}
}


Results:

String concatenation x 10 times: 0 miliseconds
StringBuilder concatenation x 10 times: 0 miliseconds
String concatenation x 100 times: 1 miliseconds
StringBuilder concatenation x 100 times: 0 miliseconds
String concatenation x 1000 times: 15 miliseconds
StringBuilder concatenation x 1000 times: 1 miliseconds
String concatenation x 10000 times: 1143 miliseconds
StringBuilder concatenation x 10000 times: 3 miliseconds