C# Сравнение производительности отражения при вызове класса с параметром - PullRequest
0 голосов
/ 02 апреля 2020

Я много слышал о производительности Linq Expression. Но не смог проверить это сам. Пожалуйста, взгляните на следующий пример. 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)
        {

        }
    }

Когда я запускаю этот код с некомментированной версией Expression, тогда код работает в 10 раз медленнее. Пожалуйста, посоветуйте, что может быть не так, или это как ожидалось.

1 Ответ

1 голос
/ 02 апреля 2020

Простой тест показывает интересные результаты. Продолжительность указана в миллисекундах.

Я просто хотел поделиться результатами, которые получил. Похоже, что DynamicInvoke действительно имеет большие накладные расходы (как указывал @ ivan-stoev)

Я добавлю результаты как для решения .Invoke со строго типизированной лямбдой, так и для класса скомпилированного бетона Roslyn, реализующего простой интерфейс для экземпляров.

ConstructorInfo кэшируется, как и скомпилированное лямбда-выражение.

Для 10 миллионов итераций каждая: (100 миллионов экземпляров для каждого метода)

---------------------------------------------------------------------------
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


---------------------------------------------------------------------------
...