Comments 10
В 2017 году уже разрешено использовать Expression вместо DynamicMethod.
var x = 13;
var y = 12;
var sum = Expression.Lambda<Func<int>>
(
Expression.Add
(
Expression.Constant(x),
Expression.Constant(y)
)
).Compile().Invoke();
+4
Динамичный метод не быстрее ли будет?
0
Нет. Динамический метод еще неудобный, вероятность ошибки выше и требуются знания как работает IL.
0
Деревья выражений компилятся в тот же динамический метод, но затем все это попадает в анонимную сборку (Assembly) для выполнения в «песочнице», что имеет оверхед. Отсюда вывод, что все-таки сгенерированный на IL код быстрее. С помощью BenchmarkDotNet можно написать тесты и увидеть разницу.
0
>Отсюда вывод, что все-таки сгенерированный на IL код быстрее
Что быстрее чего? Динамический метод быстрее динамического метода?
>для выполнения в «песочнице», что имеет оверхед
Ну вот тут бы не помешала ссылка на документацию.
Что быстрее чего? Динамический метод быстрее динамического метода?
>для выполнения в «песочнице», что имеет оверхед
Ну вот тут бы не помешала ссылка на документацию.
0
Статья Сергея Теплякова в его майкрософт блоге. Статья затрагивает кодогенерацию и есть тесты производительности как раз с примером генерации динамического метода через деревья выражений и «руками». Отличается тем, что руками можно указать к какому типу привязать новый метод и сделать его таким образом доверенным — в отличие от деревьев выражений, где компиляция в динамический метод не дает такой возможности и метод создается в анонимной сборке, выполнение которой происходит в песочнице, что в свою очередь приводит к оверхеду. Проверка безопасности здесь логична, ведь метод анонимный и надо проверять куда и к кому Вы в теле метода обращаетесь (например надо проверить не обращаетесь ли Вы к методам, модификаторы доступа которых запрещают Вам это делать из чужой сборки/класса — internal/private и т.д.).
0
По идее, Expression.* достаточно плотно привязаны к C#\VB.NET. Если автор ставит себе задачу создать собсвтенный язык программирования, то используя Expression он получит скорее транспайлер.
+1
del, промахнулся
-1
Мде, 2017 год.
https://habrahabr.ru/sandbox/107626/
0
Sign up to leave a comment.
Сам себе Microsoft