diff --git a/Benchmark/Benchmark.csproj b/Benchmark/Benchmark.csproj index b847436..0c269a3 100644 --- a/Benchmark/Benchmark.csproj +++ b/Benchmark/Benchmark.csproj @@ -12,5 +12,4 @@ - diff --git a/Benchmark/Program.cs b/Benchmark/Program.cs index 1a0df29..d6235b2 100644 --- a/Benchmark/Program.cs +++ b/Benchmark/Program.cs @@ -7,7 +7,6 @@ class Program static void Main() { BenchmarkRunner.Run(); - } } } \ No newline at end of file diff --git a/FastGenericNew/ConstructorOf.cs b/FastGenericNew/ConstructorOf.cs index f136c23..3d51a18 100644 --- a/FastGenericNew/ConstructorOf.cs +++ b/FastGenericNew/ConstructorOf.cs @@ -125,4 +125,151 @@ public static class ConstructorOf + { + public static readonly ConstructorInfo value = + typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] + { + typeof(TParameter), + typeof(TParameter2), + typeof(TParameter3), + typeof(TParameter4), + typeof(TParameter5), + typeof(TParameter6), + typeof(TParameter7), + typeof(TParameter8), + typeof(TParameter9), + typeof(TParameter10), + }, null); + } + + public static class ConstructorOf + { + public static readonly ConstructorInfo value = + typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] + { + typeof(TParameter), + typeof(TParameter2), + typeof(TParameter3), + typeof(TParameter4), + typeof(TParameter5), + typeof(TParameter6), + typeof(TParameter7), + typeof(TParameter8), + typeof(TParameter9), + typeof(TParameter10), + typeof(TParameter11), + }, null); + } + + public static class ConstructorOf + { + public static readonly ConstructorInfo value = + typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] + { + typeof(TParameter), + typeof(TParameter2), + typeof(TParameter3), + typeof(TParameter4), + typeof(TParameter5), + typeof(TParameter6), + typeof(TParameter7), + typeof(TParameter8), + typeof(TParameter9), + typeof(TParameter10), + typeof(TParameter11), + typeof(TParameter12), + }, null); + } + + public static class ConstructorOf + { + public static readonly ConstructorInfo value = + typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] + { + typeof(TParameter), + typeof(TParameter2), + typeof(TParameter3), + typeof(TParameter4), + typeof(TParameter5), + typeof(TParameter6), + typeof(TParameter7), + typeof(TParameter8), + typeof(TParameter9), + typeof(TParameter10), + typeof(TParameter11), + typeof(TParameter12), + typeof(TParameter13), + }, null); + } + + public static class ConstructorOf + { + public static readonly ConstructorInfo value = + typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] + { + typeof(TParameter), + typeof(TParameter2), + typeof(TParameter3), + typeof(TParameter4), + typeof(TParameter5), + typeof(TParameter6), + typeof(TParameter7), + typeof(TParameter8), + typeof(TParameter9), + typeof(TParameter10), + typeof(TParameter11), + typeof(TParameter12), + typeof(TParameter13), + typeof(TParameter14), + }, null); + } + + public static class ConstructorOf + { + public static readonly ConstructorInfo value = + typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] + { + typeof(TParameter), + typeof(TParameter2), + typeof(TParameter3), + typeof(TParameter4), + typeof(TParameter5), + typeof(TParameter6), + typeof(TParameter7), + typeof(TParameter8), + typeof(TParameter9), + typeof(TParameter10), + typeof(TParameter11), + typeof(TParameter12), + typeof(TParameter13), + typeof(TParameter14), + typeof(TParameter15), + }, null); + } + + public static class ConstructorOf + { + public static readonly ConstructorInfo value = + typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] + { + typeof(TParameter), + typeof(TParameter2), + typeof(TParameter3), + typeof(TParameter4), + typeof(TParameter5), + typeof(TParameter6), + typeof(TParameter7), + typeof(TParameter8), + typeof(TParameter9), + typeof(TParameter10), + typeof(TParameter11), + typeof(TParameter12), + typeof(TParameter13), + typeof(TParameter14), + typeof(TParameter15), + typeof(TParameter16), + }, null); + } } diff --git a/FastGenericNew/FastGenericNew.csproj b/FastGenericNew/FastGenericNew.csproj index d299200..66c8066 100644 --- a/FastGenericNew/FastGenericNew.csproj +++ b/FastGenericNew/FastGenericNew.csproj @@ -1,15 +1,36 @@ - + netstandard2.0 - - + + Boring3.FastGenericNew + true + MIT + FastGenericNew is 10x times faster than new T() + Boring3 + https://github.com/BThree496/FastGenericNew + https://github.com/BThree496/FastGenericNew + meaninglessLogo.png + Performance, Generic, Fast, Expression, Optimization, DynamicMethod + 1.1.0.0 + 1.1.0.0 - + + + true + + + + + True + + + + \ No newline at end of file diff --git a/FastGenericNew/FastNew.cs b/FastGenericNew/FastNew.cs index 34ad33d..f78474b 100644 --- a/FastGenericNew/FastNew.cs +++ b/FastGenericNew/FastNew.cs @@ -6,8 +6,10 @@ namespace FastGenericNew { public static class FastNew { - public static readonly Func CreateInstance - = Expression.Lambda>(Expression.New(ConstructorOf.value)).Compile(); + public static readonly Func CreateInstance = + !typeof(T).IsValueType + ? Expression.Lambda>(Expression.New(ConstructorOf.value)).Compile() + : Expression.Lambda>(Expression.New(typeof(T))).Compile(); } public static class FastNew @@ -24,7 +26,6 @@ static FastNew() } } - public static class FastNew { public static readonly Func CreateInstance; @@ -40,7 +41,6 @@ static FastNew() } } - public static class FastNew { public static readonly Func CreateInstance; @@ -146,7 +146,8 @@ static FastNew() ParameterExpression parameter6 = Expression.Parameter(typeof(TParameter6)); ParameterExpression parameter7 = Expression.Parameter(typeof(TParameter7)); ParameterExpression parameter8 = Expression.Parameter(typeof(TParameter8)); - CreateInstance = Expression.Lambda>(Expression.New( + CreateInstance = Expression.Lambda>( + Expression.New( ConstructorOf.value, parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8), parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8).Compile(); @@ -174,4 +175,187 @@ static FastNew() parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9).Compile(); } } + + public static class FastNew + { + public static readonly Func CreateInstance; + + static FastNew() + { + ParameterExpression parameter1 = Expression.Parameter(typeof(TParameter)); + ParameterExpression parameter2 = Expression.Parameter(typeof(TParameter2)); + ParameterExpression parameter3 = Expression.Parameter(typeof(TParameter3)); + ParameterExpression parameter4 = Expression.Parameter(typeof(TParameter4)); + ParameterExpression parameter5 = Expression.Parameter(typeof(TParameter5)); + ParameterExpression parameter6 = Expression.Parameter(typeof(TParameter6)); + ParameterExpression parameter7 = Expression.Parameter(typeof(TParameter7)); + ParameterExpression parameter8 = Expression.Parameter(typeof(TParameter8)); + ParameterExpression parameter9 = Expression.Parameter(typeof(TParameter9)); + ParameterExpression parameter10 = Expression.Parameter(typeof(TParameter10)); + CreateInstance = Expression.Lambda>(Expression.New( + ConstructorOf.value, + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10), + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10).Compile(); + } + } + + + public static class FastNew + { + public static readonly Func CreateInstance; + + static FastNew() + { + ParameterExpression parameter1 = Expression.Parameter(typeof(TParameter)); + ParameterExpression parameter2 = Expression.Parameter(typeof(TParameter2)); + ParameterExpression parameter3 = Expression.Parameter(typeof(TParameter3)); + ParameterExpression parameter4 = Expression.Parameter(typeof(TParameter4)); + ParameterExpression parameter5 = Expression.Parameter(typeof(TParameter5)); + ParameterExpression parameter6 = Expression.Parameter(typeof(TParameter6)); + ParameterExpression parameter7 = Expression.Parameter(typeof(TParameter7)); + ParameterExpression parameter8 = Expression.Parameter(typeof(TParameter8)); + ParameterExpression parameter9 = Expression.Parameter(typeof(TParameter9)); + ParameterExpression parameter10 = Expression.Parameter(typeof(TParameter10)); + ParameterExpression parameter11 = Expression.Parameter(typeof(TParameter11)); + CreateInstance = Expression.Lambda>(Expression.New( + ConstructorOf.value, + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11), + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11).Compile(); + } + } + + public static class FastNew + { + public static readonly Func CreateInstance; + + static FastNew() + { + ParameterExpression parameter1 = Expression.Parameter(typeof(TParameter)); + ParameterExpression parameter2 = Expression.Parameter(typeof(TParameter2)); + ParameterExpression parameter3 = Expression.Parameter(typeof(TParameter3)); + ParameterExpression parameter4 = Expression.Parameter(typeof(TParameter4)); + ParameterExpression parameter5 = Expression.Parameter(typeof(TParameter5)); + ParameterExpression parameter6 = Expression.Parameter(typeof(TParameter6)); + ParameterExpression parameter7 = Expression.Parameter(typeof(TParameter7)); + ParameterExpression parameter8 = Expression.Parameter(typeof(TParameter8)); + ParameterExpression parameter9 = Expression.Parameter(typeof(TParameter9)); + ParameterExpression parameter10 = Expression.Parameter(typeof(TParameter10)); + ParameterExpression parameter11 = Expression.Parameter(typeof(TParameter11)); + ParameterExpression parameter12 = Expression.Parameter(typeof(TParameter12)); + CreateInstance = Expression.Lambda>(Expression.New( + ConstructorOf.value, + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12), + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12).Compile(); + } + } + + public static class FastNew + { + public static readonly Func CreateInstance; + + static FastNew() + { + ParameterExpression parameter1 = Expression.Parameter(typeof(TParameter)); + ParameterExpression parameter2 = Expression.Parameter(typeof(TParameter2)); + ParameterExpression parameter3 = Expression.Parameter(typeof(TParameter3)); + ParameterExpression parameter4 = Expression.Parameter(typeof(TParameter4)); + ParameterExpression parameter5 = Expression.Parameter(typeof(TParameter5)); + ParameterExpression parameter6 = Expression.Parameter(typeof(TParameter6)); + ParameterExpression parameter7 = Expression.Parameter(typeof(TParameter7)); + ParameterExpression parameter8 = Expression.Parameter(typeof(TParameter8)); + ParameterExpression parameter9 = Expression.Parameter(typeof(TParameter9)); + ParameterExpression parameter10 = Expression.Parameter(typeof(TParameter10)); + ParameterExpression parameter11 = Expression.Parameter(typeof(TParameter11)); + ParameterExpression parameter12 = Expression.Parameter(typeof(TParameter12)); + ParameterExpression parameter13 = Expression.Parameter(typeof(TParameter13)); + CreateInstance = Expression.Lambda>(Expression.New( + ConstructorOf.value, + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12, parameter13), + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12, parameter13).Compile(); + } + } + + public static class FastNew + { + public static readonly Func CreateInstance; + + static FastNew() + { + ParameterExpression parameter1 = Expression.Parameter(typeof(TParameter)); + ParameterExpression parameter2 = Expression.Parameter(typeof(TParameter2)); + ParameterExpression parameter3 = Expression.Parameter(typeof(TParameter3)); + ParameterExpression parameter4 = Expression.Parameter(typeof(TParameter4)); + ParameterExpression parameter5 = Expression.Parameter(typeof(TParameter5)); + ParameterExpression parameter6 = Expression.Parameter(typeof(TParameter6)); + ParameterExpression parameter7 = Expression.Parameter(typeof(TParameter7)); + ParameterExpression parameter8 = Expression.Parameter(typeof(TParameter8)); + ParameterExpression parameter9 = Expression.Parameter(typeof(TParameter9)); + ParameterExpression parameter10 = Expression.Parameter(typeof(TParameter10)); + ParameterExpression parameter11 = Expression.Parameter(typeof(TParameter11)); + ParameterExpression parameter12 = Expression.Parameter(typeof(TParameter12)); + ParameterExpression parameter13 = Expression.Parameter(typeof(TParameter13)); + ParameterExpression parameter14 = Expression.Parameter(typeof(TParameter14)); + CreateInstance = Expression.Lambda>(Expression.New( + ConstructorOf.value, + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12, parameter13, parameter14), + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12, parameter13, parameter14).Compile(); + } + } + + public static class FastNew + { + public static readonly Func CreateInstance; + + static FastNew() + { + ParameterExpression parameter1 = Expression.Parameter(typeof(TParameter)); + ParameterExpression parameter2 = Expression.Parameter(typeof(TParameter2)); + ParameterExpression parameter3 = Expression.Parameter(typeof(TParameter3)); + ParameterExpression parameter4 = Expression.Parameter(typeof(TParameter4)); + ParameterExpression parameter5 = Expression.Parameter(typeof(TParameter5)); + ParameterExpression parameter6 = Expression.Parameter(typeof(TParameter6)); + ParameterExpression parameter7 = Expression.Parameter(typeof(TParameter7)); + ParameterExpression parameter8 = Expression.Parameter(typeof(TParameter8)); + ParameterExpression parameter9 = Expression.Parameter(typeof(TParameter9)); + ParameterExpression parameter10 = Expression.Parameter(typeof(TParameter10)); + ParameterExpression parameter11 = Expression.Parameter(typeof(TParameter11)); + ParameterExpression parameter12 = Expression.Parameter(typeof(TParameter12)); + ParameterExpression parameter13 = Expression.Parameter(typeof(TParameter13)); + ParameterExpression parameter14 = Expression.Parameter(typeof(TParameter14)); + ParameterExpression parameter15 = Expression.Parameter(typeof(TParameter15)); + CreateInstance = Expression.Lambda>(Expression.New( + ConstructorOf.value, + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12, parameter13, parameter14, parameter15), + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12, parameter13, parameter14, parameter15).Compile(); + } + } + + public static class FastNew + { + public static readonly Func CreateInstance; + + static FastNew() + { + ParameterExpression parameter1 = Expression.Parameter(typeof(TParameter)); + ParameterExpression parameter2 = Expression.Parameter(typeof(TParameter2)); + ParameterExpression parameter3 = Expression.Parameter(typeof(TParameter3)); + ParameterExpression parameter4 = Expression.Parameter(typeof(TParameter4)); + ParameterExpression parameter5 = Expression.Parameter(typeof(TParameter5)); + ParameterExpression parameter6 = Expression.Parameter(typeof(TParameter6)); + ParameterExpression parameter7 = Expression.Parameter(typeof(TParameter7)); + ParameterExpression parameter8 = Expression.Parameter(typeof(TParameter8)); + ParameterExpression parameter9 = Expression.Parameter(typeof(TParameter9)); + ParameterExpression parameter10 = Expression.Parameter(typeof(TParameter10)); + ParameterExpression parameter11 = Expression.Parameter(typeof(TParameter11)); + ParameterExpression parameter12 = Expression.Parameter(typeof(TParameter12)); + ParameterExpression parameter13 = Expression.Parameter(typeof(TParameter13)); + ParameterExpression parameter14 = Expression.Parameter(typeof(TParameter14)); + ParameterExpression parameter15 = Expression.Parameter(typeof(TParameter15)); + ParameterExpression parameter16 = Expression.Parameter(typeof(TParameter16)); + CreateInstance = Expression.Lambda>(Expression.New( + ConstructorOf.value, + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12, parameter13, parameter14, parameter15, parameter16), + parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8, parameter9, parameter10, parameter11, parameter12, parameter13, parameter14, parameter15, parameter16).Compile(); + } + } } diff --git a/README.md b/README.md index 34de0ba..69db508 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,16 @@ -# FastGenericNew ![GitHub](https://img.shields.io/github/license/BThree496/FastGenericNew?style=flat-square) +# FastGenericNew ![GitHub](https://img.shields.io/github/license/BThree496/FastGenericNew?style=flat-square&logo=github) ![Nuget](https://img.shields.io/nuget/v/Boring3.FastGenericNew?style=flat-square&logo=nuget) ![Nuget](https://img.shields.io/nuget/dt/Boring3.FastGenericNew?style=flat-square&logo=nuget) -FastGenericNew is 10x times faster than `new T()` / `Activator.CreateInstance()` -Also with parameters support +FastGenericNew is 10x times faster than `Activator.CreateInstance()` / `new T()` -## Examples +## Features +--- + - Parameters Supported + - Non-Public Constructor Supported + - Zero box/unbox + - ValueType Supported +## Examples +--- Fast create instance of `T`: ```cs @@ -19,6 +25,7 @@ FastNew.CreateInstance("parameter", 0); ``` ## Benchmark +--- ```ini @@ -38,10 +45,11 @@ AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores | NewT | 33.332 ns | 0.3524 ns | 0.3296 ns | 14.74 | 0.16 | No | 0.0029 | - | - | 24 B | 88 B | ## How it works +--- Not like `Activator.CreateInstance()`. FastGenericNew will dynamic compile a method that return `T`. And cache it up by generic. You can invoke this method by a delegate with no any box/unbox. But there's still a little problem anyway. -.NET Runtime will not inline delegate in any case. So it cause more cost than direct new. +.NET Runtime will not inline delegate in any case currently. So it cause bit more costs than direct new.