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 には、取得操作の O(1) アクセス時間が保証されています。あなたが今やっているやり方は、どの観点から見ても完璧です。

if/else if 構造を維持すると、エラーが発生しやすくなり、高速化の点で役に立たなくなります (大きなリストの場合、O(n) 非同期時間では実際にはさらに悪化します)。

于 2012-09-25T12:32:37.153 に答える