Я знаю 1 способ создать объекта в C#:
public static class ObjectCreator
{
public static T GetObject
Есть ли более производительные?
Update класс с известными способами:
public class ObjectCreator
protected Func
public ObjectCreator()
{
Type sType = typeof(T);
//V4
V4Lambda = Expression.Lambda
//V5
V5Lambda = DynamicModuleLambdaCompiler.GenerateFactory
public T V1()
{
return (T)Activator.CreateInstance(typeof(T));
}
public T V2()
{
return new T();
}
public T V3()
{
return CustomActivator.CreateInstance
public T V4()
{
return V4Lambda();
}
public T V5()
{
return V5Lambda();
}
}
public static class CustomActivator
{
public static T CreateInstance
private class ActivatorImpl
public static readonly Func
public static class DynamicModuleLambdaCompiler
{
public static Func
var method = new DynamicMethod(
name: "lambda",
returnType: newExpr.Type,
parameterTypes: new Type[0],
m: typeof(DynamicModuleLambdaCompiler).Module,
skipVisibility: true);
ILGenerator ilGen = method.GetILGenerator();
// Constructor for value types could be null
if (newExpr.Constructor != null)
{
ilGen.Emit(OpCodes.Newobj, newExpr.Constructor);
}
else
{
LocalBuilder temp = ilGen.DeclareLocal(newExpr.Type);
ilGen.Emit(OpCodes.Ldloca, temp);
ilGen.Emit(OpCodes.Initobj, newExpr.Type);
ilGen.Emit(OpCodes.Ldloc, temp);
}
ilGen.Emit(OpCodes.Ret);
return (Func
Результаты моего тестирования:
Ответ
В следующих статьях Сергея Теплякова
Исследуем new() ограничение в C#
Dissecting the new() constraint in C#: a perfect example of a leaky abstraction
делается вывод, что самый быстрый способ создания объекта - это распарсить лямбду в выражение и скомпилировать его:
public static class DynamicModuleLambdaCompiler
{
public static Func
var method = new DynamicMethod(
name: "lambda",
returnType: newExpr.Type,
parameterTypes: new Type[0],
m: typeof(DynamicModuleLambdaCompiler).Module,
skipVisibility: true);
ILGenerator ilGen = method.GetILGenerator();
// Constructor for value types could be null
if (newExpr.Constructor != null)
{
ilGen.Emit(OpCodes.Newobj, newExpr.Constructor);
}
else
{
LocalBuilder temp = ilGen.DeclareLocal(newExpr.Type);
ilGen.Emit(OpCodes.Ldloca, temp);
ilGen.Emit(OpCodes.Initobj, newExpr.Type);
ilGen.Emit(OpCodes.Ldloc, temp);
}
ilGen.Emit(OpCodes.Ret);
return (Func
public static class FastActivator
Method | Mean | StdDev | Gen 0 |
------------------------ |----------- |---------- |------- |
ActivatorCreateInstance | 95.0161 ns | 1.0861 ns | 0.0005 |
FuncBasedFactory | 6.5741 ns | 0.0608 ns | 0.0034 |
FastActivator_T_Create | 5.1715 ns | 0.0466 ns | 0.0034 |
Комментариев нет:
Отправить комментарий