1

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

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

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

最初我想实现巨大的 switch case/break 逻辑或者 if,else if 但是这听起来太破旧了,所以我想出了这个 hashMap。

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

我的选择:

  • 我是否应该在开始时对最常见的类型进行几次 else-if 检查,然后如果之前没有找到,则恢复到这个 hashMap

  • 我是否应该继续使用此 hashMap 为我进行搜索

  • 我应该恢复到其他一些聪明的方式吗?

请建议。

4

3 回答 3

4

测量过这需要多长时间吗?我怀疑与你正在做的任何其他事情相比,在具有合理数量的桶的哈希映射中查找将是微不足道的。

与这些问题一样,在处理之前测量假定的性能问题是非常值得的。正如他们所说,过早的优化是万恶之源。

于 2012-09-25T12:32:30.990 回答
4

它大大减慢了处理速度。

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

如果您想要真正快速查找,请使用数组,因为这样会更快。

String[] portToName = new String[65536];
于 2012-09-25T12:32:55.187 回答
2

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

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

于 2012-09-25T12:32:37.153 回答