On my spare time I have been doing some Performance Testing mechanisms in Java.
I just wrote a small code snippet and ran it in a Worker thread and tried to improve
the performance of it. Even though this is small the lesson I learned was immense.
This is the worker class I used.
import java.util.concurrent.*;
public class Callee implements Callable<Integer> {
public Integer call() {
int i = 0;
while(i < 10000) {
System.out.println(i);
i++;
}
return i;
}
}
And the worker was called by the following class
import java.util.concurrent.*;
import java.awt.*;
public class Caller {
public static void main(String[] args)throws Exception {
long startFreeMemory = Runtime.getRuntime().freeMemory();
long startTime = System.currentTimeMillis();
ExecutorService exec = Executors.newCachedThreadPool();
Future<Integer> f = exec.submit(new Callee());
exec.shutdown();
System.out.println("Future is "+f.get());
long endTime = System.currentTimeMillis();
long endFreeMemory = Runtime.getRuntime().freeMemory();
System.out.println("Memory used : "+(startFreeMemory - endFreeMemory));
System.out.println("Duration : "+(endTime - startTime));
}
}
Testing was done in Intel Core 2 Duo Process with 2.93 GHz and 2 Gb of RAM.
The initial program ran for 672 Milliseconds and Used 674408 units of RAM.
Then the Callee class was changed to the following.
import java.util.concurrent.*;
public class Callee implements Callable<Integer> {
public Integer call() {
int i = 0;
StringBuilder sb = new StringBuilder();
while(i < 10000) {
sb.append(i+"\n");
i++;
}
System.out.print(sb.toString());
return i;
}
}
Using a StringBuffer without directly printing to the screen reduced the execution time by 188 Milliseconds but the RAM units used increased to 828288.
But just changing
sb.append(i+"\n");
to
sb.append(i).append("\n");
reduced the RAM Usage by almost half from the previous implementation.