এখানে একটি খুব দ্রুত সমাধান যা রানটাইম স্থিতিশীল জেনেরিক ক্লাসের একাধিক উদাহরণ তৈরি করে ab আপনার অভ্যন্তরীণ অপ্টিমাইজেশান ভূতগুলি মুক্ত করুন!
আপনি যখন জেনেরিক ফ্যাশনে একটি স্ট্রিম থেকে এনামস পড়ছেন তখন এটি সত্যিই জ্বলে ওঠে। একটি বহিরাগত শ্রেণীর সাথে একত্রিত করুন যা এনামের অন্তর্নিহিত ধরণের এবং বিটকনভার্টারটিকে দুর্দান্তভাবে ছাড়ানোর জন্য ক্যাশে করে।
void Main()
{
Console.WriteLine("Cast (reference): {0}", (TestEnum)5);
Console.WriteLine("EnumConverter: {0}", EnumConverter<TestEnum>.Convert(5));
Console.WriteLine("Enum.ToObject: {0}", Enum.ToObject(typeof(TestEnum), 5));
int iterations = 1000 * 1000 * 100;
Measure(iterations, "Cast (reference)", () => { var t = (TestEnum)5; });
Measure(iterations, "EnumConverter", () => EnumConverter<TestEnum>.Convert(5));
Measure(iterations, "Enum.ToObject", () => Enum.ToObject(typeof(TestEnum), 5));
}
static class EnumConverter<TEnum> where TEnum : struct, IConvertible
{
public static readonly Func<long, TEnum> Convert = GenerateConverter();
static Func<long, TEnum> GenerateConverter()
{
var parameter = Expression.Parameter(typeof(long));
var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
Expression.Convert(parameter, typeof(TEnum)),
parameter);
return dynamicMethod.Compile();
}
}
enum TestEnum
{
Value = 5
}
static void Measure(int repetitions, string what, Action action)
{
action();
var total = Stopwatch.StartNew();
for (int i = 0; i < repetitions; i++)
{
action();
}
Console.WriteLine("{0}: {1}", what, total.Elapsed);
}
কোর i7-3740QM- এ অপটিমাইজেশন সক্ষম সহ ফলাফলগুলি সক্ষম হয়েছে:
Cast (reference): Value
EnumConverter: Value
Enum.ToObject: Value
Cast (reference): 00:00:00.3175615
EnumConverter: 00:00:00.4335949
Enum.ToObject: 00:00:14.3396366