Some performance measurements have been made on various machines using a loopback TCP/IP connection within a single process.
Most of the tests are concerned with measuring the throughput of small batched one-way function calls on a loopback connection.
There are seven tests which have been defined:
Test | Description |
---|---|
TEST1 | Batch one million one-way messages on the sender. This test only measures the time to batch the calls by the sender (i.e. without ensuring the calls have been made on the receiver) |
TEST2 | Batch one million small one-way messages and wait for them all to be invoked on the receiver |
TEST3 | Batch many small two-way messages (i.e. messages are buffered on the sender but may not have been sent) |
TEST4 | Batch many small two-way messages then wait for all responses to be received |
TEST5 | Synchronously call many small two-way messages. The next message is not sent until the response from the previous message has been received. |
TEST6 | Synchronously call a two-way message which sends 500000 bytes |
TEST7 | Synchronously call a two-way message which sends a vector of 50000 elements where each element is a struct containing two ints and a double |
For details about the implementation of these tests for each middleware system see the following:
These tests have been performed on the following machines:
Machine configuration | Hardware | OS |
---|---|---|
M1 | Intel core duo E8400 3GHz desktop | Windows XP professional SP3 32 bit |
M2 | Intel Core 2 Quad Q9400 2.66GHz desktop with 4GB RAM | Windows 7 64 bit |
M3 | Intel Core i7-4700MQ 2.4GHz laptop with 16GB RAM | Windows 10 64 bit |
M4 | Intel Core i7-4700MQ 2.4GHz laptop with 16GB RAM | Linux Ubuntu 14.04 64-bit on Oracle VM VirtualBox with one processor and 2GB RAM on Windows 10 64bit |
M5 | Intel Core i7-4790 3.60GHz with 8GB RAM | Windows 7 64 bit professional SP1 |
Batch many small one-way messages on the sender. This test only measures the time to batch the calls by the sender (i.e. without ensuring the calls have been made on the receiver).
Machine configuration |
Middleware | Network | v msg/s |
---|---|---|---|
M3 | cxRmi x64 | loopback | 51 M |
M4 | cxRmi x64 | loopback | 54 M |
M5 | cxRmi x64 | loopback | 74 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.9 M |
Machine configuration |
Middleware | Network | b1 msg/s |
---|---|---|---|
M3 | cxRmi x64 | loopback | 42 M |
M4 | cxRmi x64 | loopback | 64 M |
M5 | cxRmi x64 | loopback | 64 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.9 M |
Machine configuration |
Middleware | Network | b2 msg/s |
s1 msg/s |
---|---|---|---|---|
M3 | cxRmi x64 | loopback | 35 M | 42 M |
M4 | cxRmi x64 | loopback | 59 M | 63 M |
M5 | cxRmi x64 | loopback | 55 M | 62 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.8 M | 2.9 M |
Machine configuration |
Middleware | Network | b4 msg/s |
s2 msg/s |
i1 msg/s |
f1 msg/s |
---|---|---|---|---|---|---|
M3 | cxRmi x64 | loopback | 27 M | 35 M | 41 M | 43 M |
M4 | cxRmi x64 | loopback | 49 M | 58 M | 61 M | 58 M |
M5 | cxRmi x64 | loopback | 44 M | 54 M | 61 M | 59 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.8 M | 2.8 M | 2.9 M | 2.9 M |
Machine configuration |
Middleware | Network | b8 msg/s |
s4 msg/s |
i2 msg/s |
l1 msg/s |
f2 msg/s |
d1 msg/s |
---|---|---|---|---|---|---|---|---|
M3 | cxRmi x64 | loopback | 14 M | 20 M | 26 M | 29 M | 27 M | 29 M |
M4 | cxRmi x64 | loopback | 16 M | 26 M | 25 M | 30 M | 27 M | 27 M |
M5 | cxRmi x64 | loopback | 23 M | 32 M | 36 M | 39 M | 36 M | 39 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.7 M | 2.7 M | 2.8 M | 2.8 M | 2.8 M | 2.8 M |
Machine configuration |
Middleware | Network | s8 msg/s |
i4 msg/s |
l2 msg/s |
f4 msg/s |
d2 msg/s |
---|---|---|---|---|---|---|---|
M3 | cxRmi x64 | loopback | 13 M | 19 M | 24 M | 20 M | 25 M |
M4 | cxRmi x64 | loopback | 14 M | 19 M | 19 M | 20 M | 21 M |
M5 | cxRmi x64 | loopback | 21 M | 28 M | 31 M | 28 M | 32 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.6 M | 2.7 M | 2.7 M | 2.7 M | 2.7 M |
Machine configuration |
Middleware | Network | i8 msg/s |
l4 msg/s |
f8 msg/s |
d4 msg/s |
---|---|---|---|---|---|---|
M3 | cxRmi x64 | loopback | 14 M | 19 M | 15 M | 20 M |
M4 | cxRmi x64 | loopback | 12 M | 15 M | 13 M | 15 M |
M5 | cxRmi x64 | loopback | 21 M | 29 M | 21 M | 27 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.5 M | 2.5 M | 2.5 M | 2.5 M |
Machine configuration |
Middleware | Network | l8 msg/s |
d8 msg/s |
---|---|---|---|---|
M3 | cxRmi x64 | loopback | 14 M | 15 M |
M4 | cxRmi x64 | loopback | 10 M | 10 M |
M5 | cxRmi x64 | loopback | 19 M | 19 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.3 M | 2.3 M |
Batch many small one-way messages and wait for them all to be invoked on the receiver.
Machine configuration |
Middleware | Network | v msg/s |
---|---|---|---|
M3 | cxRmi x64 | loopback | 13.4 M |
M4 | cxRmi x64 | loopback | 11.7 M |
M5 | cxRmi x64 | loopback | 20.1 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.4 M |
Machine configuration |
Middleware | Network | b1 msg/s |
---|---|---|---|
M3 | cxRmi x64 | loopback | 10.8 M |
M4 | cxRmi x64 | loopback | 10.9 M |
M5 | cxRmi x64 | loopback | 16.6 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.2 M |
Machine configuration |
Middleware | Network | b2 msg/s |
s1 msg/s |
---|---|---|---|---|
M3 | cxRmi x64 | loopback | 10.0 M | 10.5 M |
M4 | cxRmi x64 | loopback | 10.5 M | 10.8 M |
M5 | cxRmi x64 | loopback | 15.1 M | 15.6 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.2 M | 2.2 M |
Machine configuration |
Middleware | Network | b4 msg/s |
s2 msg/s |
i1 msg/s |
f1 msg/s |
---|---|---|---|---|---|---|
M3 | cxRmi x64 | loopback | 8.4 M | 9.3 M | 9.7 M | 9.9 M |
M4 | cxRmi x64 | loopback | 9.7 M | 10.1 M | 10.3 M | 10.0 M |
M5 | cxRmi x64 | loopback | 13.1 M | 13.7 M | 14.0 M | 14.0 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.1 M | 2.2 M | 2.2 M | 2.2 M |
Machine configuration |
Middleware | Network | b8 msg/s |
s4 msg/s |
i2 msg/s |
l1 msg/s |
f2 msg/s |
d1 msg/s |
---|---|---|---|---|---|---|---|---|
M3 | cxRmi x64 | loopback | 6.8 M | 7.6 M | 7.9 M | 8.4 M | 8.3 M | 8.4 M |
M4 | cxRmi x64 | loopback | 7.8 M | 8.9 M | 9.0 M | 9.0 M | 8.9 M | 8.9 M |
M5 | cxRmi x64 | loopback | 10.2 M | 11.0 M | 11.5 M | 11.7 M | 11.6 M | 11.8 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.1 M | 2.1 M | 2.2 M | 2.2 M | 2.2 M | 2.2 M |
Machine configuration |
Middleware | Network | s8 msg/s |
i4 msg/s |
l2 msg/s |
f4 msg/s |
d2 msg/s |
---|---|---|---|---|---|---|---|
M3 | cxRmi x64 | loopback | 5.7 M | 5.9 M | 6.3 M | 6.3 M | 6.4 M |
M4 | cxRmi x64 | loopback | 7.8 M | 7.5 M | 7.6 M | 7.5 M | 7.7 M |
M5 | cxRmi x64 | loopback | 8.3 M | 8.7 M | 8.9 M | 8.7 M | 8.9 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.1 M | 2.2 M | 2.2 M | 2.2 M | 2.2 M |
Machine configuration |
Middleware | Network | i8 msg/s |
l4 msg/s |
f8 msg/s |
d4 msg/s |
---|---|---|---|---|---|---|
M3 | cxRmi x64 | loopback | 4.1 M | 4.3 M | 4.1 M | 4.3 M |
M4 | cxRmi x64 | loopback | 6.2 M | 6.1 M | 5.9 M | 6.1 M |
M5 | cxRmi x64 | loopback | 6.1 M | 6.1 M | 6.0 M | 6.2 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 2.0 M | 2.0 M | 2.0 M | 2.0 M |
Machine configuration |
Middleware | Network | l8 msg/s |
d8 msg/s |
---|---|---|---|---|
M3 | cxRmi x64 | loopback | 2.5 M | 2.5 M |
M4 | cxRmi x64 | loopback | 4.8 M | 4.5 M |
M5 | cxRmi x64 | loopback | 3.6 M | 3.6 M |
M5 | ZeroC Ice 3.6.3 x64 | loopback | 1.8 M | 1.8 M |
Machine | TEST1 (call/s) |
TEST2 (call/s) |
TEST3 (call/s) |
TEST4 (call/s) |
TEST5 (call/s) |
TEST6 (bit/s) |
TEST7 (bit/s) |
---|---|---|---|---|---|---|---|
M1 loopback | 27M | - | 4.5M | - | 34k | - | - |
M2 loopback | 39M | 6.8M | 5.8M | 2.2M | 18k | 1760M | 1520M |
M3 loopback | 35M | 9.5M | 6.4M | 2.3M | 25k | 4000M | 2900M |
M4 loopback | 52M | 9.5M | 9.4M | 2.8M | 41k | 7600M | 4400M |
M5 loopback | 62M | 14M | 9.8M | 3.9M | 42k | 4300M | 3000M |
M6 loopback | 2.9M | 2.2M | - | - | 33k | 3500M | 2500M |
Some of the results are blank for the E8400 machine because more tests have been added over time and this machine is no longer available.
TEST3 and TEXT4 are blank for ZeroC Ice configurations because Ice doesn't support batching of two-way function calls.
See Who's Who in Middleware (Gartner Analyst report 1Q04)
Some middleware performance tests which may also be of interest
WCF means Windows Communication Foundation
By way of comparison in Choosing Middleware: Why Performance and Scalability do (and do not) Matter by Henning 2009 the following results were reported:
Sending of a message with no in/out parameters to measure latency
Middleware | Send message size (bytes) | Receive message size (bytes) | Loopback invocations per second | gigabit network invocations per second |
---|---|---|---|---|
Ice for C++ | 32 | 25 | 10500 | 2300 |
Ice for .NET | 32 | 25 | 7500 | 2270 |
Microsoft WCF with binary encoding | 65 | 58 | 7500 | 2200 |
Microsoft WCF with SOAP encoding | 620 | 531 | 2500 | 570 |
Ice for Java | 32 | 25 | 8000 | 2300 |
Java RMI | 41 | 22 | 10600 | 2220 |
Sending of a 500kB buffer to measure throughput
Middleware | Throughput 500kB (loopback) (send) MBit/sec | Throughput 500kB (loopback) (recv) MBit/sec | Throughput 500kB (network) (send) MBit/sec | Throughput 500kB (network) (recv) MBit/sec |
---|---|---|---|---|
Ice for .NET | 630 | 610 | 520 | 410 |
Microsoft WCF with binary encoding | 515 | 550 | 425 | 370 |
Microsoft WCF with SOAP encoding | 144 | 165 | 140 | 130 |
Ice for Java | 825 | 730 | 660 | 560 |
Java RMI | 825 | 800 | 283 | 280 |
Sending of 50000 struct instances each having two int32s and a float64
Middleware | Throughput (loopback) (send) MBit/sec | Throughput (loopback) (recv) MBit/sec | Throughput (network) (send) MBit/sec | Throughput (network) (recv) MBit/sec |
---|---|---|---|---|
Ice for .NET | 380 | 300 | 300 | 205 |
Microsoft WCF with binary encoding | 29 | 28 | 31 | 29 |
Microsoft WCF with SOAP encoding | 21 | 21 | 23 | 24 |
Ice for Java | 138 | 118 | 252 | 148 |
Java RMI | 48 | 52 | 66 | 66 |