blog dds

2005.02.15

The Efficiency of Java and C++, Revisited

A number of people worked on replicating the results and optimizing the programs I listed in my earlier blog entry.

George Zervas profiled the program, found it was spending a lot of time garbage collecting, and used the -XX:+AggressiveHeap java runtime switch, which, according to its documentation

This option instructs the JVM to push memory use to the limit: the overall heap is more than 3850MB, the allocation area of each thread is 256K, the memory management policy defers collection as long as possible, and (beginning with J2SE 1.3.1_02) some GC activity is done in parallel.
He also used Pentium-specific optimization switches on the C++ code, so he can not be accused of being unfair. George thus managed to bring down the execution time slowdown from 200% to 50%.

The following diagram illustrates the results he obtained:

Vassileios Karakoidas, tried a different approach, storing the numbers into an ArrayList, moving them into a native array, and sorting them in place. This brings down the slowdown to 25%.

public class SortInt {
        public static void main(String args[]) {
                ArrayList<RInteger> s = new ArrayList<RInteger>();
                int i;
                int rand = 10;

                for (i = 0; i < 1000000; i++) {
                        s.add(new RInteger(rand));
                        rand = rand * 1103515245 + 12345;
                }

		RInteger[] rint = (RInteger[])s.toArray(new RInteger[0]);
		Arrays.sort(rint);
		int length = rint.length;

                for (i = 0;i < length; i++)
                        if (i % 100000 == 0)
                                System.out.println(rint[i]);
        }
}
However, the program does not have the same properties as the original one. Specifically, the invariant of having the numbers sorted at all times is not preserved.

Another optimization I tried involves using native integers or the Integer class in Java. Both appear to be more efficient, but, again, the program differs in the abstraction mechanisms used over its C++ sibling.

Read and post comments, or share through   


Creative Commons License Last modified: Tuesday, February 15, 2005 9:42 am
Unless otherwise expressly stated, all original material on this page created by Diomidis Spinellis is licensed under a Creative Commons Attribution-Share Alike 3.0 Greece License.