繁体   English   中英

从 socket 和 inputStream 读取慢

[英]Slow reading from socket and inputStream

我使用 java.net.Socket 在我的应用程序中接收消息。 接收非常慢。 接收 250 kB 持续超过 7 秒。 我能做些什么来加速这一点。 7秒太多了...

InputStream is = null;
byte[] arr = new byte[8192];
try {
    is = client.getInputStream();
} catch (IOException e) {
    e.printStackTrace();
}

int bytesNumber;
StringBuffer sb = new StringBuffer();

try {
    while ((bytesNumber = is.read(arr)) >= 0) {
        if (bytesNumber == 8192) {
            sb.append(arr);
            continue;
        } else {
            for (int i = 0; i < bytesNumber; i++) {
                sb.append(arr[i]);
            }
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

这是因为如果您读取的内容少于缓冲区 (arr) 长度,您将一个一个地附加一个字符。 改为附加整个缓冲区内容,不需要 if:

sb.append(arr,0,butesNumber);

正如 tinker 所提到的,通常最大的限制是客户端和服务器网络。 但是你可以大大简化你所拥有的。 另外,在我看来,您的 8K 缓冲区大小太小了。 除非您有严重的内存限制,否则请使用 1M 或更大的内存。

public String readClient(Client client) throws IOException{
    final int bufferSize = 1024 << 9;

    BufferedInputStream in = new BufferedInputStream(client.getInputStream(),bufferSize);
    byte[] bytes = new byte[bufferSize];
    int bytesRead;
    StringBuilder sb = new StringBuilder(bufferSize);
    try {
        while ((bytesRead = in.read(bytes)) != -1) {
            sb.append(new String(bytes, 0, bytesRead));
        }
    }finally {
        in.close();
    }
    return sb.toString();
}

这种糟糕的性能不太可能是由于您的代码造成的。 在相同的系统之间使用curl或类似的东西可以获得什么样的性能?

更大的问题是你的代码不太可能做你想做的事。 当前,您将字节数组的表示形式附加到字符串,或将字节的十进制表示形式附加到该字符串。 如果服务器发送“Hello, World!”,您最终会得到一个字符串“7210110810811144328711111410810033”。 对于较长的文件,您会看到类似“[B@76c5a2f7”的内容弹出,这就是字节数组的打印方式。

我会这样写,假设您正在接收使用 UTF-8 编码的文本:

CharArrayWriter str = new CharArrayWriter();
try (InputStream is = client.getInputStream()) {
  Reader r = new InputStreamReader(is, StandardCharsets.UTF_8);
  char[] buffer = new char[8192];
  while (true) {
    int n = r.read(buffer);
    if (n < 0)
      break;
    str.write(buffer, 0, n);
  }
}
System.out.println(str);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM