Hi Team,
Thanks for taking a look. I ran a practical benchmark comparing gRPC (Java)
and Java RMI in my environment and I’m seeing an unexpectedly large gap in
synchronous call throughput. I’d appreciate your thoughts — whether I’ve
missed something in the setup, or if there’s anything I should change in
the client/server configuration or test approach.
What I ran (attachments)
I’ve attached two test projects (each contains a README with build/run
instructions):
- grpc.helloworld.example.7z — sample gRPC server + client
- I am using the same channel and stub for making synchronous gRPC
calls to the server.
- In my production environment there is no possibility for warm up.
- JavaRmi.7z — sample Java RMI server + client
Both are simple sync-call examples intended to reproduce real-world
synchronous RPC behavior.
Environment
- Language: Java (JDK 24.0.1)
- Build tool: Maven 3.9.10+
- OS: Windows 11
- Hardware: Intel i5, 8 GB RAM
- Both server and client were run locally on the same machine during
tests.
What I expected
gRPC is generally positioned to provide high-throughput RPCs; I expected
synchronous gRPC stubs to be able to achieve much higher calls/sec when
server and client run locally.
What I observed
- gRPC (synchronous stubs): ~200–500 calls/sec (per-second window during
my run)
- Java RMI (similar test) : 7,684 calls/sec
This large difference surprised me — the RMI result is an order of
magnitude higher than the gRPC synchronous result on the same machine and
roughly the same test semantics.
I expected gRPC to perform much better based on official benchmarks. You
can refer to the gRPC benchmark results here:
🔗 https://grafana-dot-grpc-testing.appspot.com/?orgId=1
I’ve shared the gRPC and RMI project folders through the links below.
Please review them and let me know your observations.
grpc.helloworld.example.7z:
https://drive.google.com/file/d/1adgUszOWfKd-dIEh_rc9q0ApSQb_jUjI/view?usp=drive_link
JavaRmi.7z :
https://drive.google.com/file/d/1bf5AR1ZcZcCI_T4NY15h-i3EU6xJnaQL/view?usp=drive_link
I have already verified the setup and followed the official gRPC Java
example. Could you please check if there’s anything wrong in my setup or
suggest how I can improve the synchronous call performance?
Best regards,
Mansoor
On Thursday, November 13, 2025 at 9:13:00 PM UTC+5:30 Shubham Raj wrote:
> You are making the sync call. Is is possible for you to
> try ClientCalls.asyncUnaryCall and share the result. I anticipate the
> result will be much better.
>
> Also instead of 1sec, can we do for 10 second and then divide the result
> by 10. I would be happy to discuss with you further on these details.
>
> Thanks,
> Shubham Raj
>
> On Friday, October 24, 2025 at 9:29:49 PM UTC+5:30 Adam Lazur wrote:
>
>> The JVM needs time to warm up. 1 second is hilariously short for a
>> performance test. In some not-so-serous benchmarking I warm up the JVM for
>> 120s, then run a few minutes of load to let things normalize.
>>
>> You could probably use multiple connections from client to server, unless
>> you're looking for a blocking single connection test?
>>
>> There are probably other things to tweak or tune, but posting code
>> snippets isn't a great way to allow someone to help. I'd recommend posting
>> a full example to github.
>>
>> .laz
>>
>>
>>
>> On Thursday, October 23, 2025 at 1:13:55 AM UTC+11 Mansoor Shaik wrote:
>>
>>> Dear gRPC Team,
>>>
>>> I hope you are doing well.
>>>
>>> I am testing gRPC Java performance using the official HelloWorld
>>> example (Maven-based) from the gRPC GitHub repository:
>>>
>>> 🔗 https://grpc.io/docs/languages/java/quickstart/
>>>
>>> The project runs correctly, and I made a small modification in the
>>> client code to measure how many RPC calls can be executed within 1
>>> second — just to check the performance benchmark.
>>>
>>>
>>>
>>> Setup Details
>>>
>>> - Language: Java
>>> - Java Version: 24
>>> - Build Tool: Maven
>>> - IDE: Spring Tool Suite (STS)
>>> - Operating System: Windows 11
>>> - Memory Allocation: 64 MB each (client and server)
>>> - Connection: localhost
>>>
>>>
>>>
>>> Modification
>>>
>>> I modified the client to run a simple loop that repeatedly calls
>>> sayHello() for 1 second and counts the total number of RPCs executed.
>>>
>>> Below is the modified section of the code in the client:
>>>
>>>
>>>
>>> long startTime = System.currentTimeMillis();
>>> int callCount = 0;
>>>
>>> while (System.currentTimeMillis() - startTime < 1000) {
>>> blockingStub.sayHello(request);
>>> callCount++;
>>> }
>>>
>>> long maxMem = Runtime.getRuntime().maxMemory() / (1024 * 1024);
>>> System.out.println("In 1 second, gRPC method called " + callCount +
>>> " times, allocated memory = " + maxMem + " MB");
>>>
>>> Everything else in the project (server and client) is the same as the
>>> official gRPC example.
>>>
>>>
>>>
>>> Result
>>>
>>> - gRPC Java: 200–500 calls/second
>>>
>>>
>>>
>>> I have attached performance client file, please review it..
>>> HelloWorldPerformaceClient
>>> <https://1drv.ms/u/c/199210faefceddf2/EaR6SeKrgNNNqBA300YdQJ4BIgTG8RfBQSCp4cUv6GloGA?e=8x7mLp>
>>> On Wednesday, October 22, 2025 at 11:46:13 AM UTC+5:30 Kannan
>>> Jayaprakasam wrote:
>>>
>>>> Are you reusing the ManagedChannel for making all the RPC's or
>>>> recreating it for each RPC? Reusing the channel is the way to go since the
>>>> connections don't need to be reestablished.
>>>>
>>>> On Thursday, October 16, 2025 at 6:40:21 PM UTC+5:30 Mansoor Shaik
>>>> wrote:
>>>>
>>>>> Hello gRPC Team,
>>>>>
>>>>>
>>>>> I hope you are doing well.
>>>>>
>>>>> I am currently working on evaluating gRPC Java performance as part of
>>>>> a sample setup, and I wanted to share an issue I’m facing that seems
>>>>> performance-related.
>>>>>
>>>>>
>>>>>
>>>>> I have implemented a minimal gRPC server and client setup using Java
>>>>> + Maven, following the official example provided on the gRPC Java
>>>>> documentation site( https://grpc.io/docs/languages/java/quickstart/) The
>>>>> build and execution both complete successfully — however, the observed
>>>>> performance is much lower than expected.
>>>>>
>>>>>
>>>>>
>>>>> When I run the server and client locally on the same machine, I
>>>>> notice that in one second, the client can only perform around 200–500
>>>>> gRPC synchronous calls using synchronous stubs. I expected much
>>>>> higher throughput, given that gRPC is designed to provide significant
>>>>> performance benefits compared to RMI-based APIs.
>>>>>
>>>>>
>>>>>
>>>>> As a comparison, when I tested a Java RMI-based setup under similar
>>>>> conditions, benchmark results it achieved 7,684 calls per second
>>>>>
>>>>>
>>>>>
>>>>> I’ve ensured that the implementation strictly follows the example
>>>>> code, including .proto generation and Maven dependency configuration.
>>>>>
>>>>> Below are the technical details and the steps I’ve already verified:
>>>>>
>>>>>
>>>>>
>>>>> Environment Details
>>>>>
>>>>> - Language: Java
>>>>> - Build Tool: Maven
>>>>> - Framework: gRPC Java (sample from official documentation)
>>>>> - Java Version: 24
>>>>> - Operating System: Windows 11
>>>>> - Hardware: 8 GB RAM, Intel i5 Processor
>>>>>
>>>>>
>>
>> <https://www.canva.com/>
>> Empowering the world to design
>> We're hiring, apply here <https://www.canva.com/careers/>! Check out the
>> latest news and learnings from our team on the Canva Newsroom
>> <https://www.canva.com/newsroom/news/>.
>> <https://twitter.com/canva> <https://facebook.com/canva>
>> <https://au.linkedin.com/company/canva> <https://twitter.com/canva>
>> <https://facebook.com/canva> [image:
>> https://www.linkedin.com/company/canva]
>> <https://www.linkedin.com/company/canva> [image:
>> https://instagram.com/canva]
>> <https://instagram.com/canva>
>>
>
--
You received this message because you are subscribed to the Google Groups
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/grpc-io/72567200-7bdf-4683-9ff2-9a12aef98e24n%40googlegroups.com.