7

以下のコードを使用して、実行中のプログラムのメモリを解放しています。これは、自分のプログラムを高速に実行するには大きなメモリ リソースが必要だからです。

[DllImport("psapi.dll")]
public static extern bool EmptyWorkingSet(IntPtr hProcess);

public FreeMem(string programName){

      EmptyWorkingSet(Process.GetCurrentProcess().Handle);
      foreach(Process process in Process.GetProcesses(programName))
      {
            try
            {
                EmptyWorkingSet(process.Handle);
            }
            catch (Exception)
            {
                ...
            }
      } 
}

正常に動作しているようです。エクスプローラーなどの一部のプログラムのメモリ使用量を 100,000 Kb から 2,000 Kb に下げることができました。それはかなり良いですが、これを行うことによる副作用はありますか? Yamicsoft Vista/Xp マネージャーや Firefox Optimizer などの一部の商用ソフトウェアもこれを使用しています。

4

2 に答える 2

2

副作用は他のプログラムのパフォーマンスにあると思います-システムはEmptyWorkingSet()、プロセスがページを必要とするときに、呼び出しによってスワップアウトされたページを元に戻します。

このような低レベルでシステムをいじることは危険をはらんでいます。特に、Explorer のページ フォールトによってシステムが遅くなり、奇妙なデッドロックが頭をもたげ始めるところまで行く可能性があります。特にあなたが書いていない他のプログラムについては、これをWindowsに任せるのが最善です。

自分のプログラムが大量のメモリを必要とする理由を理解しておくと、より効率的です。もしかして、どこかで漏れているのでしょうか?

于 2009-11-28T08:59:57.757 に答える
1

個人的には、私はこれに対処していません。ちょっと「危険」に思えます:P


いずれにせよ、役立つ記事がいくつあります。

于 2009-11-28T09:02:16.247 に答える