我将使用一个相对较大的数据集(约 10,000 个条目),该数据集会不断读取(每隔几秒就会读取大多数数据)并偶尔写入。通过将所有这些信息分成 block (通过,让我们说一个名称,因为它们不是唯一的)或者只是将所有内容放入一张 map 中并从中读取,是否可以获得性能优势?性能确实很重要。例如:
private HashMap<String, ObjectInformation> map = new HashMap<>();
public ObjectInformation imitateOperation(String query) {
return map.get(query);
}
对比
private HashMap<String, HashMap<String, ObjectInformation>> map = new HashMap<>();
public ObjectInformation imitateOperation(String name, String query) {
return map.get(name).get(query);
}
谢谢。
最佳答案
从 HashMap 读取速度很快,并且只要键具有唯一的哈希值,并不真正依赖于 HashMap 的大小。
至于良好的平衡 HashMap 访问时间始终是 O(1) - 除非所有键都具有相同的哈希码。
您可以使用调试器检查 HashMap 是否没有很多哈希冲突,如果有,则使用自定义哈希代码实现将键包装到某个自己的对象中 - 但编写好的 HashMap 并不容易,它需要大量的工作测试。您可能不需要它,只需保留那张 map 即可。
而且 10 000 并不是什么大事,性能有多重要? 1ms 对你来说很多吗?因为这可能已经快了几个数量级。
就像这里其他人所说的:
1. 首先检查代码是否是您的性能目标的瓶颈。您可以使用探查器或一些自定义计时统计来执行此操作。
2. 然后创建基准来确认这一点并准确测量需要多长时间。
3. 测试您正在考虑的解决方案是否确实能够缩短基准测试时间。您可以再次使用分析器来查看代码的哪一点最慢。
关于java - 通过将映射拆分为 block 来提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59857360/