[调用带有参数的类时的C#反射性能比较

问题描述 投票:0回答:1

我已经听到很多有关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# performance reflection linq-expressions
1个回答
0
投票

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

请不要拒绝投票。我只是想分享我得到的结果。好像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


---------------------------------------------------------------------------
© www.soinside.com 2019 - 2024. All rights reserved.