Java Performance On Various Platforms

(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.

SciMark

So I have found a benchmark SciMark and run it on as many platforms as I could. The results are here:

SciMark normal results
MFlops Operating system JVM CPU
1950.9
Linux 3.11.0 64-bitOracle 1.8.0-b129 64-bit1x Intel Core i7-3770 @3.4GHz
1888.4
Linux 3.8.0 64-bitOracle 1.7.0_45 64-bit1x Intel Core i7-3770 @3.4GHz
1818.9
Linux 3.2.0 64-bitOracle 1.8.0_05 64-bit4x Intel Xeon E5-4627 v2 @3.3GHz
1567.6
Linux 3.2.0 64-bitOracle 1.7.0_17 64-bit2x Intel Xeon E5-2643 @3.3GHz
1561.6
Linux 3.2.0 64-bitOpenJDK 1.6.0 64-bit2x Intel Xeon E5-2643 @3.3GHz
1557.8
Linux 3.2.0 64-bitOracle 1.6.0_38 64-bit2x Intel Xeon E5-2643 @3.3GHz
1516.0
Linux 3.2.0 64-bitOpenJDK 1.7.0-u6 64-bit2x Intel Xeon E5-2643 @3.3GHz
1514.1
Linux 3.2.0 64-bitOracle 1.7.0_21 64-bit2x Intel Xeon E5-2643 @3.3GHz
1405.9
Linux 3.2.0 64-bitIBM 1.6.0 64-bit2x Intel Xeon E5-2643 @3.3GHz
1356.5
Linux 3.2.0 64-bitIBM 1.7.0 64-bit2x Intel Xeon E5-2643 @3.3GHz
953.2
Linux 3.2.0 64-bitIBM 1.4.2 64-bit2x Intel Xeon E5-2643 @3.3GHz
850.8
Linux 3.2.0 64-bitBlackdown 1.4.2.-rc1 64-bit2x Intel Xeon E5-2643 @3.3GHz
826.7
Linux 3.2.0 64-bitSUN 1.5.0_09 64-bit2x Intel Xeon E5-2643 @3.3GHz
1475.5
Linux 2.6.38 64-bitSUN 1.7.0_03 64-bit -server1x Intel i7-2620M @2.7GHz
1319.4
Linux 2.6.38 64-bitIBM 1.7.0 64-bit1x Intel i7-2620M @2.7GHz
1448.6
Linux 3.2.0 64-bitSUN 1.7.0_17 64-bit -server2x 8-core Intel Xeon E5-2670 @2.6GHz
1445.1
Linux 3.2.0 64-bitSUN 1.7.0_11 64-bit -server -XX:+DoEscapeAnalysis2x 8-core Intel Xeon E5-2670 @2.6GHz
1441.8
Linux 3.2.0 64-bitSUN 1.7.0_11 64-bit -server2x 8-core Intel Xeon E5-2670 @2.6GHz
1272.9
Linux 3.2.0 64-bitIBM 1.7.0 64-bit2x 8-core Intel Xeon E5-2670 @2.6GHz
1329.3
Linux 2.6.35 64-bitOpenJDK 6b20-1.9.2 64-bit -server1x Intel i7-870 @2.93GHz
1325.2
Linux 2.6.38 64-bitOracle 1.7.0_03 64-bit -server1x Intel i7-870 @2.93GHz
1312.3
Linux 2.6.35 64-bitSUN 1.6.0_23 64-bit -server1x Intel i7-870 @2.93GHz
1301.1
Windows 7 64-bitSUN 1.6.0_23 64-bit -server1x Intel i7-870 @2.93GHz
1232.8
Windows 7 64-bitSUN 1.6.0_22 64-bit -server1x Intel i7-870 @2.93GHz
1225.8
Linux 2.6.35 64-bitIBM 1.6.0 64-bit -server1x Intel i7-870 @2.93GHz
1196.7
Linux 2.6.30 64-bitSUN 1.6.0_14 64-bit -server -XX:+DoEscapeAnalysis2x 4-core Intel Xeon X5570 @2.93GHz
1172.7
Linux 2.6.30 64-bitSUN 1.6.0_14 64-bit -server2x 4-core Intel Xeon X5570 @2.93GHz
1157.0
Linux 2.6.30 64-bitIBM 1.6.0SR3 64-bit2x 4-core Intel Xeon X5570 @2.93GHz
1105.4
Linux 2.6.26 64-bitSUN 1.7.0_11 64-bit -server2x 4-core Intel Xeon X5570 @2.93GHz
1057.8
Linux 3.2.0 64-bitSUN 1.6.0_38 64-bit -server2x 4-core Intel Xeon X5570 @2.93GHz
1031.4
Linux 2.6.38 64-bitOracle 1.7.0_03 64-bit -server 1x Intel Core 2 Duo E8400 3GHz
1015.8
Linux 2.6.27 64-bitSUN 1.6.0_23 64-bit -server 1x Intel Core 2 Duo E8400 3GHz
985.4
Linux 2.6.27 64-bitSUN 1.6.0_17 64-bit -server -XX:+DoEscapeAnalysis1x Intel Core 2 Duo E8400 3GHz
959.0
Linux 2.6.27 64-bitSUN 1.6.0_21 64-bit -server1x Intel Core 2 Duo E8400 3GHz
956.5
Windows Vista 64-bitSUN 1.6.0_14b02 64-bit -server1x Intel Core 2 Duo E8400 3GHz
956.1
Linux 2.6.27 64-bitSUN 1.6.0_11 64-bit -server1x Intel Core 2 Duo E8400 3GHz
951.7
Linux 2.6.27 64-bitIBM 1.6.0SR3 64-bit1x Intel Core 2 Duo E8400 3GHz
932.2
Windows Vista 64-bitSUN 1.6.0_14b02 32-bit -server1x Intel Core 2 Duo E8400 3GHz
922.5
Linux 2.6.27 64-bitOpenJDK 1.6.0_0-b11 64-bit -server1x Intel Core 2 Duo E8400 3GHz
891.7
Linux 2.6.27 64-bitSUN 1.6.0_11 32-bit -server1x Intel Core 2 Duo E8400 3GHz
890.7
Windows Vista 64-bitSUN 1.6.0_12 32-bit -server1x Intel Core 2 Duo E8400 3GHz
584.9
Linux 2.6.27 64-bitSUN 1.6.0_11 32-bit -client1x Intel Core 2 Duo E8400 3GHz
584.0
Windows Vista 64-bitSUN 1.6.0_12 32-bit -client1x Intel Core 2 Duo E8400 3GHz
960.7
Linux 2.6.22 64-bitSUN 1.6.0_12 64-bit -server2x Intel Quad-Core Xeon E5472 3 GHz
946.0
Linux 2.6.22 64-bitIBM 1.6.0SR3 64-bit2x Intel Quad-Core Xeon E5472 3 GHz
895.7
Linux 2.6.22 64-bitSUN 1.6.0_06 64-bit -server2x Intel Quad-Core Xeon E5472 3 GHz
943
Linux 2.6.22 64-bitIBM 1.6.0 64-bit2x Intel Dual-Core Xeon 5160 3GHz
898.0
Linux 2.6.22 64-bitSUN 1.6.0_06 64-bit -server2x Intel Dual-Core Xeon 5160 3GHz
889
Linux 2.6.18 64-bitSUN 1.6.0 32-bit -server2x Intel Dual-Core Xeon 5160 3GHz
866
Linux 2.6.18 64-bitgcj 4.0.2 -O3 --no-bounds-check -march=nocona2x Intel Dual-Core Xeon 5160 3GHz
815
Linux 2.6.18 64-bitSUN 1.5.0_11 32-bit -server2x Intel Dual-Core Xeon 5160 3GHz
642.8
Linux 2.6.18 64-bitSUN 1.6.0 64-bit -server2x Intel Dual-Core Xeon 5160 3GHz
633
Linux 2.6.18 64-bitIBM 1.5.0 32-bit2x Intel Dual-Core Xeon 5160 3GHz
576.3
Linux 2.6.18 64-bitSUN 1.5.0_11 64-bit -server2x Intel Dual-Core Xeon 5160 3GHz
568
Linux 2.6.18 64-bitSUN 1.6.0 32-bit -client2x Intel Dual-Core Xeon 5160 3GHz
523
Linux 2.6.18 64-bitgcj 4.0.22x Intel Dual-Core Xeon 5160 3GHz
801.7
Linux 2.6.22 64-bitIBM 1.6.0 64-bitAMD64 8x Dual-Core Opteron 8222 3GHz
762.0
Linux 2.6.22 64-bitSUN 1.6.0_06 64-bit -serverAMD64 8x Dual-Core Opteron 8222 3GHz
742.2
Linux 2.6.22 64-bitSUN 1.6.0_06 32-bit -serverAMD64 8x Dual-Core Opteron 8222 3GHz
563.6
Linux 2.6.22 64-bitSUN 1.6.0_06 32-bit -clientAMD64 8x Dual-Core Opteron 8222 3GHz
780.8
Linux 2.6.18 64-bitSUN 1.6.0 32-bit -server 2x Intel Xeon Quad-Core X5355 2.6 GHz
650.3
Linux 2.6.18 64-bitSUN 1.6.0beta2 64-bit -server AMD64 8x Dual-Core Opteron 885 2.6GHz
620.5
Linux 2.6.18 64-bitSUN 1.5.0_09 64-bit -server AMD64 8x Dual-Core Opteron 885 2.6GHz
564
Linux 2.6.18 64-bitSUN 1.6.0 32-bit -server AMD64 8x Dual-Core Opteron 885 2.6GHz
605
Linux 2.6.18 64-bitSUN 1.6.0_06 64-bit -serverAMD64 1x Dual-Core Opteron 280 2.4GHz
573.09
Linux 2.6.5 64-bitBlackdown 1.4.2-rc1 64-bit -server AMD 64 FX-53 2.4GHz
563.1
Linux 2.6.5 64-bitSUN 1.5.0_01 64-bit (appletviewer) AMD 64 FX-53 2.4GHz
560
Linux 2.6.5 64-bitSUN 1.5.0 64-bit (appletviewer) AMD 64 FX-53 2.4GHz
545
Linux 2.6.5 64-bitIBM 1.4.2 64-bit (max 576?) AMD 64 FX-53 2.4GHz
561.94
WinXPSUN 1.5.0-rc -server Pentium4 3GHz (w/o HT) (800FSB DualCh. mem)
556.49
Linux 2.6.8SUN 1.5.0-rc -server (w/o X-window) Pentium4 3GHz (w/o HT)
548.36
Linux 2.6.8SUN 1.5.0-rc -server (appletviewer) Pentium4 3GHz (w/o HT)
547.67
WinXPSUN 1.4.2_03 -server Pentium4 3GHz (w/o HT)
544.24
Linux 2.6.8SUN 1.5.0-rc -server (w/o X-window) Pentium4 3GHz HT
536
WinXPSUN 1.4.2_03 -server Pentium4 3GHz HT
529.00
Linux 2.6.5gcj 3.4.0 -march=pentium4 -O3 --no-bounds-check Pentium4 3GHz (w/o HT)
499.61
Linux 2.6.8IBM 1.4.2 Pentium4 3GHz (w/o HT)
412.04
WinXPIBM 1.4.2 Pentium4 3GHz (w/o HT)
389
WinXPBEA JRockit 1.4.2_04 Pentium4 3GHz (w/o HT)
376.9
Linux 2.6.5BEA JRockit 1.4.2_04 Pentium4 3GHz (w/o HT)
308.72
Linux 2.6.5gcj 3.3.3 -march=pentium4 -O3 Pentium4 3GHz (w/o HT)
558.45
Linux 2.4.27SUN 1.5.0-rc -server Xeon P4 3.06GHz HT
544.92
Linux 2.4.23Blackdown 1.4.2-rc1 -server Xeon P4 3.06GHz HT
539.60
Linux 2.4.23Sun. 1.4.2 -server Xeon P4 3.06GHz HT
537.32
Linux 2.4.23Sun. 1.5.0-beta -server Xeon P4 3.06GHz HT
491.78
Linux 2.4.23IBM 1.4.1 Xeon P4 3.06GHz HT
340.07
Linux 2.4.23BEA Systems, Inc. 1.4.1_01 Xeon P4 3.06GHz HT
524.37
Linux 2.6.5 64-bitBlackdown 1.4.2-rc1 64-bit -server Opteron 148 2.2GHz
514.00
Linux 2.6.5 64-bitBlackdown 1.4.2-fcs 64-bit -server Opteron 148 2.2GHz
513.80
Linux 2.6.5 64-bitSun. 1.5.0 64-bit -server Opteron 148 2.2GHz
513.78
Linux 2.6.5 64-bitSun. 1.5.0-rc-63b 64-bit -server Opteron 148 2.2GHz
500.1
Linux 2.6.5 64-bitSun. 1.5.0-beta2 64-bit -server Opteron 148 2.2GHz
497.33
Linux 2.6.5 64-bitIBM 1.4.2 64-bit Opteron 148 2.2GHz
473.12
Linux 2.6.5 64-bitSun. 1.4.2_03 32-bit -server Opteron 148 2.2GHz
470.00
Linux 2.6.5 64-bitSun. 1.5.0 32-bit -server Opteron 148 2.2GHz
443.12
Linux 2.6.5 64-bitIBM 1.4.1SR2 32-bit Opteron 148 2.2GHz
443.10
Linux 2.6.5 64-bitIBM 1.4.2SR1 32-bit Opteron 148 2.2GHz
505
Linux 2.6.22SUN 1.6.0_06 -server Pentium4 2.5GHz
484.9
Linux 2.6.18SUN 1.6.0 -server Pentium4 2.5GHz
465.82
Linux 2.4.23Blackdown 1.4.2-rc1 -server Pentium4 2.5GHz
461.60
Linux 2.4.23Sun. 1.4.2_03 -server Pentium4 2.5GHz
460
Linux 2.4.27Sun 1.5.0_01 -server Pentium4 2.5GHz
333.00
Linux 2.4.27IBM 1.4.2SR1 Pentium4 2.5GHz
207.19
Linux 2.4.23Sun. 1.4.2_03 -client Pentium4 2.5GHz
196.02
Linux 2.4.23Sun. 1.4.2 -client Pentium4 2.5GHz
422.65
Linux 2.4.21 64-bitBlackdown 1.4.2-rc1 64-bit -server Opteron 244 1.8GHz
412.11
Linux 2.4.21 64-bitSun. 1.5.0-beta 64-bit -server Opteron 244 1.8GHz
382.95
Linux 2.4.21 64-bitSun. 1.5.0-beta 32-bit -server Opteron 244 1.8GHz
381.82
Linux 2.4.21 64-bitBlackdown 1.4.2-rc1 32-bit -server Opteron 244 1.8GHz
381.80
Linux 2.4.21 64-bitSun. 1.4.2_03 32-bit -server Opteron 244 1.8GHz
302.1
WinXP 5.1SUN 1.5.0_01 -serverPentium M 1.5GHz
225.76
MacOSX 0.3.2Apple Computer, Inc. 1.4.2_03powerpc 970, 2 Ghz
222.09
AIX 5.2IBM 1.3.1 32-bitPower4+ 1.2GHz
219.36
AIX 5.2IBM 1.4.1 32-bitPower4+ 1.2GHz
214.36
AIX 5.2IBM 1.4.1 64-bitPower4+ 1.2GHz
160.5
Linux 2.6.5 64-bitBEA JRockit 1.5.0_06 64-bit Itanium2 1.5GHz
146.7
Linux 2.6.9 64-bitBEA JRockit 1.4.2_04 64-bit Itanium2 1.4GHz
138.1
Linux 2.6.9 64-bitSUN 1.4.2_06 64-bit Itanium2 1.4GHz
142.0
Solaris 10SUN 1.5.0_12sparcv9 1500 MHz
105.17
Linux 2.4.19 64-bitBEA JRockit 1.4.2_03 64-bit Itanium2 1GHz
96.80
Linux 2.4.19 64-bitSun. 1.4.2_03 64-bit Itanium2 1GHz
90.51
SunOS 5.8Sun. 1.4.2_03 -serverUltraSPARC-III 750MHz
67.87
MacOSX 0.3.2Apple Computer, Inc. 1.4.2_031 GHz PowerPC G4
48.61
OSF1 V5.1Compaq Computer 1.4.0 Alpha 667 MHz
43.00
Irix 6.5SGI JavaVM-1.3MIPS R12000 400MHz
SciMark large matrix results
MFlops Operating system JVM CPU
311.68
Linux 2.6.5 64-bitBlackdown 1.4.2-rc1 64-bit -server AMD 64 FX-53 2.4GHz
282.17
WinXPSUN 1.5.0-rc -server Pentium4 3GHz (w/o HT) 800FSB DualCh. memory
276.47
Linux 2.6.8SUN 1.5.0-rc -server Pentium4 3GHz (w/o HT)
212.52
Linux 2.6.8IBM 1.4.2 Pentium4 3GHz (w/o HT)
249.97
Linux 2.4.23Sun. 1.4.2_03 -serverXeon P4 3.06GHz HT
249.89
Linux 2.4.23Sun. 1.5.0-beta -serverXeon P4 3.06GHz HT
245.86
Linux 2.4.23Blackdown 1.4.2-rc1 -serverXeon P4 3.06GHz HT
197.92
Linux 2.4.23IBM 1.4.1Xeon P4 3.06GHz HT
188.64
Linux 2.4.23BEA JRockit80 1.4.1_01Xeon P4 3.06GHz HT
169.79
Linux 2.4.23Sun. 1.4.2_03 -clientXeon P4 3.06GHz HT
233.36
Linux 2.6.5 64-bitSun. 1.5.0-rc-63b 64-bit -server Opteron 148 2.2GHz
227.72
Linux 2.6.5 64-bitBlackdown 1.4.2-rc1 64-bit -server Opteron 148 2.2GHz
222.45
Linux 2.6.5 64-bitSun. 1.4.2_03 32-bit -server Opteron 148 2.2GHz
218.48
Linux 2.4.23Sun. 1.5.0-beta -serverPentium4 2.5GHz
212.70
Linux 2.4.23Blackdown 1.4.2-rc1 -serverPentium4 2.5GHz
210.95
Linux 2.4.23Sun. 1.4.2_03 -serverPentium4 2.5GHz
171.23
Linux 2.4.23IBM 1.4.1Pentium4 2.5GHz
162.58
Linux 2.4.23BEA JRockit80 1.4.1_01Pentium4 2.5GHz
132.99
Linux 2.4.23Sun. 1.4.2_03 -clientPentium4 2.5GHz
171.72
Linux 2.4.25Sun. 1.5.0-beta 64-bit -serverOpteron 244 1.8GHz
168.49
Linux 2.4.25Blackdown 1.4.2 64-bit -serverOpteron 244 1.8GHz
162.32
Linux 2.4.25Sun. 1.5.0-beta 32-bit -serverOpteron 244 1.8GHz
161.83
Linux 2.4.25Blackdown 1.4.2 32-bit -serverOpteron 244 1.8GHz
160.26
Linux 2.4.25Sun. 1.4.2_03 32-bit -serverOpteron 244 1.8GHz
51.50
Linux 2.4.19Sun. 1.4.2_03 64-bit -serverItanium2 1GHz

WebServices speed

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.1container, 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.

webservice SOAP test
calls per second stable cycles Operating system Java Virtual Machine implementation CPU
387
120000Linux 2.6.5 64-bitBEA JRockit 1.4.2_04 32-bit1x AMD 64 FX-53 2.4GHz
322
4800Linux 2.6.5 64-bitIBM 1.4.2SR1 32-bit1x AMD 64 FX-53 2.4GHz
314
6200Linux 2.6.5 64-bitIBM 1.4.1SR2 32-bit1x AMD 64 FX-53 2.4GHz
220
2200Linux 2.6.5 64-bitIBM 1.4.2 64-bit1x AMD 64 FX-53 2.4GHz
334
80000Linux 2.6.5 64-bitBEA JRockit 1.4.2_04 32-bit2x AMD Opteron 244 1.8GHz
243
3600Linux 2.4.21 64-bitIBM 1.4.1SR1 32-bit2x AMD Opteron 244 1.8GHz
195
6800Linux 2.4.21 64-bitSUN 1.5.0-b 32-bit -server -XX:CompileThreshold=15002x AMD Opteron 244 1.8GHz
190
7600Linux 2.4.21 64-bitBlackdown 1.4.2 32-bit -server -XX:CompileThreshold=15002x AMD Opteron 244 1.8GHz
183
7200Linux 2.4.21 64-bitBlackdown 1.4.2 64-bit -server -XX:CompileThreshold=15002x AMD Opteron 244 1.8GHz
180
10000Linux 2.4.21 64-bitSUN 1.5.0-b 32-bit -client2x AMD Opteron 244 1.8GHz
165
3600Linux 2.4.21 64-bitSUN 1.4.2_03 32-bit -server -XX:CompileThreshold=15002x AMD Opteron 244 1.8GHz
160
4500Linux 2.4.21 64-bitBlackdown 1.4.2 32-bit -client2x AMD Opteron 244 1.8GHz
150
13000Linux 2.4.21 64-bitSUN 1.5.0-b 32-bit -server2x AMD Opteron 244 1.8GHz
150
9000Linux 2.4.21 64-bitBlackdown 1.4.2 32-bit -server2x AMD Opteron 244 1.8GHz
140
9000Linux 2.4.21 64-bitBlackdown 1.4.2 64-bit -server2x AMD Opteron 244 1.8GHz
320
95000Linux 2.6.5 64-bitBEA JRockit 1.4.2_04 32-bit1x AMD Opteron 148 2.2GHz
266
35000Linux 2.6.5 64-bitIBM 1.4.1SR2 32-bit1x AMD Opteron 148 2.2GHz
258
2600Linux 2.6.5 64-bitIBM 1.4.2 32-bit1x AMD Opteron 148 2.2GHz
250
4800Linux 2.6.5 64-bitBlackdown 1.4.2 64-bit -server -XX:CompileThreshold=15001x AMD Opteron 148 2.2GHz
238
7200Linux 2.6.5 64-bitSUN 1.4.2_03 32-bit -server -XX:CompileThreshold=15001x AMD Opteron 148 2.2GHz
NullPointerException in SAXParserImplN/ALinux 2.6.5 64-bitSUN 1.5.0-rc-b63 for AMD64 1x AMD Opteron 148 2.2GHz
NullPointerException in SAXParserImplN/ALinux 2.6.5 64-bitSUN 1.5.0-rc-b63 for IA32 1x AMD Opteron 148 2.2GHz
311
99000Linux 2.6.9 ia64BEA JRockit 1.4.2_04 64-bit2x Itanium2 1.4GHz
139
3600Linux 2.6.9 ia64SUN 1.4.2_06 64-bit -XX:CompileThreshold=15002x Itanium2 1.4GHz
115
10400Linux 2.6.9 ia64SUN 1.4.2_06 64-bit2x Itanium2 1.4GHz
96
15000Linux 2.6.9 ia64SUN 1.4.2_06 64-bit -Xcomp2x Itanium2 1.4GHz
279
75000Linux 2.6.5BEA JRockit 1.4.2_041x Pentium4 3GHz (w/o HT, 800FSB, dualch.mem)
220
3600Linux 2.6.8IBM 1.4.21x Pentium4 3GHz (w/o HT)
213
2600WinXPIBM 1.4.21x Pentium4 3GHz (w/o HT)
213
9800WinXPSUN 1.4.2_03 -server -XX:CompileThreshold=15001x Pentium4 3GHz (w/o HT)
192
4000Linux 2.6.8IBM 1.4.21x Pentium4 3GHz HT
244
83000Linux 2.4.25 ia64BEA JRockit 1.4.2_04 64-bit2x Itanium2 1GHz
140
400Linux 2.4.19 ia64BEA JRockit 1.4.2_03 64-bit2x Itanium2 1GHz
80
5000Linux 2.4.19 ia64SUN 1.4.2_03 64-bit -server2x Itanium2 1GHz
239
95000Linux 2.4.27BEA JRockit 1.4.2_041x Pentium4 2.5GHz
198
4000Linux 2.4.23SUN 1.5.0-b -server -XX:CompileThreshold=15001x Pentium4 2.5GHz
187
2400Linux 2.4.23IBM 1.4.1SR11x Pentium4 2.5GHz
182
5000Linux 2.4.23SUN 1.4.2_03 -server -XX:CompileThreshold=15001x Pentium4 2.5GHz
166
3000Linux 2.4.23SUN 1.5.0-b -client1x Pentium4 2.5GHz
163
400Linux 2.4.23BEA JRockit 8.1sp2-1.4.1_051x Pentium4 2.5GHz
156
9000Linux 2.4.23SUN 1.5.0-b -server1x Pentium4 2.5GHz
152
400Linux 2.4.23BEA JRockit80 1.4.1_011x Pentium4 2.5GHz
150
9000Linux 2.4.23SUN 1.4.2_03 -server1x Pentium4 2.5GHz
150
2500Linux 2.4.23SUN 1.4.2_03 -client1x Pentium4 2.5GHz
150
2500Linux 2.4.23Blackdown 1.4.2-rc1 -client1x Pentium4 2.5GHz
145
9000Linux 2.4.23Blackdown 1.4.2-rc1 -server1x Pentium4 2.5GHz
116
400Linux 2.4.23BEA JRockit 1.4.2_031x Pentium4 2.5GHz
232
100000Linux 2.4.27BEA JRockit 1.4.2_042x Xeon P4 3.06GHz HT
215
3000Linux 2.4.23IBM 1.4.1SR12x Xeon P4 3.06GHz HT
210
4600Linux 2.4.23SUN 1.5.0-b -server -XX:CompileThreshold=15002x Xeon P4 3.06GHz HT
180
4400Linux 2.4.23SUN 1.4.2_03 -server -XX:CompileThreshold=15002x Xeon P4 3.06GHz HT
175
3000Linux 2.4.23SUN 1.5.0-b -client2x Xeon P4 3.06GHz HT
160
7500Linux 2.4.23SUN 1.5.0-b -server2x Xeon P4 3.06GHz HT
145
9000Linux 2.4.23SUN 1.4.2_03 -server2x Xeon P4 3.06GHz HT
140
2500Linux 2.4.23SUN 1.4.2_03 -client2x Xeon P4 3.06GHz HT
152
2800MacOSX 0.3.2Apple 1.4.2-34 -server2x PowerPC 970 2GHz
141
1800MacOSX 0.3.2Apple 1.4.2-34 -client2x PowerPC 970 2GHz
150
1500AIX 5.2IBM 1.4.1 32-bit2x Power4+ 1.2GHz
115
1500AIX 5.2IBM 1.4.0 64-bit2x Power4+ 1.2GHz
95
1200OSF1 alpha V5.1Compaq 1.4.0-1 Fast VM4x Alpha 667MHz
79
11000SunOS 5.8SUN 1.4.2_03-b02 -server -XX:CompileThreshold=15002x UltraSPARC-III 750MHz
64
6000SunOS 5.8SUN 1.4.2_03-b02 -client2x UltraSPARC-III 750MHz
13
400IRIX64 6.5SGI 1.4.1 -classic20x 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.

gSOAP C implementation

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.

webservice SOAP test with gSOAP and Axis
calls per second Operating system client server CPU
1540
Linux 2.4.23gSOAP 2.5, gcc 2.95.4 -O2gSOAP 2.5, gcc 2.95.4 -O21x Pentium4 2.5GHz
375
Linux 2.4.23Axis, Java IBM 1.4.1SR1gSOAP 2.5, gcc 2.95.41x Pentium4 2.5GHz
370
Linux 2.4.23gSOAP 2.5, gcc 2.95.4Axis, Java SUN 1.5.0-b -server -XX1x Pentium4 2.5GHz
360
Linux 2.4.23gSOAP 2.5, gcc 2.95.4Axis, Java IBM 1.4.1SR11x Pentium4 2.5GHz
352
Linux 2.4.23Axis, Java SUN 1.5.0-b -server -XXgSOAP 2.5, gcc 2.95.41x Pentium4 2.5GHz
310
Linux 2.4.23Axis, Java SUN 1.5.0-b -clientgSOAP 2.5, gcc 2.95.41x Pentium4 2.5GHz
198
Linux 2.4.23Axis, Java SUN 1.5.0-b -server -XXAxis, Java SUN 1.5.0-b -server -XX1x Pentium4 2.5GHz
187
Linux 2.4.23Axis, Java IBM 1.4.1SR1Axis, Java IBM 1.4.1SR11x Pentium4 2.5GHz

And now gSOAP client against gSOAP server on various platforms:

webservice SOAP test with gSOAP
calls per second Operating system gSOAP, compiler CPU
3300
Linux 2.6.16 64-bitgSOAP 2.5, gcc 4.0.2 -O2 64-bit1x Dual Core AMD Opteron 280 2.4GHz
3241
Linux 2.6.5 64-bitgSOAP 2.5, gcc 3.3.3 -O2 64-bit1x AMD FX-53 2.4GHz
2990
Linux 2.6.5 64-bitgSOAP 2.7.0c, gcc 3.3.3 -O2 64-bit1x AMD Opteron 148 2.2GHz
2907
Linux 2.6.5 64-bitgSOAP 2.5, gcc 3.3.3 -O2 64-bit1x AMD Opteron 148 2.2GHz
2903
Linux 2.6.5 64-bitgSOAP 2.6.2, gcc 3.3.3 -O2 64-bit1x AMD Opteron 148 2.2GHz
2604
Linux 2.6.5 64-bitgSOAP 2.7.0c, gcc 3.3.3 -O2 32-bit1x AMD Opteron 148 2.2GHz
2570
Linux 2.6.5 64-bitgSOAP 2.6.2, gcc 3.3.3 -O2 32-bit1x AMD Opteron 148 2.2GHz
1988
Linux 2.6.5 64-bitgSOAP 2.5, gcc 3.3.3 64-bit1x AMD Opteron 148 2.2GHz
2340
Linux 2.4.21 64-bitgSOAP 2.5, gcc 3.2.2 -O2 64-bit2x AMD Opteron 244 1.8GHz
2130
Linux 2.4.21 64-bitgSOAP 2.5, gcc 2.95.4 -O2 32-bit2x AMD Opteron 244 1.8GHz
2265
Linux 2.6.9 IA-64gSOAP 2.5, Intel icc 8.1 -O22x Itanium2 1.4GHz
2070
Linux 2.6.9 IA-64gSOAP 2.5, gcc 3.3.5 -O22x Itanium2 1.4GHz
1936
Linux 2.6.5gSOAP 2.5, gcc 3.4.0 -O31x Pentium4 3GHz (w/o HT)
1835
Linux 2.6.8gSOAP 2.5, gcc 3.3.3 -O21x Pentium4 3GHz (w/o HT)
1765
Linux 2.4.23gSOAP 2.5, gcc 2.95.4 -O22x Xeon P4 3.06GHz HT
1750
Linux 2.4.23gSOAP 2.5, gcc 3.3.1 -O22x Xeon P4 3.06GHz HT
1600
Linux 2.4.23gSOAP 2.5, gcc 2.95.42x Xeon P4 3.06GHz HT
1530
Linux 2.4.23gSOAP 2.5, gcc 3.3.12x Xeon P4 3.06GHz HT
1590
Linux 2.4.19 IA-64gSOAP 2.5, Intel ecc 7.0 -O22x Itanium2 1GHz
1514
Linux 2.4.19 IA-64gSOAP 2.5, gcc 2.96 -O22x Itanium2 1GHz
1540
Linux 2.4.23gSOAP 2.5, gcc 2.95.4 -O21x Pentium4 2.5GHz
1430
Linux 2.4.23gSOAP 2.5, gcc 2.95.41x Pentium4 2.5GHz
703
AIX 5.2gSOAP 2.5, gcc 2.9-aix51 -O22x Power4+ 1.2GHz
530
SunOS 5.8gSOAP 2.5, gcc 2.8.1 -O22x UltraSPARC-III 750MHz

Back to main page.