4

最小ヒープを表すために動的配列を使用しています。最小値を削除し、何らかの条件が発生するまで最小ヒープにランダムな要素を追加するループがあります。実行時にヒープの長さがどのように変化するかはわかりませんが(ランダム性が高い)、上限である1,000万はわかっています。私には2つの選択肢があります:

1) mallocを使用して小さな配列を宣言し、ヒープ内の要素の数が長さを超えたときにreallocを呼び出します。

2) mallocを使用して1,000万のエントリ配列を宣言します。これにより、reallocを呼び出す必要がなくなります。

質問

オプション2はオプション1よりも効率的ですか?

私はこれを自分のコードでテストしましたが、2を使用すると実行時間が大幅に(20%)減少するようです。これはコードのランダム性のために推定されます。事前にmallocを使用して1,000〜5,000万の大規模なエントリ配列を宣言することに欠点はありますか?

4

3 に答える 3

6

メモリを節約して大規模な事前割り当てを行うことができ、それによって価値のあるパフォーマンスの向上が得られる場合は、必ずそれを実行してください。

に固執する場合realloc、一定量ずつ増やすのではなく、毎回サイズを2倍にすると、パフォーマンスと効率的なメモリ使用量の間で適切なトレードオフが得られる場合があります。

于 2012-12-11T17:14:23.380 に答える
4

realloc を使用すると、同じ場所からメモリが拡張されるとは限りません。また、別の領域にメモリが移動する場合もあります。
そのため、 realloc を使用すると、以前に持っていたメモリのチャックがコピーされる場合があります。
また、システム コールにはオーバーヘッドがかかる可能性があるため、malloc を一度呼び出すことをお勧めします。

于 2012-12-11T18:29:41.143 に答える
2

欠点は、そのスペースをすべて使用していない場合、必要になる可能性のある大量のメモリを使用していることです。必要なバイト数が正確にわかっている場合は、システムコールのオーバーヘッドが原因で、一度に割り当てる方が効率的です。次に、1つずつ割り当てます。通常、上限はありますが、正確な数はわかりません。上限を処理するためにスペースをmallocするのに時間がかかると、1秒かかる場合があります。ただし、この特定のケースに上限の半分しかない場合は、1つずつ割り当てるのに0.75秒かかる場合があります。ですから、それはあなたが得ようとしていると思う上限にどれだけ近いかによります。

于 2012-12-11T17:15:33.727 に答える