(This page used to be titled "Speed of Java", but then I realized that this is incorrect in English, so I changed it to "Java Performance" to help Google to find it.)
I tried to evaluate what would be the best machine to buy for a Java application. When I was looking for some benchmark results on the Internet, I have found that there are not any which can be used to directly compare similar machines with different OS and CPU.
The famous Volano benchmark published results of JVMs running on Intel IA-32 hardware only. The SPEC JBB200 recent results compare 32-CPU IBM servers against 112-CPU SUN servers and the like, which is not very helpful either. To run it yourself, you have to pay $400 for the test.
So I have found a benchmark SciMark and run it on as many platforms as I could. The results are here:
Linux 2.6.22 64-bit | SUN 1.6.0_12 64-bit -server | 2x Intel Quad-Core Xeon E5472 3 GHz | |
Linux 2.6.22 64-bit | IBM 1.6.0SR3 64-bit | 2x Intel Quad-Core Xeon E5472 3 GHz | |
Linux 2.6.22 64-bit | SUN 1.6.0_06 64-bit -server | 2x Intel Quad-Core Xeon E5472 3 GHz | |
Windows Vista 64-bit | SUN 1.6.0_14b02 64-bit -server | 1x Intel Core 2 Duo E8400 3GHz | |
Linux 2.6.27 64-bit | SUN 1.6.0_11 64-bit -server | 1x Intel Core 2 Duo E8400 3GHz | |
Linux 2.6.27 64-bit | IBM 1.6.0SR3 64-bit | 1x Intel Core 2 Duo E8400 3GHz | |
Windows Vista 64-bit | SUN 1.6.0_14b02 32-bit -server | 1x Intel Core 2 Duo E8400 3GHz | |
Linux 2.6.27 64-bit | OpenJDK 1.6.0_0-b11 64-bit -server | 1x Intel Core 2 Duo E8400 3GHz | |
Linux 2.6.27 64-bit | SUN 1.6.0_11 32-bit -server | 1x Intel Core 2 Duo E8400 3GHz | |
Windows Vista 64-bit | SUN 1.6.0_12 32-bit -server | 1x Intel Core 2 Duo E8400 3GHz | |
Linux 2.6.27 64-bit | SUN 1.6.0_11 32-bit -client | 1x Intel Core 2 Duo E8400 3GHz | |
Windows Vista 64-bit | SUN 1.6.0_12 32-bit -client | 1x Intel Core 2 Duo E8400 3GHz | |
Linux 2.6.22 64-bit | IBM 1.6.0 64-bit | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.22 64-bit | SUN 1.6.0_06 64-bit -server | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.18 64-bit | SUN 1.6.0 32-bit -server | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.18 64-bit | gcj 4.0.2 -O3 --no-bounds-check -march=nocona | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.18 64-bit | SUN 1.5.0_11 32-bit -server | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.18 64-bit | SUN 1.6.0 64-bit -server | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.18 64-bit | IBM 1.5.0 32-bit | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.18 64-bit | SUN 1.5.0_11 64-bit -server | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.18 64-bit | SUN 1.6.0 32-bit -client | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.18 64-bit | gcj 4.0.2 | 2x Intel Dual-Core Xeon 5160 3GHz | |
Linux 2.6.22 64-bit | IBM 1.6.0 64-bit | AMD64 8x Dual-Core Opteron 8222 3GHz | |
Linux 2.6.22 64-bit | SUN 1.6.0_06 64-bit -server | AMD64 8x Dual-Core Opteron 8222 3GHz | |
Linux 2.6.22 64-bit | SUN 1.6.0_06 32-bit -server | AMD64 8x Dual-Core Opteron 8222 3GHz | |
Linux 2.6.22 64-bit | SUN 1.6.0_06 32-bit -client | AMD64 8x Dual-Core Opteron 8222 3GHz | |
Linux 2.6.18 64-bit | SUN 1.6.0 32-bit -server | 2x Intel Xeon Quad-Core X5355 2.6 GHz | |
Linux 2.6.18 64-bit | SUN 1.6.0beta2 64-bit -server | AMD64 8x Dual-Core Opteron 885 2.6GHz | |
Linux 2.6.18 64-bit | SUN 1.5.0_09 64-bit -server | AMD64 8x Dual-Core Opteron 885 2.6GHz | |
Linux 2.6.18 64-bit | SUN 1.6.0 32-bit -server | AMD64 8x Dual-Core Opteron 885 2.6GHz | |
Linux 2.6.18 64-bit | SUN 1.6.0_06 64-bit -server | AMD64 1x Dual-Core Opteron 280 2.4GHz | |
Linux 2.6.5 64-bit | Blackdown 1.4.2-rc1 64-bit -server | AMD 64 FX-53 2.4GHz | |
Linux 2.6.5 64-bit | SUN 1.5.0_01 64-bit (appletviewer) | AMD 64 FX-53 2.4GHz | |
Linux 2.6.5 64-bit | SUN 1.5.0 64-bit (appletviewer) | AMD 64 FX-53 2.4GHz | |
Linux 2.6.5 64-bit | IBM 1.4.2 64-bit (max 576?) | AMD 64 FX-53 2.4GHz | |
WinXP | SUN 1.5.0-rc -server | Pentium4 3GHz (w/o HT) (800FSB DualCh. mem) | |
Linux 2.6.8 | SUN 1.5.0-rc -server (w/o X-window) | Pentium4 3GHz (w/o HT) | |
Linux 2.6.8 | SUN 1.5.0-rc -server (appletviewer) | Pentium4 3GHz (w/o HT) | |
WinXP | SUN 1.4.2_03 -server | Pentium4 3GHz (w/o HT) | |
Linux 2.6.8 | SUN 1.5.0-rc -server (w/o X-window) | Pentium4 3GHz HT | |
WinXP | SUN 1.4.2_03 -server | Pentium4 3GHz HT | |
Linux 2.6.5 | gcj 3.4.0 -march=pentium4 -O3 --no-bounds-check | Pentium4 3GHz (w/o HT) | |
Linux 2.6.8 | IBM 1.4.2 | Pentium4 3GHz (w/o HT) | |
WinXP | IBM 1.4.2 | Pentium4 3GHz (w/o HT) | |
WinXP | BEA JRockit 1.4.2_04 | Pentium4 3GHz (w/o HT) | |
Linux 2.6.5 | BEA JRockit 1.4.2_04 | Pentium4 3GHz (w/o HT) | |
Linux 2.6.5 | gcj 3.3.3 -march=pentium4 -O3 | Pentium4 3GHz (w/o HT) | |
Linux 2.4.27 | SUN 1.5.0-rc -server | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | Blackdown 1.4.2-rc1 -server | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | Sun. 1.4.2 -server | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | Sun. 1.5.0-beta -server | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | IBM 1.4.1 | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | BEA Systems, Inc. 1.4.1_01 | Xeon P4 3.06GHz HT | |
Linux 2.6.5 64-bit | Blackdown 1.4.2-rc1 64-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | Blackdown 1.4.2-fcs 64-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | Sun. 1.5.0 64-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | Sun. 1.5.0-rc-63b 64-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | Sun. 1.5.0-beta2 64-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | IBM 1.4.2 64-bit | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | Sun. 1.4.2_03 32-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | Sun. 1.5.0 32-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | IBM 1.4.1SR2 32-bit | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | IBM 1.4.2SR1 32-bit | Opteron 148 2.2GHz | |
Linux 2.6.22 | SUN 1.6.0_06 -server | Pentium4 2.5GHz | |
Linux 2.6.18 | SUN 1.6.0 -server | Pentium4 2.5GHz | |
Linux 2.4.23 | Blackdown 1.4.2-rc1 -server | Pentium4 2.5GHz | |
Linux 2.4.23 | Sun. 1.4.2_03 -server | Pentium4 2.5GHz | |
Linux 2.4.27 | Sun 1.5.0_01 -server | Pentium4 2.5GHz | |
Linux 2.4.27 | IBM 1.4.2SR1 | Pentium4 2.5GHz | |
Linux 2.4.23 | Sun. 1.4.2_03 -client | Pentium4 2.5GHz | |
Linux 2.4.23 | Sun. 1.4.2 -client | Pentium4 2.5GHz | |
Linux 2.4.21 64-bit | Blackdown 1.4.2-rc1 64-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.21 64-bit | Sun. 1.5.0-beta 64-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.21 64-bit | Sun. 1.5.0-beta 32-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.21 64-bit | Blackdown 1.4.2-rc1 32-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.21 64-bit | Sun. 1.4.2_03 32-bit -server | Opteron 244 1.8GHz | |
WinXP 5.1 | SUN 1.5.0_01 -server | Pentium M 1.5GHz | |
MacOSX 0.3.2 | Apple Computer, Inc. 1.4.2_03 | powerpc 970, 2 Ghz | |
AIX 5.2 | IBM 1.3.1 32-bit | Power4+ 1.2GHz | |
AIX 5.2 | IBM 1.4.1 32-bit | Power4+ 1.2GHz | |
AIX 5.2 | IBM 1.4.1 64-bit | Power4+ 1.2GHz | |
Linux 2.6.5 64-bit | BEA JRockit 1.5.0_06 64-bit | Itanium2 1.5GHz | |
Linux 2.6.9 64-bit | BEA JRockit 1.4.2_04 64-bit | Itanium2 1.4GHz | |
Linux 2.6.9 64-bit | SUN 1.4.2_06 64-bit | Itanium2 1.4GHz | |
Solaris 10 | SUN 1.5.0_12 | sparcv9 1500 MHz | |
Linux 2.4.19 64-bit | BEA JRockit 1.4.2_03 64-bit | Itanium2 1GHz | |
Linux 2.4.19 64-bit | Sun. 1.4.2_03 64-bit | Itanium2 1GHz | |
SunOS 5.8 | Sun. 1.4.2_03 -server | UltraSPARC-III 750MHz | |
MacOSX 0.3.2 | Apple Computer, Inc. 1.4.2_03 | 1 GHz PowerPC G4 | |
OSF1 V5.1 | Compaq Computer 1.4.0 | Alpha 667 MHz | |
Irix 6.5 | SGI JavaVM-1.3 | MIPS R12000 400MHz |
Linux 2.6.5 64-bit | Blackdown 1.4.2-rc1 64-bit -server | AMD 64 FX-53 2.4GHz | |
WinXP | SUN 1.5.0-rc -server | Pentium4 3GHz (w/o HT) 800FSB DualCh. memory | |
Linux 2.6.8 | SUN 1.5.0-rc -server | Pentium4 3GHz (w/o HT) | |
Linux 2.6.8 | IBM 1.4.2 | Pentium4 3GHz (w/o HT) | |
Linux 2.4.23 | Sun. 1.4.2_03 -server | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | Sun. 1.5.0-beta -server | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | Blackdown 1.4.2-rc1 -server | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | IBM 1.4.1 | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | BEA JRockit80 1.4.1_01 | Xeon P4 3.06GHz HT | |
Linux 2.4.23 | Sun. 1.4.2_03 -client | Xeon P4 3.06GHz HT | |
Linux 2.6.5 64-bit | Sun. 1.5.0-rc-63b 64-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | Blackdown 1.4.2-rc1 64-bit -server | Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | Sun. 1.4.2_03 32-bit -server | Opteron 148 2.2GHz | |
Linux 2.4.23 | Sun. 1.5.0-beta -server | Pentium4 2.5GHz | |
Linux 2.4.23 | Blackdown 1.4.2-rc1 -server | Pentium4 2.5GHz | |
Linux 2.4.23 | Sun. 1.4.2_03 -server | Pentium4 2.5GHz | |
Linux 2.4.23 | IBM 1.4.1 | Pentium4 2.5GHz | |
Linux 2.4.23 | BEA JRockit80 1.4.1_01 | Pentium4 2.5GHz | |
Linux 2.4.23 | Sun. 1.4.2_03 -client | Pentium4 2.5GHz | |
Linux 2.4.25 | Sun. 1.5.0-beta 64-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.25 | Blackdown 1.4.2 64-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.25 | Sun. 1.5.0-beta 32-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.25 | Blackdown 1.4.2 32-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.25 | Sun. 1.4.2_03 32-bit -server | Opteron 244 1.8GHz | |
Linux 2.4.19 | Sun. 1.4.2_03 64-bit -server | Itanium2 1GHz |
The SciMark benchmark tests mostly floating point operations, so it cannot be used to estimate performance for grid services, where XML stacks and web containers are in play. So I have put together another test.
In this test, a SOAP webservice was deployed into Tomcat 5.0.18 /Axis 1.1 container, and a client called that webservice, sending there and back four JavaBeans and a String array, to simulate some useful content, causing 2.2KB XML messages.
A side note - all these tests were run on so many OSes and CPUs using exactly the same binary, compiled only once. This is a real-life demonstration of "Write Once, Run Everywhere" feature of Java.
120000 | Linux 2.6.5 64-bit | BEA JRockit 1.4.2_04 32-bit | 1x AMD 64 FX-53 2.4GHz | |
4800 | Linux 2.6.5 64-bit | IBM 1.4.2SR1 32-bit | 1x AMD 64 FX-53 2.4GHz | |
6200 | Linux 2.6.5 64-bit | IBM 1.4.1SR2 32-bit | 1x AMD 64 FX-53 2.4GHz | |
2200 | Linux 2.6.5 64-bit | IBM 1.4.2 64-bit | 1x AMD 64 FX-53 2.4GHz | |
80000 | Linux 2.6.5 64-bit | BEA JRockit 1.4.2_04 32-bit | 2x AMD Opteron 244 1.8GHz | |
3600 | Linux 2.4.21 64-bit | IBM 1.4.1SR1 32-bit | 2x AMD Opteron 244 1.8GHz | |
6800 | Linux 2.4.21 64-bit | SUN 1.5.0-b 32-bit -server -XX:CompileThreshold=1500 | 2x AMD Opteron 244 1.8GHz | |
7600 | Linux 2.4.21 64-bit | Blackdown 1.4.2 32-bit -server -XX:CompileThreshold=1500 | 2x AMD Opteron 244 1.8GHz | |
7200 | Linux 2.4.21 64-bit | Blackdown 1.4.2 64-bit -server -XX:CompileThreshold=1500 | 2x AMD Opteron 244 1.8GHz | |
10000 | Linux 2.4.21 64-bit | SUN 1.5.0-b 32-bit -client | 2x AMD Opteron 244 1.8GHz | |
3600 | Linux 2.4.21 64-bit | SUN 1.4.2_03 32-bit -server -XX:CompileThreshold=1500 | 2x AMD Opteron 244 1.8GHz | |
4500 | Linux 2.4.21 64-bit | Blackdown 1.4.2 32-bit -client | 2x AMD Opteron 244 1.8GHz | |
13000 | Linux 2.4.21 64-bit | SUN 1.5.0-b 32-bit -server | 2x AMD Opteron 244 1.8GHz | |
9000 | Linux 2.4.21 64-bit | Blackdown 1.4.2 32-bit -server | 2x AMD Opteron 244 1.8GHz | |
9000 | Linux 2.4.21 64-bit | Blackdown 1.4.2 64-bit -server | 2x AMD Opteron 244 1.8GHz | |
95000 | Linux 2.6.5 64-bit | BEA JRockit 1.4.2_04 32-bit | 1x AMD Opteron 148 2.2GHz | |
35000 | Linux 2.6.5 64-bit | IBM 1.4.1SR2 32-bit | 1x AMD Opteron 148 2.2GHz | |
2600 | Linux 2.6.5 64-bit | IBM 1.4.2 32-bit | 1x AMD Opteron 148 2.2GHz | |
4800 | Linux 2.6.5 64-bit | Blackdown 1.4.2 64-bit -server -XX:CompileThreshold=1500 | 1x AMD Opteron 148 2.2GHz | |
7200 | Linux 2.6.5 64-bit | SUN 1.4.2_03 32-bit -server -XX:CompileThreshold=1500 | 1x AMD Opteron 148 2.2GHz | |
NullPointerException in SAXParserImpl | N/A | Linux 2.6.5 64-bit | SUN 1.5.0-rc-b63 for AMD64 | 1x AMD Opteron 148 2.2GHz |
NullPointerException in SAXParserImpl | N/A | Linux 2.6.5 64-bit | SUN 1.5.0-rc-b63 for IA32 | 1x AMD Opteron 148 2.2GHz |
99000 | Linux 2.6.9 ia64 | BEA JRockit 1.4.2_04 64-bit | 2x Itanium2 1.4GHz | |
3600 | Linux 2.6.9 ia64 | SUN 1.4.2_06 64-bit -XX:CompileThreshold=1500 | 2x Itanium2 1.4GHz | |
10400 | Linux 2.6.9 ia64 | SUN 1.4.2_06 64-bit | 2x Itanium2 1.4GHz | |
15000 | Linux 2.6.9 ia64 | SUN 1.4.2_06 64-bit -Xcomp | 2x Itanium2 1.4GHz | |
75000 | Linux 2.6.5 | BEA JRockit 1.4.2_04 | 1x Pentium4 3GHz (w/o HT, 800FSB, dualch.mem) | |
3600 | Linux 2.6.8 | IBM 1.4.2 | 1x Pentium4 3GHz (w/o HT) | |
2600 | WinXP | IBM 1.4.2 | 1x Pentium4 3GHz (w/o HT) | |
9800 | WinXP | SUN 1.4.2_03 -server -XX:CompileThreshold=1500 | 1x Pentium4 3GHz (w/o HT) | |
4000 | Linux 2.6.8 | IBM 1.4.2 | 1x Pentium4 3GHz HT | |
83000 | Linux 2.4.25 ia64 | BEA JRockit 1.4.2_04 64-bit | 2x Itanium2 1GHz | |
400 | Linux 2.4.19 ia64 | BEA JRockit 1.4.2_03 64-bit | 2x Itanium2 1GHz | |
5000 | Linux 2.4.19 ia64 | SUN 1.4.2_03 64-bit -server | 2x Itanium2 1GHz | |
95000 | Linux 2.4.27 | BEA JRockit 1.4.2_04 | 1x Pentium4 2.5GHz | |
4000 | Linux 2.4.23 | SUN 1.5.0-b -server -XX:CompileThreshold=1500 | 1x Pentium4 2.5GHz | |
2400 | Linux 2.4.23 | IBM 1.4.1SR1 | 1x Pentium4 2.5GHz | |
5000 | Linux 2.4.23 | SUN 1.4.2_03 -server -XX:CompileThreshold=1500 | 1x Pentium4 2.5GHz | |
3000 | Linux 2.4.23 | SUN 1.5.0-b -client | 1x Pentium4 2.5GHz | |
400 | Linux 2.4.23 | BEA JRockit 8.1sp2-1.4.1_05 | 1x Pentium4 2.5GHz | |
9000 | Linux 2.4.23 | SUN 1.5.0-b -server | 1x Pentium4 2.5GHz | |
400 | Linux 2.4.23 | BEA JRockit80 1.4.1_01 | 1x Pentium4 2.5GHz | |
9000 | Linux 2.4.23 | SUN 1.4.2_03 -server | 1x Pentium4 2.5GHz | |
2500 | Linux 2.4.23 | SUN 1.4.2_03 -client | 1x Pentium4 2.5GHz | |
2500 | Linux 2.4.23 | Blackdown 1.4.2-rc1 -client | 1x Pentium4 2.5GHz | |
9000 | Linux 2.4.23 | Blackdown 1.4.2-rc1 -server | 1x Pentium4 2.5GHz | |
400 | Linux 2.4.23 | BEA JRockit 1.4.2_03 | 1x Pentium4 2.5GHz | |
100000 | Linux 2.4.27 | BEA JRockit 1.4.2_04 | 2x Xeon P4 3.06GHz HT | |
3000 | Linux 2.4.23 | IBM 1.4.1SR1 | 2x Xeon P4 3.06GHz HT | |
4600 | Linux 2.4.23 | SUN 1.5.0-b -server -XX:CompileThreshold=1500 | 2x Xeon P4 3.06GHz HT | |
4400 | Linux 2.4.23 | SUN 1.4.2_03 -server -XX:CompileThreshold=1500 | 2x Xeon P4 3.06GHz HT | |
3000 | Linux 2.4.23 | SUN 1.5.0-b -client | 2x Xeon P4 3.06GHz HT | |
7500 | Linux 2.4.23 | SUN 1.5.0-b -server | 2x Xeon P4 3.06GHz HT | |
9000 | Linux 2.4.23 | SUN 1.4.2_03 -server | 2x Xeon P4 3.06GHz HT | |
2500 | Linux 2.4.23 | SUN 1.4.2_03 -client | 2x Xeon P4 3.06GHz HT | |
2800 | MacOSX 0.3.2 | Apple 1.4.2-34 -server | 2x PowerPC 970 2GHz | |
1800 | MacOSX 0.3.2 | Apple 1.4.2-34 -client | 2x PowerPC 970 2GHz | |
1500 | AIX 5.2 | IBM 1.4.1 32-bit | 2x Power4+ 1.2GHz | |
1500 | AIX 5.2 | IBM 1.4.0 64-bit | 2x Power4+ 1.2GHz | |
1200 | OSF1 alpha V5.1 | Compaq 1.4.0-1 Fast VM | 4x Alpha 667MHz | |
11000 | SunOS 5.8 | SUN 1.4.2_03-b02 -server -XX:CompileThreshold=1500 | 2x UltraSPARC-III 750MHz | |
6000 | SunOS 5.8 | SUN 1.4.2_03-b02 -client | 2x UltraSPARC-III 750MHz | |
400 | IRIX64 6.5 | SGI 1.4.1 -classic | 20x MIPS R14000 500 Mhz |
Java virtual machine has big overhead when starting, because the HotSpot or Just-In-Time compilers need to analyze and compile bytecode. The number of calls which were performed before the speed stabilized is in the "stable cycles" column of the result table.
This test has one deceiving feature - at the first look, one would expect multiprocesors to have an advantage, because client and server are separate processes. However, the client and the server are roundtriping a set of data, it means that client send a request and waits, server receives the request, generates a response and waits, and so on. Thus only one of the two processes is running at any time, so effectively it is a single thread test. That explains why multiprocessors are not twice faster than uniprocessors.
A very interesting thing is the influence of option -XX:CompileThreshold=1500
to SUN HotSpot JVM. The default is 10000 for Server VM and 1500 for Client VM. However setting it to 1500 for Server VM makes it faster than Client VM. Setting it to 100 actualy lowers the performance. And using option -Xcomp (which means that all code is compiled before usage) gives even lower performance, which is surprising.
The BEA JRockit JVM has a very special behavior in several ways. First, its results are fluctuating widely over time. While other JVMs get to a maximum speed after relatively short number of calls (less than ten thousand) and then the measured times after each 200 calls give stable results, with JRockit this would give results varying as much as 50% for each 200 calls. So I had to use batches of 5000 calls to get stable average of calls per second, but even then it is varying like 10%. Second speciality is that it starts slowly, and it takes very high number of calls, like 100000, to get to its maximum speed. And the third speciality is that it is the only JVM, which runs this single-threaded test faster on two-CPU Opteron 1.8GHz machine than on one-CPU Opteron 2.2GHz. My guess is that this is caused by JRockit's parallel garbage collector, which can take advantage of the second CPU.
There is another implementation of SOAP in the C language called gSOAP . We can compare equivalent clients and servers against each other. However the comparison is not fair to Java, because Axis is able to create any dynamic SOAP calls, while gSOAP is a preprocessor generating one-purpose code, which can thus be much faster. The graph is scaled down 8 times now.
If you want to run you own tests, download source code , compile for your platform and run. Please send me your results if you have a platform not listed here.
Linux 2.4.23 | gSOAP 2.5, gcc 2.95.4 -O2 | gSOAP 2.5, gcc 2.95.4 -O2 | 1x Pentium4 2.5GHz | |
Linux 2.4.23 | Axis, Java IBM 1.4.1SR1 | gSOAP 2.5, gcc 2.95.4 | 1x Pentium4 2.5GHz | |
Linux 2.4.23 | gSOAP 2.5, gcc 2.95.4 | Axis, Java SUN 1.5.0-b -server -XX | 1x Pentium4 2.5GHz | |
Linux 2.4.23 | gSOAP 2.5, gcc 2.95.4 | Axis, Java IBM 1.4.1SR1 | 1x Pentium4 2.5GHz | |
Linux 2.4.23 | Axis, Java SUN 1.5.0-b -server -XX | gSOAP 2.5, gcc 2.95.4 | 1x Pentium4 2.5GHz | |
Linux 2.4.23 | Axis, Java SUN 1.5.0-b -client | gSOAP 2.5, gcc 2.95.4 | 1x Pentium4 2.5GHz | |
Linux 2.4.23 | Axis, Java SUN 1.5.0-b -server -XX | Axis, Java SUN 1.5.0-b -server -XX | 1x Pentium4 2.5GHz | |
Linux 2.4.23 | Axis, Java IBM 1.4.1SR1 | Axis, Java IBM 1.4.1SR1 | 1x Pentium4 2.5GHz |
And now gSOAP client against gSOAP server on various platforms:
Linux 2.6.16 64-bit | gSOAP 2.5, gcc 4.0.2 -O2 64-bit | 1x Dual Core AMD Opteron 280 2.4GHz | |
Linux 2.6.5 64-bit | gSOAP 2.5, gcc 3.3.3 -O2 64-bit | 1x AMD FX-53 2.4GHz | |
Linux 2.6.5 64-bit | gSOAP 2.7.0c, gcc 3.3.3 -O2 64-bit | 1x AMD Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | gSOAP 2.5, gcc 3.3.3 -O2 64-bit | 1x AMD Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | gSOAP 2.6.2, gcc 3.3.3 -O2 64-bit | 1x AMD Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | gSOAP 2.7.0c, gcc 3.3.3 -O2 32-bit | 1x AMD Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | gSOAP 2.6.2, gcc 3.3.3 -O2 32-bit | 1x AMD Opteron 148 2.2GHz | |
Linux 2.6.5 64-bit | gSOAP 2.5, gcc 3.3.3 64-bit | 1x AMD Opteron 148 2.2GHz | |
Linux 2.4.21 64-bit | gSOAP 2.5, gcc 3.2.2 -O2 64-bit | 2x AMD Opteron 244 1.8GHz | |
Linux 2.4.21 64-bit | gSOAP 2.5, gcc 2.95.4 -O2 32-bit | 2x AMD Opteron 244 1.8GHz | |
Linux 2.6.9 IA-64 | gSOAP 2.5, Intel icc 8.1 -O2 | 2x Itanium2 1.4GHz | |
Linux 2.6.9 IA-64 | gSOAP 2.5, gcc 3.3.5 -O2 | 2x Itanium2 1.4GHz | |
Linux 2.6.5 | gSOAP 2.5, gcc 3.4.0 -O3 | 1x Pentium4 3GHz (w/o HT) | |
Linux 2.6.8 | gSOAP 2.5, gcc 3.3.3 -O2 | 1x Pentium4 3GHz (w/o HT) | |
Linux 2.4.23 | gSOAP 2.5, gcc 2.95.4 -O2 | 2x Xeon P4 3.06GHz HT | |
Linux 2.4.23 | gSOAP 2.5, gcc 3.3.1 -O2 | 2x Xeon P4 3.06GHz HT | |
Linux 2.4.23 | gSOAP 2.5, gcc 2.95.4 | 2x Xeon P4 3.06GHz HT | |
Linux 2.4.23 | gSOAP 2.5, gcc 3.3.1 | 2x Xeon P4 3.06GHz HT | |
Linux 2.4.19 IA-64 | gSOAP 2.5, Intel ecc 7.0 -O2 | 2x Itanium2 1GHz | |
Linux 2.4.19 IA-64 | gSOAP 2.5, gcc 2.96 -O2 | 2x Itanium2 1GHz | |
Linux 2.4.23 | gSOAP 2.5, gcc 2.95.4 -O2 | 1x Pentium4 2.5GHz | |
Linux 2.4.23 | gSOAP 2.5, gcc 2.95.4 | 1x Pentium4 2.5GHz | |
AIX 5.2 | gSOAP 2.5, gcc 2.9-aix51 -O2 | 2x Power4+ 1.2GHz | |
SunOS 5.8 | gSOAP 2.5, gcc 2.8.1 -O2 | 2x UltraSPARC-III 750MHz |