【问题标题】:Performance hit due to converting REST API response to String由于将 REST API 响应转换为字符串而导致性能下降
【发布时间】:2021-06-04 16:24:22
【问题描述】:

我通过http 库访问了一个休息端点并将响应转换为字符串(如下所示),然后将其写入HDFS(Hadoop 分布式文件系统)。

HttpClient httpclient = new HttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response= httpclient.execute(httpget);

BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    content.append(inputLine);
}
String respStr = content.toString();

我意识到虽然 REST API 以毫秒为单位响应,但由于上述将响应转换为字符串的代码,它需要很多时间。

有人可以建议如何加快行为或如何以正确的方式进行吗?

【问题讨论】:

  • 可能是 API 正在使用流进行响应吗?那是第一个字节被快速发送但需要时间来获得完整的响应?您是否尝试过 cURL 或类似工具?

标签: java rest httpclient http-get


【解决方案1】:

我怀疑转换为字符串所需的时间主要用于从网络流中读取。除非那个字符串很大,否则构建字符串本身应该不会花费太长时间。

无论如何,这会更短(就代码行而言):

String respStr = EntityUtils.toString(response.getEntity().getContent());

如果您在不进行任何转换的情况下复制该数据,则跳过字符串转换并直接写入输出流应该更快,例如使用org.apache.commons.io.IOUtils

IOUtils.copy(response.getEntity().getContent(), outpustream)

【讨论】:

  • 是的,响应很大,因此转换为字符串需要时间。如何最小化?
  • 你用那个字符串做什么?可能有一种更有效的方法,您可以直接处理流而不转换它
  • 我正在寻找那种有效的方式?实际上,我需要将该字符串写入 HDFS(Hadoop 分布式文件系统)。
  • 查看我编辑的答案,输入流/字符串/输出流转换确实很昂贵,您可以尝试跳过它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多