| # C++ Performance Notes |
| |
| ## Streaming write buffering |
| |
| Generally, each write operation (Write(), WritesDone()) implies a syscall. |
| gRPC will try to batch together separate write operations from different |
| threads, but currently cannot automatically infer batching in a single stream. |
| |
| If message k+1 in a stream does not rely on responses from message k, it's |
| possible to enable write batching by passing a WriteOptions argument to Write |
| with the buffer_hint set: |
| |
| ~~~{.cpp} |
| stream_writer->Write(message, WriteOptions().set_buffer_hint()); |
| ~~~ |
| |
| The write will be buffered until one of the following is true: |
| - the per-stream buffer is filled (controllable with the channel argument |
| GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE) - this prevents infinite buffering leading |
| to OOM |
| - a subsequent Write without buffer_hint set is posted |
| - the call is finished for writing (WritesDone() called on the client, |
| or Finish() called on an async server stream, or the service handler returns |
| for a sync server stream) |
| |
| ## Completion Queues and Threading in the Async API |
| |
| Right now, the best performance trade-off is having numcpu's threads and one |
| completion queue per thread. |