我有以下控制器:
@GetMapping("/v1/quotes")
public List<MyQuote> getQuotes() {
return hazelcastMap.values().stream()
.map(r -> new Quote(r))
.collect(Collectors.toList());
}
这大约需要330毫秒,但我需要改进它以在100毫秒或更短的时间内执行请求。
任何想法如何提高性能?
答案 0 :(得分:1)
人们普遍认为,流的效率比带有迭代器和/或循环的老式方法低。但是您不可能从中获得300 +%的改善。如果您要转换常规的内存Map
,则可能会提高10%或20%。对于Hazelcast IMap
,使用流与优化代码的开销将是微不足道的。
(您应该能够通过应用程序的性能分析和仔细的基准测试来验证这一点。)
我认为您将必须在系统设计中解决此问题,或者可能需要通过Hazelcast调整来解决。
IMap
javadoc暗示了您当前正在执行的一些性能问题:
Collection<V> values()
返回此映射中包含的值的集合克隆。
警告:地图不支持集合,因此对地图的更改不会反映在集合中,反之亦然。
此方法始终由分布式查询执行,因此,如果配置了GroupProperty.QUERY_RESULT_SIZE_LIMIT,它可能会引发QueryResultSizeExceededException。
问题是:
调用values()
时,IMap
实现将创建地图值的副本。然后,您将从该副本中流式传输,而不是直接从IMap
中流式传输。
values()
操作正在执行分布式查询。我怀疑这是不可避免的。无论哪种方式,这都可能是您所做工作中最昂贵的部分。
答案 1 :(得分:0)
您正在使用什么序列化?所有数据都需要进行序列化,这可能会对性能产生重大影响。就空间和时间而言,Java序列化通常是最糟糕的。 IdentifiedDataSerializable通常是性能最好的。