java - 通过将映射拆分为 block 来提高性能

标签 java performance

我将使用一个相对较大的数据集(约 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/

相关文章:

java - 为什么 commons-lang 不在 java 标准 API 中?

java - 如何使用 PDFBox 的 PDFPagePanel 查看 PDF 文档

选项卡上的 java actionlistener

c# - JIT 优化 : Why Is It Slow and How Can I Improve It?

java - 当应用程序关闭时 putExtra 到 Service 类停止

java - 如何在 Kotlin 中向 Gson 注册一个 InstanceCreator?

performance - 批处理大量文件-是存储在内存中还是先写入磁盘?

c++ - 如何优化 C++ avr 代码

java - 计算多个登录和注销 session

mysql - 具有多个 OR 的慢速 INNER JOIN