I suspect it's the gRPC startup time. Would you be able to test in the following way, such as making the warm up requests first, and then benchmark the subsequent requests post-warmup.
There is also a benchmark that you can run / replicate here: https://github.com/david-cao/gRPCBenchmarks Cheers, On Tuesday, May 16, 2017 at 10:24:36 AM UTC+2, Dharshana Ratnayake wrote: > > hmm sure memory allocation could be different.. but i suspect it could be > something todo with > PoolingHttpClientConnectionManager > that im using in the REST scenario.. > > On Tuesday, 16 May 2017 06:57:11 UTC+12, Dharshana Ratnayake wrote: >> >> >> Hi guys.. >> >> Ive very recently discovered the world of gRPC and im super enthusiastic >> about how i can use it.. Just so i can understand the potential benefits. i >> set up the following benchmark test.. >> >> track 1: JSON over http1 using a spring boot app running on a google >> compute engine. >> >> public static void main(String[] args){ >> HttpClient httpClient = HttpClientBuilder.create().build(); >> >> ObjectMapper mapper = new ObjectMapper(); >> >> try { >> long startTime = System.currentTimeMillis(); >> for(int i=0;i<1000;i++) { >> MessageRequest value = new MessageRequest(new >> CharacterMessage(UUID.randomUUID(), new Vector(10, 20, 30))); >> >> HttpPost request = new HttpPost("http://[google compute engine >> ip]:8080/character"); >> StringEntity params = new >> StringEntity(mapper.writeValueAsString(value)); >> request.addHeader("content-type", "application/json"); >> request.addHeader("Accept", "application/json"); >> >> request.setEntity(params); >> HttpResponse response = httpClient.execute(request); >> BufferedReader br = new BufferedReader(new >> InputStreamReader((response.getEntity().getContent()))); >> >> String output; >> StringBuilder sb = new StringBuilder(); >> while ((output = br.readLine()) != null) { >> sb.append(output); >> } >> MessageResponse mr = mapper.readValue(sb.toString(), >> MessageResponse.class); >> System.out.println("Output from Server .... \n"); >> System.out.println(mr.getCharacterMessage().getPossition()); >> } >> >> System.out.println("all >> done!!:"+(System.currentTimeMillis()-startTime)); >> }catch (Exception ex) { >> ex.printStackTrace(); >> } >> >> >> track 2: proto buffer over http2 using grpc server running on google >> compute engine >> >> public static void main(String[] args){ >> ManagedChannel channel = ManagedChannelBuilder >> .forAddress("[googgle compute engine ip]", 8080) >> .usePlaintext(true) >> .build(); >> >> CharacterServiceGrpc.CharacterServiceBlockingStub stub = >> CharacterServiceGrpc.newBlockingStub(channel); >> long startTime = System.currentTimeMillis(); >> >> for(int i=0;i<1000;i++) { >> MessageResponse response = stub.updateCharacter( >> MessageRequest.newBuilder() >> .setCharacterMessage( >> CharacterMessage.newBuilder() >> >> .setId(ByteString.copyFrom(asBytes(UUID.randomUUID()))) >> .setPosstion(Vector.newBuilder() >> >> .setX(10).setY(20).setZ(30).build()) >> .build()) >> .build()); >> >> System.out.println("response:" + >> response.getCharacterMessage().getPosstion()); >> } >> >> System.out.println("finished message >> transfer:"+(System.currentTimeMillis()-startTime)); >> } >> >> public static byte[] asBytes(UUID uuid) { >> ByteBuffer bb = ByteBuffer.wrap(new byte[16]); >> bb.putLong(uuid.getMostSignificantBits()); >> bb.putLong(uuid.getLeastSignificantBits()); >> return bb.array(); >> } >> >> >> So i ran both cases (each does a 1000) request from my place in New >> Zealand to us-west. I was obviously expecting the gRPC to do better.. But >> to my surprise (and disappointment) it didn't.. The JSON/HTTP1 completed in >> 349270 milliseconds but the gRPC scenario took 364541 milliseconds to >> finish.. >> Can anyone explain what might be going on here? >> I would have thought because http being binary more easy to parse and >> being more compact that it would do better than REST.. Maybe spring-boot is >> doing something clever? I do know that on a case like this you would use a >> stream and that finishes in 1974 milliseconds.. But i would have through >> that just call to call gRPC would do faster as well. >> > -- 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 post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/638a9ed4-741a-413e-a923-d3bb30a1b819%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
