为了账号安全,请及时绑定邮箱和手机立即绑定

InputStream转成String考虑高性能

InputStream转成String考虑高性能

德玛西亚99 2023-09-27 17:21:09
我已经创建了rest-client java 代码并将XML 响应转换为字符串。我找到了三种方法来转换该响应。HttpURLConnection........InputStream in = new GZIPInputStream(conn.getInputStream());Gzip使用上面的行将响应隐藏到 InputStream 中。然后我找到了以下3种方法来转换为String。1 方法ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int length = 0;while ((length = in.read(buffer)) != -1) {    baos.write(buffer, 0, length);}String response =new String(baos.toByteArray());2 方法String response = "";BufferedReader br = new BufferedReader(new InputStreamReader(in));String output;while ((output = br.readLine()) != null) {    response =output;}3 方法StringBuilder sb = new StringBuilder();for (int c; (c = in.read()) >= 0;)    sb.append((char) c);String response = sb.toString();我需要知道哪种是读取 XML 响应的最佳方式,考虑到高性能/可用性(以减少响应时间)。此代码将在并行进程中每秒使用大约 50-100 个请求。请建议我。爪哇表现休息
查看完整描述

2 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

这是你的答案。

我编写了一个简单的代码,可以为您完成所有性能测试:

import java.util.*;

import java.io.*;

import java.time.format.DateTimeFormatter;

import java.time.LocalDateTime;


public class Main {

 public static void main(String[] args) throws Exception {

  // Your code here!

  String response = "";

  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");


  //STEP 1

  InputStream in = new ByteArrayInputStream("MYSTREAMASDasdasdSJKDFJASLKFJKSDLFJLKSADJFKSJDKAFJKSDJFLKSDJLKFJLKSDFJLKSDJLKLAKSDJLJKFSDKJADFSLJKLKJSDALJKALJKS adkaslkdajslkdjkaslkdjlaks\nasdasdasdasdasdasdasdasdasdasdasdasdasdas".getBytes());


  System.out.println("FIRST OPTION");

  long beginTime = System.nanoTime();

  //System.out.println("begin -" + beginTime);

  for (int i = 0; i < 500000; i++) {

   ByteArrayOutputStream baos = new ByteArrayOutputStream();

   byte[] buffer = new byte[4096];

   int length = 0;

   while ((length = in .read(buffer)) != -1) {

    baos.write(buffer, 0, length);

   }

   response = new String(baos.toByteArray());

  }

  long endTime = System.nanoTime();

  System.out.println(endTime - beginTime);


  //STEP 2

  System.out.println("SECOND OPTION");

  beginTime = System.nanoTime();

  for (int i = 0; i < 500000; i++) {

   response = "";

   BufferedReader br = new BufferedReader(new InputStreamReader( in ));

   String output;

   while ((output = br.readLine()) != null) {

    response = output;

   }

  }

  endTime = System.nanoTime();

  System.out.println(endTime - beginTime);


  System.out.println("THIRD OPTION");

  beginTime = System.nanoTime();

  for (int i = 0; i < 500000; i++) {

   StringBuilder sb = new StringBuilder();

   for (int c;

    (c = in .read()) >= 0;)

    sb.append((char) c);

   response = sb.toString();

  }

  endTime = System.nanoTime();

  System.out.println(endTime - beginTime);

 }

}

这里有 500K 循环执行的结果:

  • 第一个选项 284684443 毫秒

  • 第二个选项 1331922335 毫秒

  • 第三个选项 16031272 毫秒

正如您将看到的,第三个选项是最快的。

是运行示例


查看完整回答
反对 回复 2023-09-27
?
阿晨1998

TA贡献2037条经验 获得超6个赞

我已经使用Jemeter - Java Request运行了我的代码,根据统计数据,1 方法显示了与其他方法相比的最佳性能。此测试使用实际的 HTTP 调用运行并将该响应转换为字符串。

方法 01 成功执行操作:完整:1.393 秒,转换:0.001

方法 02 成功执行操作:完整:1.502 秒,转换:0.021

方法 03 成功执行操作:完整:1.709 秒,转换:0.015

海滩标记代码在这里:- https://github.com/idthusitha/ride-test


查看完整回答
反对 回复 2023-09-27
  • 2 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信