C# リフレクション MethodInfo型をRuntimeMethodHandleに変換しメモリ使用量を節約する
MethodInfo型オブジェクトをメモリに載せておくよりは、MethodInfoオブジェクトをRuntimeMethodHandleに変換してメモリに保持しておくほうが、メモリ使用量を節約できる。
using System; using System.Reflection; using System.Collections.Generic; public sealed class Program { public static void Main() { Console.WriteLine("メモリ使用量の初期値: {0}[B]", GC.GetTotalMemory(true)); List<MethodInfo> methodInfos = new List<MethodInfo>(); ; //たくさんのMethodInfoオブジェクトをListに格納する Module m = typeof(String).Module; foreach (Type t in m.GetTypes()) { methodInfos.AddRange(t.GetMethods()); } Console.WriteLine("MethodInfoをたくさんListに格納後のメモリ使用量: {0}[B]", GC.GetTotalMemory(true)); List<RuntimeMethodHandle> methodHandles = methodInfos.ConvertAll<RuntimeMethodHandle>( delegate(MethodInfo mi) { return mi.MethodHandle; }); GC.KeepAlive(methodInfos); methodInfos = null;//GCを可能にする Console.WriteLine("MethodInfoをRuntimeMethodHandleに変換後のメモリ使用量: {0}[B]", GC.GetTotalMemory(true)); } }
メモリ使用量の初期値: 171932[B] MethodInfoをたくさんListに格納後のメモリ使用量: 5079172[B] MethodInfoをRuntimeMethodHandleに変換後のメモリ使用量: 360628[B]