Search code examples
javasocketsobjectoutputstreamobjectinputstream

Does it really matter the size of the objects you send through a Socket with object input/output streams?


Is it more efficient to flush the OutputStream after each individual invocation of ObjectOutputStream#writeObject rather than flushing the stream after a sequence of object writes? (Example: write object and flush 4 times, or write 4 times and then just flush once?)

How does ObjectOutputStream work internally?


Solution

  • Is it somehow better sending four Object[5] (flushing each one) than a Object[20], for example?

    It is not better. In fact it is probably worse, from a performance perspective. Each of those flushes will force the OS-level TCP/IP stack to send the data "right now". If you just do one flush at the end, you should save on system calls, and on network traffic.

    If you haven't done this already, inserting a BufferedOutputStream between the Socket OutputStream and the ObjectOutputStream will make a much bigger difference to performance. This allows the serialized data to accumulate in memory before being written to the socket stream. This potentially save many system calls and could improve performance by orders of magnitude ... depending on the actual objects being sent.

    (The representation of four Object[5] objects is larger than one Object[20] object, and that results in a performance hit in the first case. However, this is marginal at most, and tiny compared with the flushing and buffering issues.)

    How does this stream work internally?

    That is too general a question to answer sensibly. I suggest that you read up on serialization starting with the documents on this page.