Оптимизация компилятора делегата C # - PullRequest
8 голосов
/ 02 июня 2010

Я начал часто использовать анонимных делегатов в C #, и мне стало интересно, насколько эффективен компилятор или среда выполнения для их удаления из кода, который фактически выполняется, и я нигде не видел этого подробно?

Достаточно ли умен, чтобы встроить их и свернуть рекурсивное использование, которое может быть выведено статически?

Ответы [ 3 ]

3 голосов
/ 02 июня 2010

Нет, компилятор C # не будет оптимизировать лямбда-выражение во встроенный код. Анонимные делегаты и лямбда-выражения всегда создают соответствующий делегат или дерево выражений. Это описано в разделе 6.5 спецификации языка C #

Выражение анонимного метода или лямбда-выражения классифицируется как анонимная функция (§7.14). Выражение не имеет типа, но может быть неявно преобразовано в совместимый тип делегата или тип дерева выражений

В некоторых случаях лямбда будет кэшироваться и не будет воссоздана для будущего использования. Но он не будет встроен.

2 голосов
/ 02 июня 2010

Компилятор C # никогда не оптимизирует их. Однако компилятор .NET JIT может, если они достаточно просты.

2 голосов
/ 02 июня 2010

В большинстве случаев нет.

Однако, если вы не заметили фактические проблемы с производительностью и не обнаружили их в профилировщике, вам не стоит об этом беспокоиться.

...