我已经听到很多有关Linq Expression性能的信息。但是我自己无法检查。请看下一个.NET Core应用示例:
class Program
{
static void Main(string[] args)
{
var classType = Type.GetType("ConsoleApp1.TestClass");
var classConstructor = classType.GetConstructor(new[] { typeof(string) });
//var param = Expression.Parameter(typeof(string));
//var newExpression = Expression.New(classConstructor, param);
//LambdaExpression lambda = Expression.Lambda(newExpression, param);
//var compiled = lambda.Compile();
//var instance = compiled.DynamicInvoke("test");
//var instance = Activator.CreateInstance(classType, "test");
//var instance = classConstructor.Invoke(new object[] { "test" });
Console.ReadLine();
}
}
class TestClass
{
public TestClass(string param)
{
}
}
当我在不注释Expression版本的情况下运行此代码时,代码的运行速度会慢10倍。请告知可能是错误的还是预期的错误。
一个简单的基准显示有趣的结果。持续时间以毫秒为单位。
请不要拒绝投票。我只是想分享我得到的结果。好像DynamicInvoke确实有很大的开销(如@ ivan-stoev所指出的)
我将为带有强类型的lambda的.Invoke
解决方案和实现简单实例化接口的Roslyn编译具体类添加结果。
ConstructorInfo
被缓存,编译的lambda表达式也被缓存。
[每次重复一千万次:
---------------------------------------------------------------------------
Benchmark Results:
---------------------------------------------------------------------------
Activator Constructor Compiled Lambda
---------------------------------------------------------------------------
Totals : 8121,2488 3067,6226 9353,8141
Average: 0,00081212488 0,00030676226 0,00093538141
Maximum: 922,5987 450,7662 1046,3734
Minimum: 0 0 0
---------------------------------------------------------------------------