YuhanKun / FastGenericNew

Faster alternative of Activator.CreateInstance and new T()

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FastGenericNew Tests

The ultimate fast alternative to Activator.CreateInstance<T> / new T()

Features

  • A way better CreateInstance

    • Up to 50x faster than Activator.CreateInstance<T>
    • Generic Parameters Support
    • Non-Public Constructor Support
    • Zero boxing/unboxing
    • No Generic Constraints
    • TryGetValue-like TryFastNew API
    • Link Mode PublishTrimmed Support
  • Modern Compiler Integration

    • Source Generator v2 (Incremental Generator)
    • Highly Configurable (Props)
    • Multi-threaded Generation
  • Lastest C# Features Support

Installation

You can only use one of them

Pre-Compiled Version

dotnet add package FastGenericNew --version 3.0.0-preview1
<ItemGroup>
  <PackageReference Include="FastGenericNew" Version="3.0.0-preview1" />
</ItemGroup>

SourceGenerator Version

dotnet add package FastGenericNew.SourceGenerator --version 3.0.0-preview1
<ItemGroup>
  <PackageReference Include="FastGenericNew.SourceGenerator" Version="3.0.0-preview1" />
</ItemGroup>

.NET Standard 2.0 & C# 8.0 or above is required for SourceGenerator version

Examples

using FastGenericNew;

FastNew.CreateInstance<T>();

// With parameter(s)
FastNew.CreateInstance<T, string>("text");
FastNew.CreateInstance<T, string, int>("text", 0);

// Try 
if (FastNew.TryCreateInstance<T, string>("arg0", out T result));
{
    // ...
}

Notes

With .NET Framework, Activator.CreateInstance<T>() invokes the parameterless constructor of ValueType if
the constraint is where T : new() but appears to ignore the parameterless constructor if the constraint is where T : struct.
But FastNew.CreateInstance<T>() will always invoke the parameterless constructor if it's available.

If you don't want to invoke the parameterless constructor of ValueType.
Consider to use FastNew.NewOrDefault<T>() which will never invoke the parameterless constructor of ValueType

Benchmark

Environment

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.22000
AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores
.NET SDK=6.0.200-preview.22055.15
  [Host]             : .NET 6.0.2 (6.0.222.6406), X64 RyuJIT
  .NET 5.0           : .NET 5.0.14 (5.0.1422.5710), X64 RyuJIT
  .NET 6.0           : .NET 6.0.2 (6.0.222.6406), X64 RyuJIT
  .NET Framework 4.8 : .NET Framework 4.8 (4.8.4470.0), X64 RyuJIT

Reference Types

Benchmark Result of Reference Types

Value Types

Benchmark Result of Value Types

License

FastGenericNew is licensed under the MIT license.

About

Faster alternative of Activator.CreateInstance and new T()

License:MIT License


Languages

Language:C# 98.4%Language:PowerShell 1.6%