Информация об изменениях

Сообщение Re[5]: [Ann, c#7] local functions от 22.05.2015 18:01

Изменено 22.05.2015 18:03 Evgeny.Panasyuk

Здравствуйте, Sinix, Вы писали:

EP>>"итераторы/await" — это всё же не замыкания. Под замыканием я понимаю прежде все захват переменных из внешнего scope.

S>Ну да, переменные(параметры) в итераторах и ко сохраняются между вызовами MoveNext()

Из своего scope, а не из чужого. yield/await в C# это во сути rewrite отдельного метода целиков в класс-автомат, но захвата из внешнего scope там нет.

EP>>Вообще, под первыми замыканиями я имел в виду:

S>А, ну так анонимные делегаты и лямбды — эт одно и то же по большому счёту. Можно их по отдельности считать, тогда больше будет

Дополнительный синтаксис загромождающий язык.

EP>>А почему для лямбд это трудно, а для local functions нет? В чём разница? Лямбды завязаны на какое-то ABI jit'а?

S>Неа, потому что лямбды — это делегаты, их значение может меняться в рантайме.

В каком смысле? Что это даёт по сравнению с локальными функциями?

S>Локальные функции ничем не отличаются от вызова приватного метода, для них отдельных приседаний делать не надо.


Насколько я понял по форме отличий мало, отличаются реализации. Что мешает для старой формы сделать быструю реализацию?

S>Даже для замыканий емнип всё ок, невиртуальные вызовы могут быть заинлайнены. Надо проверять конечно, могу наврать.


Тут просто часто говорят что лямбды в C# медленные, постоянные аллокации и т.п. — по сути стоит выбор между удобством и скоростью — я вот и не понимаю почему их не оптимизировать в компиляторе, чтобы не было такой дилеммы там где её быть не должно.

EP>>Если исправят скорость лямбд, то от этого выиграет уже существующий код.

S>Там править нечего практически, стоимость уже сопоставима с вызовом без инлайнинга емнип. Где-то у меня был пример, надо будет найти.

А создание лямбды дорогое?
Здравствуйте, Sinix, Вы писали:

EP>>"итераторы/await" — это всё же не замыкания. Под замыканием я понимаю прежде все захват переменных из внешнего scope.

S>Ну да, переменные(параметры) в итераторах и ко сохраняются между вызовами MoveNext()

Из своего scope, а не из чужого. yield/await в C# это во сути rewrite отдельного метода целикоv в класс-автомат, но захвата из внешнего scope там нет.

EP>>Вообще, под первыми замыканиями я имел в виду:

S>А, ну так анонимные делегаты и лямбды — эт одно и то же по большому счёту. Можно их по отдельности считать, тогда больше будет

Дополнительный синтаксис загромождающий язык.

EP>>А почему для лямбд это трудно, а для local functions нет? В чём разница? Лямбды завязаны на какое-то ABI jit'а?

S>Неа, потому что лямбды — это делегаты, их значение может меняться в рантайме.

В каком смысле? Что это даёт по сравнению с локальными функциями?

S>Локальные функции ничем не отличаются от вызова приватного метода, для них отдельных приседаний делать не надо.


Насколько я понял по форме отличий мало, отличаются реализации. Что мешает для старой формы сделать быструю реализацию?

S>Даже для замыканий емнип всё ок, невиртуальные вызовы могут быть заинлайнены. Надо проверять конечно, могу наврать.


Тут просто часто говорят что лямбды в C# медленные, постоянные аллокации и т.п. — по сути стоит выбор между удобством и скоростью — я вот и не понимаю почему их не оптимизировать в компиляторе, чтобы не было такой дилеммы там где её быть не должно.

EP>>Если исправят скорость лямбд, то от этого выиграет уже существующий код.

S>Там править нечего практически, стоимость уже сопоставима с вызовом без инлайнинга емнип. Где-то у меня был пример, надо будет найти.

А создание лямбды дорогое?