grpc kotlin/java性能差异

slsn1g29  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(386)

我用kotlin实现了一个简单的grpc演示项目。演示流程由几个部分组成:预处理两个请求、许多后续的预热请求和最后一个请求。我已经用java实现了相同的演示来比较性能。完整代码可在此处找到:https://github.com/frame17/grpc-demo . 原型定义:

syntax = "proto3";
option java_multiple_files = true;
option java_package = "application";

package grpc;

message Request {
  string name = 1;
}

message Response {
  string message = 1;
}

service PingService {
  rpc Ping (Request) returns (Response) {}
}

客户端代码如下所示:

class TestClient(private val channel: ManagedChannel) {
    private val stub: PingServiceGrpcKt.PingServiceCoroutineStub = PingServiceGrpcKt.PingServiceCoroutineStub(channel)

    suspend fun ping() {
        val request = Request.newBuilder().build()
        stub.ping(request)
    }
}

fun main() {
    val port = 8080
    val channel = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext().build()
    val client = TestClient(channel)

    measureNanoTime {
        runBlocking {
            client.ping()
        }
    }.also {
        println("Connecting: $it")
    }

    measureNanoTime {
        runBlocking {
            client.ping()
        }
    }.also {
        println("Before warm up: $it")
    }

    val n = 100_000
    measureNanoTime {
        runBlocking {
            IntRange(0, n).map {
                async {
                    client.ping()
                }
            }.awaitAll()
        }
    }.also {
        println("Warm up: ${it / n}")
    }

    measureNanoTime {
        runBlocking {
            client.ping()
        }
    }.also {
        println("After warm up: $it")
    }
}

我得到以下测量值(以纳秒为单位):

Connecting: 5923889409
Before warm up: 14580037
Warm up: 259311
After warm up: 20627192

关于它的性能,我有几点担心:
第一个请求通常需要5秒钟左右。我假设,它建立了一个实际的连接,随后的请求正在重用它。能做些什么来改善这一点吗?
预热后的请求可能需要20毫秒。java客户机的度量有很大的不同:

Connection: 5560394651
Before warm up: 6416257
Warm up: 358423
After warm up: 307845

预热后的请求不超过0.5毫秒。代码中是否有问题,原因是什么,如何解决?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题