SetProcessWorkingSetSizeとWindowsForms
NyaRuRuさんも自身の日記で何度か採り上げていたSetProcessWorkingSetSize(hProcess, -1, -1)によるワーキングセットの縮小指示だが、WindowsFormsアプリケーションにてこのAPIを呼ぶにはどのタイミングで呼ぶのが効果的なのだろう。(ベストの性能を期待するには使わないのがベストなのだろうが...)
このAPIはWindowsに対して対象プロセスのワーキング セットを最小サイズに縮めるように指示するが、呼び出しが早すぎるとWindowsによって縮められたページはアプリケーションにより再びロードされてしまうし、逆に呼び出しが遅すぎると未使用のページをリサイクルできなくなってしまう。
現時点では以下のようなメソッドをForm#ActivatedとForm#Deactivateで呼び出しているが
public static void TrimingWorkingSet() { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { Process proc = Process.GetCurrentProcess(); SetProcessWorkingSetSize(proc.Handle, new IntPtr(-1L), new IntPtr(-1L)); } } [DllImport("kernel32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SetProcessWorkingSetSize(IntPtr procHandle, IntPtr min, IntPtr max);
これが(このタイミングが)ベストだという根拠が全く無いのが嫌だ。