Pull to refresh

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();

Динамичный метод не быстрее ли будет?

Нет. Динамический метод еще неудобный, вероятность ошибки выше и требуются знания как работает IL.
Деревья выражений компилятся в тот же динамический метод, но затем все это попадает в анонимную сборку (Assembly) для выполнения в «песочнице», что имеет оверхед. Отсюда вывод, что все-таки сгенерированный на IL код быстрее. С помощью BenchmarkDotNet можно написать тесты и увидеть разницу.
>Отсюда вывод, что все-таки сгенерированный на IL код быстрее
Что быстрее чего? Динамический метод быстрее динамического метода?
>для выполнения в «песочнице», что имеет оверхед
Ну вот тут бы не помешала ссылка на документацию.
Статья Сергея Теплякова в его майкрософт блоге. Статья затрагивает кодогенерацию и есть тесты производительности как раз с примером генерации динамического метода через деревья выражений и «руками». Отличается тем, что руками можно указать к какому типу привязать новый метод и сделать его таким образом доверенным — в отличие от деревьев выражений, где компиляция в динамический метод не дает такой возможности и метод создается в анонимной сборке, выполнение которой происходит в песочнице, что в свою очередь приводит к оверхеду. Проверка безопасности здесь логична, ведь метод анонимный и надо проверять куда и к кому Вы в теле метода обращаетесь (например надо проверить не обращаетесь ли Вы к методам, модификаторы доступа которых запрещают Вам это делать из чужой сборки/класса — internal/private и т.д.).
сгенерированный на IL код быстрее. С помощью BenchmarkDotNet можно написать тесты и увидеть разницу.

Сделано.
По идее, Expression.* достаточно плотно привязаны к C#\VB.NET. Если автор ставит себе задачу создать собсвтенный язык программирования, то используя Expression он получит скорее транспайлер.
Sign up to leave a comment.

Articles