These benchmarks cover three workloads:
- nop
- add
- hex
Each framework uses its own serialization layer:
| Framework | Serialization |
|---|---|
| waRPC | Polyglot |
| gRPC | Protobuf |
| iceRPC | Slice |
Tip
If u want to avoid manual installation,
just use j setup ^^
(Works only on MacOS and Arch)
gRPC & IceRPC
- gRPC
- Protobuf
- dotnet
- cmake
- ninja
- llvm
- openssl
MacOS:
brew install grpc protobuf cmake ninja llvm openssl && brew install --cask dotnet-sdkArch btw:
sudo pacman -Syu --needed grpc protobuf dotnet-sdk cmake ninja llvm clang opensslwaRPC
- wapm
- wrsc
- wapm:warpc
- wapm:polyglot
Install wapm && wrsc
curl -fsSL https://wapm.wanime.io/install.sh | shcurl -fsSL https://wrsc.wanime.io/install.sh | shInstalling warpc && polyglot
wapm y warpc polyglot --version 0.1.0WAnime RPC (waRPC) is a modern RPC framework built on top of QUIC and written in modern c++ ^_^, by WAnime.
Running waRPC benchamrks:
# Start waRPC server
j warpc_serve# Run bench
j warpc_benchgRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.
Running gRPC benchamrks:
# Start gRPC server
j grpc_serve# Run bench
j grpc_benchA C# RPC framework built for QUIC, with bidirectional streaming, first-class async/await, and Protobuf support.
Running IceRPC benchamrks:
# Start IceRPC server
j ice_serve# Run bench
j ice_benchThe "trust me bro" bench by WAnime ^^
Important
In this configuration waRPC server && client, both are not using io_uring kernel bypass.
1 Client @100,000 calls
Latency per call
Nop
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Add
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Hex
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Throughput
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0qps | 0qps | 0qps |
| gRPC | 0qps | 0qps | 0qps |
| iceRPC | 0qps | 0qps | 0qps |
Memory usage Client
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0mb | 0mb | 0mb |
| gRPC | 0mb | 0mb | 0mb |
| iceRPC | 0mb | 0mb | 0mb |
CPU usage Client
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0% | 0% | 0% |
| gRPC | 0% | 0% | 0% |
| iceRPC | 0% | 0% | 0% |
Memory usage Server
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0mb | 0mb | 0mb |
| gRPC | 0mb | 0mb | 0mb |
| iceRPC | 0mb | 0mb | 0mb |
CPU usage Server
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0% | 0% | 0% |
| gRPC | 0% | 0% | 0% |
| iceRPC | 0% | 0% | 0% |
Note
waRPC -> async API && Atomic Execution API
gRPC -> callback API with CQ
iceRPC -> todo
1 Client @100,000 calls
Latency per call
Nop
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Add
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Hex
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Throughput
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0qps | 0qps | 0qps |
| gRPC | 0qps | 0qps | 0qps |
| iceRPC | 0qps | 0qps | 0qps |
Memory usage Client
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0mb | 0mb | 0mb |
| gRPC | 0mb | 0mb | 0mb |
| iceRPC | 0mb | 0mb | 0mb |
CPU usage Client
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0% | 0% | 0% |
| gRPC | 0% | 0% | 0% |
| iceRPC | 0% | 0% | 0% |
Memory usage Server
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0mb | 0mb | 0mb |
| gRPC | 0mb | 0mb | 0mb |
| iceRPC | 0mb | 0mb | 0mb |
CPU usage Server
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0% | 0% | 0% |
| gRPC | 0% | 0% | 0% |
| iceRPC | 0% | 0% | 0% |
Important
In this configuration waRPC server && client, both are using io_uring kernel bypass.
1 Client @100,000 calls
Latency per call
Nop
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Add
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Hex
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Throughput
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0qps | 0qps | 0qps |
| gRPC | 0qps | 0qps | 0qps |
| iceRPC | 0qps | 0qps | 0qps |
Memory usage Client
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0mb | 0mb | 0mb |
| gRPC | 0mb | 0mb | 0mb |
| iceRPC | 0mb | 0mb | 0mb |
CPU usage Client
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0% | 0% | 0% |
| gRPC | 0% | 0% | 0% |
| iceRPC | 0% | 0% | 0% |
Memory usage Server
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0mb | 0mb | 0mb |
| gRPC | 0mb | 0mb | 0mb |
| iceRPC | 0mb | 0mb | 0mb |
CPU usage Server
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0% | 0% | 0% |
| gRPC | 0% | 0% | 0% |
| iceRPC | 0% | 0% | 0% |
Note
waRPC -> async API && Atomic Execution API
gRPC -> callback API with CQ
iceRPC -> todo
1 Client @100,000 calls
Latency per call
Nop
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Add
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Hex
| ~ | min | avg | p50 | p90 | p99 | p99.9 | max |
|---|---|---|---|---|---|---|---|
| waRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| gRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
| iceRPC | 0us | 0us | 0us | 0us | 0us | 0us | 0us |
Throughput
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0qps | 0qps | 0qps |
| gRPC | 0qps | 0qps | 0qps |
| iceRPC | 0qps | 0qps | 0qps |
Memory usage Client
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0mb | 0mb | 0mb |
| gRPC | 0mb | 0mb | 0mb |
| iceRPC | 0mb | 0mb | 0mb |
CPU usage Client
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0% | 0% | 0% |
| gRPC | 0% | 0% | 0% |
| iceRPC | 0% | 0% | 0% |
Memory usage Server
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0mb | 0mb | 0mb |
| gRPC | 0mb | 0mb | 0mb |
| iceRPC | 0mb | 0mb | 0mb |
CPU usage Server
| ~ | Nop | Add | Hex |
|---|---|---|---|
| waRPC | 0% | 0% | 0% |
| gRPC | 0% | 0% | 0% |
| iceRPC | 0% | 0% | 0% |
This project is licensed under MIT license