Java和;C#BigQuery客户端API?
我们最近正从Java转换到c#,我们发现数据流API的性能有很大的不同:Java和;C#BigQuery客户端API?,java,c#,google-bigquery,google-api-dotnet-client,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调
C#: await BigQueryService.Tabledata.InsertAll(request, ProjectId, DataSetId, TableId).ExecuteAsync();
Java: BigQueryService.tabledata.insertAll(ProjectId, DataSetId, TableId,request).execute();
在我们的测试中,我们使用C#API调用在一秒钟内得到的响应不到25个,但是使用javaapi平均每秒可以得到35个响应。
(我们在调用上述API之前记录一个“request send”日志,在从上述API获取响应对象之后记录一个“response get”日志。并且,我们在同一台机器上使用相同的数据集合进行了测试)
编辑
好的,我深入研究了API源代码,跟踪了它,然后编写了一个直接使用HttpClient的简单调用。以下是通话的情况(不是完美的,但只是想尽可能深入地分解时间成本):
这里的“StringContent”平均为160KB,而压缩内容平均为16KB。我在64位Windows Server 2012 R2上,有两个4核处理器,24GB RAM,1 Gbps网络连接
根据秒表结果,每个成功的httpclient调用的平均时间超过10秒,并且可以达到40秒以上的突发高峰。不知何故,这对我来说没有多大意义,但我想不出一个理由 .NET Bigquery API版本:Google.API.Bigquery.v2 1.9.2.2210是否可以添加有关计算机、Windows版本等的更多详细信息?如果使用非异步版本会发生什么。只是“执行”?@peleyal谢谢你的建议,我更新了上面的更多细节。我没有使用非异步版本,因为我在整个解决方案中都是异步的,我认为使用同步版本不是一个正确的选择。
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;
}