Java和Java之间的任何已知性能差异C#BigQuery Client API?

时间:2015-07-31 17:55:24

标签: java c# google-bigquery google-api-dotnet-client

我们最近从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秒以上的爆发高度。这对我来说不是很有意义,但是想不到原因......

0 个答案:

没有答案