C# リフレクション Type型をRuntimeTypeHandleに変換しメモリ使用量を節約する
Type型オブジェクトをメモリに載せておくよりは、TypeオブジェクトをRuntimeTypeHandleに変換してメモリに保持しておくほうが、メモリ使用量を節約できる。
using System; using System.Reflection; using System.Collections.Generic; public sealed class Program { public static void Main() { Console.WriteLine("メモリ使用量の初期値: {0}[B]", GC.GetTotalMemory(true)); //たくさんのTypeオブジェクトをListに格納する Module m = typeof(String).Module; List<Type> types = new List<Type>(); for (Int32 i = 0; i < 100; i++) { types.AddRange(m.GetTypes()); } Console.WriteLine("TypeオブジェクトをListに {0}個 格納後のメモリ使用量: {1}[B]", types.Count, GC.GetTotalMemory(true)); //TypeオブジェクトをRuntimeTypeHandleに変換する List<RuntimeTypeHandle> typeHandles = types.ConvertAll<RuntimeTypeHandle>( delegate(Type t) { return Type.GetTypeHandle(t); }); GC.KeepAlive(types); types = null;//typesはGC可能 Console.WriteLine("RuntimeTypeHandleに変換後のメモリ使用量: {0}[B]", GC.GetTotalMemory(true)); } }
思ったよりも効果がないような気がする。
メモリ使用量の初期値: 172004[B] TypeオブジェクトをListに 233900個 格納後のメモリ使用量: 1436412[B] RuntimeTypeHandleに変換後のメモリ使用量: 1174476[B]