The first tests with an early TAO version were not very promising. As can be seen in figure 23, the differences between the two ORB implementations used are tremendous. After the data in this test have been transferred, the receiver application accessed it. With direct access to the socket interface, the application reaches a maximum transfer bandwidth of about 48 Mbps. The throughput increases with growing data buffer size as the ratio between protocol information and payload gets smaller. With 1 KByte messages, TTCP gives a throughput of 10 Mbps per second. This is equivalent to about 1200 calls per second. omniOrb reached a maximum of 11 Mbps at the maximum buffer size used. With 1 KByte messages performance is 2 Mbps which equals about 245 calls per second. TAO in this version did not perform as well. The maximum bandwidth was 2 Mbps with the largest transferred buffer. Dispersion of transfer times with small packets was high.
The reason for the low performance of the early TAO version has been identified as lying in the encoding/decoding of the data. The external data representation engine loops over the single data pieces and transforms them from host to network representation at the sender and back to host representation on the receiver. We applied some optimisations to this version, but they did not improve performance very much: first, we reduced the amount of host database queries ( gethostbyname and similar calls); second, we removed some internal data copying ( memcpy) by replacing them with references. The overall improvement of these modifications was 1 Mbps. We therefore aimed at optimising the encoding and decoding of the transferred data. We modified the marshaling/demarshaling methods of the engine for the IDL sequence<> data type. If the sender and the receiver have the same byte order, the data is just copied into an application memory buffer. Optimising either the sender or the receiver already resulted in doubling the throughput numbers. Still, either the sender is slower than the receiver or vice versa. Only if the optimisations are applied to both participants can significant improvement be seen (see figure 24). TAO then clearly outperforms omniORB for larger packets (peak throughput 40 Mbps). For small messages, 1 KBytes large, the performance stays low with about 2 Mbps (245 calls/second).
In order to be comprehensive, we also exhibit the performance measurements without any data access (see figure 25). The data are transferred from the client to the server process, but are not copied into an application buffer. Here one can also see the slight improvement that could be achieved with the optimisations concerning the address structure lookup and the overhead of ORB internal copying of management data structures.
Finally, in figure 26 we can see that the performance of a recent version of the TAO ORB is similar to the hand optimised early version. The depicted comparison comprises ORB implementations from a time span of two years. To get a better impression of the performance limitation induced by the ORB, we used a logarithmic scale for both message size and throughput. Clearly for smaller parameter size we can see the difference to direct socket usage. In parallel programming or control systems this use case is found more often than the transfer of large messages.