在Java中高效实现大型查找值

时间:2012-09-25 12:28:18

标签: java optimization hashmap

我有这个TCP / UDP端口号列表及其字符串描述:

http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

现在这是一个 HashMap的形式,其中portnumber为键,字符串描述为值 。它可能不是那么大,但我必须在数据包即将到来时实时查找端口描述,并且您可以想象,这需要有效的检索,否则会大大减慢处理速度。

最初我想过实现巨大的开关案例/中断逻辑或者如果,但是如果但这听起来太破旧了所以我想出了这个hashMap。

现在我想知道如果查询始终相同,Java是否有类似缓存机制的东西加速?像大多数查询端口将是80,443,23,22等,很少其他服务类型的数据包可能会到达。

我的选项:

  • 我应该做一些其他的 - 如果在一开始检查最多 常见类型,如果之前没有找到,则恢复到此hashMap

  • 我应该继续使用此hashMap来搜索我

  • 我应该回到其他一些聪明的方法吗?

请建议。

3 个答案:

答案 0 :(得分:4)

测量需要多长时间?我怀疑,与你正在做的其他事情相比,具有合理数量的桶的哈希映射中的查找将可忽略

一如既往地提出这些问题,在开始工作之前测量所谓的性能问题是非常值得的。 过早优化是所有邪恶的根源,如they say

答案 1 :(得分:3)

  

它大大减慢了处理速度。

查找HashMap通常需要大约50 ns。鉴于数据套接字读取数据通常需要10,000到20,000 ns,我怀疑这不是你认为的问题。

如果你想要快速查找使用数组,因为这可以更快。

String[] portToName = new String[65536];

答案 2 :(得分:2)

HashMap对get操作有一个保证的O(1)访问时间。从任何角度来看,你现在这样做的方式都是完美的。

维护if / else if结构在加速方面容易出错且无用(对于大型列表,它实际上会更糟,具有O(n)渐近时间)。