我们最近从Java切换到c#,我们发现数据流API的性能差异很大:
C#: await BigQueryService.Tabledata.InsertAll(request, ProjectId, DataSetId, TableId).ExecuteAsync();
Java: BigQueryService.tabledata.insertAll(ProjectId, DataSetId, TableId,request).execute();
在我们的测试中,我们在一秒钟内使用C#API调用得到的响应少于25个,但我们可以使用Java API平均每秒获得35个响应。 (我们在调用上述API之前记录“请求发送”日志,并在我们从上述API获取响应对象后立即记录“响应获取”日志。并且,我们在同一台机器上使用相同的集合进行了测试数据)
修改
好吧,我深入研究API源代码,追溯到它,然后写了一个直接使用HttpClient的简单调用。这就是呼叫的样子(不完美,但只是打算尽可能地分解时间成本):
string requestUri = BaseUri + string.Format("/projects/{0}/datasets/{1}/tables/{2}/insertAll", projectId, datasetId,tableId);
var serializedObject = BigQueryService.SerializeObject(request);
HttpContent content = new StringContent(serializedObject, Encoding.UTF8, "application/json");
content = await CompressAsync(content);
using (HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Post, requestUri)
{
Version = Version.Parse("1.1"),
Content = content
})
{
Stopwatch sw1 = Stopwatch.StartNew();
await _staticCredential.InterceptAsync(httpRequest, ct).ConfigureAwait(false);
sw1.Stop();
Stopwatch sw2 = Stopwatch.StartNew();
HttpResponseMessage returnMsg = await HttpClient.SendAsync(httpRequest,ct);
// HttpResponseMessage returnMsg = await HttpClient.PostAsync(requestUri,content,ct);
sw2.Stop();
Logger.Trace("Credential.InterceptAsync~{0}~HttpClient.SendAsync~{1}", sw1.ElapsedMilliseconds, sw2.ElapsedMilliseconds);
return returnMsg;
}
这里的“StringContent”平均为160KB,而压缩内容平均为16KB。我使用的是64位Windows Server 2012 R2,具有两个4核处理器,24GB RAM,1 Gbps网络连接。
根据秒表结果,每次成功进行httpclient呼叫的平均时间超过10秒,并且可以达到40秒以上的爆发高度。这对我来说不是很有意义,但是想不到原因......