ListのTがクラスか構造体かでメモリ使用量が大きく異なる?
そんなことはないだろうと思ったが、気になったので試してみた。
ListにAddし続けてOutOfMemoryがでるタイミングを見てみたがやっぱり大きな差はなかった。
[ListにクラスをAddし続けた場合]
・開始時点
プライベートメモリ使用量: 30MB
物理メモリ使用量: 41MB
仮想メモリ使用量: 621MB
・終了時点
プライベートメモリ使用量: 6,297MB
物理メモリ使用量: 882MB
仮想メモリ使用量: 6,870MB
[Listに構造体をAddし続けた場合]
・開始時点
プライベートメモリ使用量: 30MB
物理メモリ使用量: 41MB
仮想メモリ使用量: 613MB
・終了時点
プライベートメモリ使用量: 6,289MB
物理メモリ使用量: 955MB
仮想メモリ使用量: 6,862MB
以下、テストで使用したコード
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace MemoryCheck { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { const string title = "ListにクラスをAddし続けた場合"; // 自プロセスを取得 var process = System.Diagnostics.Process.GetCurrentProcess(); var list = new List<TestClass>(); using (var sw = new System.IO.StreamWriter(process.ProcessName + "_" + title + ".txt")) { try { sw.WriteLine(title); sw.WriteLine("プロセスID: {0}", process.Id); sw.WriteLine("プロセス名: {0}", process.ProcessName); int count = 1; while (true) { sw.WriteLine("Count = {0}", count++); WriteMemoryLog(process, sw); var data = new TestClass(); data.Init(); list.Add(data); sw.WriteLine(); } } catch (Exception ex) { sw.WriteLine(); sw.WriteLine(ex.ToString()); this.Close(); } } } private void button2_Click(object sender, EventArgs e) { const string title = "Listに構造体をAddし続けた場合"; // 自プロセスを取得 var process = System.Diagnostics.Process.GetCurrentProcess(); var list = new List<TestStruct>(); using (var sw = new System.IO.StreamWriter(process.ProcessName + "_" + title + ".txt")) { try { sw.WriteLine(title); sw.WriteLine("プロセスID: {0}", process.Id); sw.WriteLine("プロセス名: {0}", process.ProcessName); int count = 1; while (true) { sw.WriteLine("Count = {0}", count++); WriteMemoryLog(process, sw); var data = new TestStruct(); data.Init(); list.Add(data); sw.WriteLine(); } } catch (Exception ex) { sw.WriteLine(); sw.WriteLine(ex.ToString()); this.Close(); } } } private void WriteMemoryLog(System.Diagnostics.Process process, System.IO.StreamWriter sw) { // リフレッシュしないとプロセスの各種情報が最新情報に更新されない process.Refresh(); // 各種プロセス情報を出力する const int mb = 1024 * 1024; sw.WriteLine("プライベートメモリ使用量: {0:#,0}MB", process.PrivateMemorySize64 / mb); sw.WriteLine("物理メモリ使用量: {0:#,0}MB", process.WorkingSet64 / mb); sw.WriteLine("仮想メモリ使用量: {0:#,0}MB", process.VirtualMemorySize64 / mb); sw.Flush(); } } [StructLayout(LayoutKind.Sequential, Size = 4)] public struct TestStruct { // 1MBの配列 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024 * 1024)] public byte[] array01; public void Init() { array01 = new byte[1024 * 1024]; } } public class TestClass { // 1MBの配列 public byte[] array01; public void Init() { array01 = new byte[1024 * 1024]; } } }