Details
-
Improvement
-
Status: Resolved
-
Low
-
Resolution: Fixed
-
None
-
None
Description
Currently, we do three unnecessary copies (that is, writing to the socket is necessary; any other copies made are overhead) for each message:
- constructing the Message body byte[] (this is typically a call to a ICompactSerializer[2] serialize method, but sometimes we cheat e.g. in SchemaCheckVerbHandler's reply)
- which is copied to a buffer containing the entire Message (i.e. including Header) when sendOneWay calls Message.serializer.serialize()
- which is copied to a newly-allocated ByteBuffer when sendOneWay calls packIt
- which is what we write to the socket
For deserialize we perform a similar orgy of copies:
- IncomingTcpConnection reads the Message length, allocates a byte[], and reads the serialized Message into it
- ITcpC then calls Message.serializer().deserialize, which allocates a new byte[] for the body and copies that part
- finally, the verbHandler (determined by the now-deserialized Message header) deserializes the actual object represented by the body
Most of these are out of scope for 0.7 but I think we can at least elide the last copy on the write path and the first on the read.