2011-01-04 8 views
1

私は私が私場合FreeHGlobalIntPtr(AllocHGlobal)を毎回割り当てる/解放する方が良いでしょうか?

が優れている呼び出す関数の最後に、私は私が頻繁に使用する機能(おそらく30回各秒)に(常に同じ大きさの)AllocHGlobalを使用する状況をしましたAllocHGlobalで割り当てられたメモリの部分を保持し、Disposeクラスを呼び出すたびに解放するか、関数を呼び出すたびにalloc/freeする必要がありますか?私は、このメモリは、C#でどのように動作するか分からない

、それは私のために、「新しい世界」だ

+0

@Mitch:ヒープグローバル割り当てはガベージコレクションの対象ではないため、メモリ内で割り当てを移動することは何もないという意味で「固定」されています。 (カーネルを除いて、VMMはそれを透過的に処理します。) – cdhowie

答えて

0

あなたは限りこれを行うことができます。必要なメモリの量が常に少ない

  • あなたの割り当てのサイズよりも大きいか等しい。
  • メソッドは、一度に複数のスレッドから呼び出されるわけではありません。
  • このメソッドは再入可能ではありません。
  • メモリが不要になったら、メモリを解放してください。 (すなわち、ポインタが非静的なクラスフィールドに保存されている場合、クラスはIDisposableを実装し、Dispose()メソッドはメモリを解放する必要があります。もちろん、クラスのコンシューマはDispose()をコールするか、using(){}ブロックを使用する必要があります。)

しかし、P/Invoke呼び出しの実際のマーシャリングがボトルネックになる可能性は非常に高いです。実際にコードを実際にプロファイリングしたことがありますか、またはマイクロ最適化していますか?

+0

実際にコードは正常に動作しますが、消費量の多いジョブではテストしませんでした。問題を回避していました...テストします。 **編集:**まあ、私はたくさんの**メモリ(300MB)を浪費していますが、問題はBitmapのクローニングによるものだと思います。別のテストのためにもう一度待ちます –

+0

解決済み、コードの一部にゴミを入れないでください。私はそれを最適化し、今は1バイトを浪費しません(私はいつもWinFormで約28 MBですが、それは良いと思います)、 –

2

30秒は永遠です。 FreeHGlobalを確実にリリースするためにfinallyブロックに入れるほうがずっと簡単です。ファイナライザやIDisposableソングやダンスをする必要からあなたを救う。まあ、クライアントのコード。

ヒープチャーンによるキャッシュの優先順位は、ミリ秒の範囲になるまで償却を開始しません。

+0

(または* sub * -millisecondの範囲)でAllocHGlobalを保存しなければなりません –

+0

彼は「30秒」または「30回/秒」と言ったのですか?「後者でさえ、最近かなりの時間を費やすのに十分な時間ですが、30秒間で完全に無意味になる最適化の考慮事項が正当化され始めます。 –

1

パフォーマンスに関する質問と同様に、まずクリーンコードを作成し、必要なものを測定して最適化します。

あなたのオブジェクトが複数のスレッドで使用されることはないと確信している場合(つまり、問題の関数を同時に呼び出す)、割り当てられたメモリをキャッシュするのは問題ありません。

ガベージコレクションに依存してメモリのブロックされていないブロックをキャッシュする場合は、メモリを十分早く解放するだけでは不十分です。アンマネージメモリ(AllocHGlobal)は、CLRに割り当てられたメモリに対してカウントされないため、オブジェクトのガベージコレクションが遅延する可能性があります。 IDisposableを実装し、適切に使用する必要があります。

+0

ありがとうございます。私のlibが最初の試行で、バグなく作業したような巧妙な方法で書く...私は本当にうれしく、初めて起こる:P)。複数のスレッドの問題...私はこれについて考えるべきだ –

関連する問題