首页 > 解决方案 > 带参数调用类时的C#反射性能比较

问题描述

我听说过很多关于 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 倍。请告知可能出现的问题或符合预期。

标签: c#performancereflectionlinq-expressions

解决方案


一个简单的基准测试显示了有趣的结果。持续时间以毫秒为单位。

我只是想分享我得到的结果。似乎 DynamicInvoke 确实有很大的开销(正如@ivan-stoev 指出的那样)

我将为.Invoke具有强类型 lambda 的解决方案和 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


---------------------------------------------------------------------------

推荐阅读