3

ファイルから一連の入力を読み取って処理し、それを出力したいと考えています。データを保存するために使用する必要がある 3 つのキーがあります。3つのキーがk1, k2, k3

次のうち、パフォーマンスが向上するのはどれか

$hash{k1}->{k2}->{k3} = $val;

また

$hash{"k1,k2,k3"} = $val;

以前の質問に対して、すべての perl ハッシュ キーが文字列として扱われるという回答を得ました。

4

3 に答える 3

5

大規模なデータセットを実際に扱っている場合を除き、よりクリーンなコードを生成する方を使用してください。私は間違っているかもしれませんが、これは時期尚早の最適化の悪臭を放っています。

そうでない場合、これは可能なキーの範囲に依存する可能性があります。k1順序付けが問題にならない場合は、キーのセットが最小でk3最大になるようにデータを並べ替えます。そうすれば、ハッシュで使用するメモリが少なくなると思います。データセットによっては、ハッシュのサイズを事前に設定するのが賢明な場合もあります (うまくいくと思います%hash = 100)。

どちらが速いかは、プロファイリングだけでわかります。両方を試してみてください。

$hash{k1}->{k2}-{k3}また、不要であることに注意してください。書くことができます$hash{k1}{k2}{k3}。逆参照は、角括弧または中括弧のいずれかの間で必要ありません。

于 2011-06-20T10:41:07.493 に答える
4

ハッシュ ルックアップの速度は、ハッシュ内のアイテムの数とは無関係であるため、ハッシュ ルックアップを 1 回だけ実行するバージョンは、ハッシュ ルックアップを 3 回実行するバージョンよりも高速に操作のハッシュ ルックアップ部分を実行します。ただし、一方、シングル ルックアップ バージョンでは、3 つのキーを結合キーとして使用する前に、それらを 1 つの文字列に連結する必要があります。この文字列が匿名の場合 (例: $hash{"$a,$b,$c"})、これにはおそらくメモリ割り当てなどの興味深い処理が含まれます。全体として、ほとんどの場合、1回のルックアップバージョンが3回のルックアップバージョンよりも高速になるように、連結が十分に高速であると予想しますが、あなたのケースでどちらが速いかを知る唯一の方法は、同じコードを両方のスタイルとベンチマークの違い。

ただし、他の皆さんがすでに言っているように、これは時期尚早で価値のないマイクロ最適化です。パフォーマンスの問題があることを知っていて (または、問題が進行中であり、近い将来問題が発生することを示す過去のパフォーマンス データがある場合) コードをプロファイリングして、ハッシュ ルックアップがパフォーマンスの原因であると判断した場合を除きます。問題、あなたはこれについて心配する時間を無駄にしています。ハッシュ ルックアップは高速です。これは実際のベンチマークではありませんが、次のとおりです。

$ time perl -e '$foo{bar} for 1 .. 1_000_000'
real    0m0.089s
user    0m0.088s
sys 0m0.000s

この些細な (そして、明らかに大きな欠陥のある) 例では、1 秒あたり約 1,100 万回のハッシュ ルックアップに相当する速度が得られました。あなたが質問をするのに費やした時間で、あなたのコンピューターは、数十億とは言わないまでも、数億回のハッシュ検索を行った可能性があります。

ハッシュ ルックアップは、アプリケーションで最も読みやすく保守しやすいスタイルで記述します。これを最適化して可能な限り高速にしようとすると、無駄なプログラマーの時間は、最適化で節約できる処理時間よりも桁違いに大きくなります。

于 2011-06-20T13:16:32.530 に答える
2

メモリに関する懸念がある場合はDevel::Size、開発の初期段階で CPAN を使用して、両方の選択肢のサイズを取得することをお勧めします。それ以外の場合は、親しみやすいものを使用してください。

于 2011-06-20T11:00:34.217 に答える