你好堆栈溢出社区。我正在使用Spring boot,它对我来说工作正常,但是当涉及到“大型”数据集时,它变得非常慢,让我向您展示一个示例代码:
@GetMapping("/get/some/example/data/{lines}")
public ResponseEntity<String> getTestData(@PathVariable("lines") long lines) {
StringBuilder stringBuilder = new StringBuilder();
for(int i=0; i<lines; i++){
stringBuilder.append("...very long string here...");
}
return ResponseEntity.ok(stringBuilder.toString());
}
好的,您看到的只是一个非常简单的rest控制器,用于生成动态大小的响应。想象一下stringBuilder.append()中的字符串是500个字符或更多。
现在,让浏览器调用此端点,并使用chrome的DevTools(F12)观察结果:
响应标题:
内容编码:gzip
内容类型:text / html; charset = UTF-8
传输编码:分块
变化:接受编码
线路= 100的呼叫端点:
行的呼叫端点= 1000:
让我们比较那些结果。好的,由于gzip压缩,资源大小不精确十倍。但是我的问题是响应时间。10倍的数据需要377ms和210800ms。这意味着要花费10倍的数据,则需要花费559倍的时间。
您可以看到没有数据库连接,也没有复杂的代码。具有1000次迭代的for循环花费不到5毫秒,因此问题出在幕后或在HTTP中。您能否帮助我理解为什么大量数据确实会对性能产生如此大的影响。您能否帮忙找到解决方案以缩短响应时间。
另外,您可以在标题中看到MIME类型“ Content-Type:text / html”,将其更改为application / json时,速度更快,但仍然不快。
另请参阅此处的请求标头:接受:text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp,image / apng,/ ; q = 0.8,application / signed-exchange; v = b3 ; q = 0.9
接受编码:gzip,deflate,br
接受语言:de-DE,de; q = 0.9,es-VE; q = 0.8,es; q = 0.7,en-US; q = 0.6,en; q = 0.5
缓存控制:无缓存
连接:保持活动状态
主机:localhost:8080
语法:无缓存
安全提取模式:导航
安全提取站点:无
安全提取用户:?1
不安全升级请求:1
用户代理:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,如Gecko)
Chrome / 79.0.3945.130 Safari / 537.36
依赖项:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.0.RELEASE</version>
...
我非常感谢您的任何提示和建议。
我只是发现根本没有性能问题。我刚刚安装了Postman,以检查是否相同。不,不是这样,Postman和Firefox DevTools都告诉我,这非常快。出于某种原因,我最喜欢的浏览器chrome正在降低大数据的速度。信不信由你,Firefox和chrome对14.41 MB的响应相同的请求在firefox和chrome上大约需要223毫秒,而在chrome上则大约需要23000毫秒...但这仅适用于开放式构建工具,因此当您观看
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句