我听说过很多关于Linq表达式性能的事情。但我没办法亲自检查。请看下一个.NET核心应用示例:
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)
{
}
}当我使用未注释的表达式版本运行此代码时,代码的运行速度会慢10倍。请告诉我哪里可能是错误的,或者它是如预期的。
发布于 2020-04-03 02:03:03
一个简单的基准测试显示了有趣的结果。持续时间以毫秒为单位。
我只想分享我得到的结果。看起来DynamicInvoke真的有很大的开销(正如@ivan-stoev指出的那样)
我将添加具有强类型lambda的.Invoke解决方案和实现简单实例化接口的Roslyn编译的具体类的结果。
ConstructorInfo被缓存,编译后的lambda表达式也被缓存。
对于每个1000万次迭代:(每个方法有1亿次实例化)
---------------------------------------------------------------------------
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
---------------------------------------------------------------------------https://stackoverflow.com/questions/60997173
复制相似问题