我们有一个环境,每个用户可能会获得不同的html / js / css资源。我正在使用以下代码来压缩和传输java脚本资源:
public static byte[] compress(String str) throws IOException {
if (str == null || str.length() == 0) {
return null;
}
ByteArrayOutputStream obj=new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(obj);
gzip.write(str.getBytes("UTF-8"));
gzip.close();
return obj.toByteArray();
}
...
HttpServletResponse raw = response.raw();
raw.setBufferSize(file.length().intValue());
ServletOutputStream servletOutputStream = raw.getOutputStream();
servletOutputStream.write(compress(FileUtils.readFileToString(file)));
servletOutputStream.flush();
servletOutputStream.close();
...
使用chrome网络选项卡检查问题,300KB压缩数据的下载时间为2秒 - 这似乎不合理。 问题不在于带宽或码头本身,因为静态资源传输时间很快。
答案 0 :(得分:0)
不知道这是否是你瓶颈的根源,但我不会这样做:
raw.setBufferSize(file.length().intValue());
如果gzip压缩文件大约为300KB,那么您可以创建大于此值的响应缓冲区。当您传输静态内容时,您根本不需要大的响应缓冲区。
来自servlet javadoc:
设置响应正文的首选缓冲区大小。该 servlet容器将使用至少与大小一样大的缓冲区 请求。使用的实际缓冲区大小可以找到 getBufferSize。
更大的缓冲区允许在任何内容之前写入更多内容 实际发送,从而为servlet提供更多的设置时间 适当的状态代码和标题。较小的缓冲区减少 服务器内存加载并允许客户端开始更多地接收数据 快。