Java 为什么在部署的环境中对Hashmap.containsKey()的调用比本地调用慢100倍?
相同的代码,相同的数据。HashMap有大约40K个条目,由字符串键入。已使用System.nanoTime()确定计时 本地:Java 为什么在部署的环境中对Hashmap.containsKey()的调用比本地调用慢100倍?,java,Java,相同的代码,相同的数据。HashMap有大约40K个条目,由字符串键入。已使用System.nanoTime()确定计时 本地: 2015-08-21 12:46:09,958 DEBUG PERFORMANCE_ISSUE:55 - containsKey took 44336 部署: 2015-08-21 11:17:43,901 DEBUG PERFORMANCE_ISSUE:55 - containsKey took 4657210 我正在考虑GC或交换,但正在寻找其他想法…您可以检
2015-08-21 12:46:09,958 DEBUG PERFORMANCE_ISSUE:55 - containsKey took 44336
部署:
2015-08-21 11:17:43,901 DEBUG PERFORMANCE_ISSUE:55 - containsKey took 4657210
我正在考虑GC或交换,但正在寻找其他想法…您可以检查以下内容:
- 如果两者都在同一硬件上运行。检查分配给JVM的内存。非常低的内存会导致很好的延迟
- 如果它们在不同的机器(硬件)上,则检查当前使用的内存和处理器是否会影响程序的运行时间
- 虽然这不应该是一个问题,但您也可以在这两种情况下检查java版本
- 孩子,我觉得自己很笨。这根本不是同一个代码。本地代码(fast)使用的是java.util.HashMap,由于我在这里不讨论的情况,部署的代码(slow)实际上以scala.collection.convert.Wrappers$MapWrapper结束
因此,在调用慢速算法之前将MapWrapper中的值复制到真实的HashMap中就解决了这个问题
无论如何,我感谢所有建议的答案。这是一个美好的社区。我很想删除这篇文章,但为了防止将来对其他人有所帮助,我会将其保留下来。你可以使用VisualVm分析GC这两个系统之间的区别是什么?这是一直较慢还是只是随机的?本地和部署环境的cofig有什么区别?你是如何进行计时的。顺便说一句,你可以有一个4毫秒抖动在你的系统没有GC。如果您没有裸机,操作系统可能会造成如此大的延迟。