.NETアプリケーションのメモリ使用量を減らすためのヒントは何ですか?次の単純なC#プログラムについて考えてみます。
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
タスクマネージャーは、x64のリリースモードでコンパイルされ、Visual Studioの外部で実行され、次のように報告します。
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
x86専用にコンパイルされている場合は少し優れています。
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
次に、次のプログラムを試しましたが、同じことを行いますが、実行時の初期化後にプロセスサイズをトリミングしようとします。
class Program
{
static void Main(string[] args)
{
minimizeMemory();
Console.ReadLine();
}
private static void minimizeMemory()
{
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
(UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetProcessWorkingSetSize(IntPtr process,
UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
}
Visual Studio外のx86 リリースの結果:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
これは少し良いですが、そのような単純なプログラムではまだ過剰に見えます。C#プロセスを少しスリムにするコツはありますか?ほとんどの場合バックグラウンドで実行するように設計されたプログラムを書いています。私はすでに別のアプリケーションドメインでユーザーインターフェイスを実行しています。つまり、ユーザーインターフェイスは安全にアンロードできますが、バックグラウンドに置かれているだけで10 MBを消費することは過剰に思えます。
PSなぜ私が気にするのか---(パワー)ユーザーはこれらのことを心配する傾向があります。パフォーマンスにほとんど影響がないとしても、セミテクノロジーに精通しているユーザー(私の対象読者)は、バックグラウンドアプリケーションのメモリ使用量について、ひどく当てはまる傾向があります。Adobe Updaterが11 MBのメモリを使用していて、Foobar2000の落ち着いたタッチに癒されているのを見ると、私はさらに驚かされます。現代のオペレーティングシステムでは、このことは技術的にそれほど重要ではありませんが、知覚に影響がないという意味ではありません。