มีเคล็ดลับอะไรบ้างในการลดการใช้หน่วยความจำของแอปพลิเคชัน. 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);
}
ผลลัพธ์บนx86 Releaseภายนอก Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
ซึ่งดีกว่าเล็กน้อย แต่ก็ยังดูเหมือนมากเกินไปสำหรับโปรแกรมง่ายๆเช่นนี้ มีเทคนิคใดบ้างที่จะทำให้กระบวนการ C # มีขนาดเล็กลงหรือไม่? ฉันกำลังเขียนโปรแกรมที่ออกแบบมาให้ทำงานอยู่เบื้องหลังเกือบตลอดเวลา ฉันกำลังทำสิ่งต่างๆของอินเทอร์เฟซผู้ใช้ในApplication Domainแยกต่างหากซึ่งหมายความว่าสามารถยกเลิกการโหลดเนื้อหาส่วนติดต่อผู้ใช้ได้อย่างปลอดภัย แต่การใช้พื้นที่ 10 MB เมื่อนั่งอยู่เบื้องหลังดูเหมือนจะมากเกินไป
ปล.ทำไมฉันถึงสนใจผู้ใช้ --- (Power) มักจะกังวลกับสิ่งเหล่านี้ แม้ว่าจะแทบไม่มีผลกระทบต่อประสิทธิภาพ แต่ผู้ใช้กึ่งเทคโนโลยี (กลุ่มเป้าหมายของฉัน) มักจะรู้สึกแย่กับการใช้หน่วยความจำของแอปพลิเคชันพื้นหลัง แม้ว่าฉันจะรู้สึกประหลาดใจเมื่อเห็น Adobe Updater ใช้หน่วยความจำ 11 MB และรู้สึกผ่อนคลายด้วยสัมผัสที่เงียบสงบของ Foobar2000 ซึ่งอาจใช้เวลาน้อยกว่า 6 MB แม้ในขณะที่เล่น ฉันรู้ในระบบปฏิบัติการสมัยใหม่สิ่งนี้ไม่ได้มีความสำคัญมากนักในทางเทคนิค แต่ก็ไม่ได้หมายความว่ามันจะไม่มีผลต่อการรับรู้