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 
+# FastGenericNew   
-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.