|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
Во многих языках есть клевые конструкции мета программирования, например в Rust/Nemerle(☦) макросы, в F# - провайдеры типов/выражения вычисления и т. д. Не так давно Боги сниспослали нам Source Generators Штука вроде крутая, хотелось бы понять, куда ее пристроить и как извлечь пользу. Предлагаю лучшим умам .NET`а в этом топике поразмышлять над этими вопросами. Сам пока надумал вот что. 1. Можно получить некоторый аналог шаблонов в С++, когда в основном коде некоторая бутафорская конструкция не вызывающая ошибку компиляции, но дающая информацию для генерации кода, например сведения о типах. Возможно выиграем в быстродействии. В F# например изначально существуют как женерики в стиле .NET, так и разворачивание шаблона в код, в стиле С++. 2. Можно сделать наконец то нормальный IoC контейнер, который на основании например Код: c# 1.
будет заменять такую мутоту с кешированием и всякими Reflection/ExpressonTree Код: c# 1.
на прямой вызов конструктора или что там в зависимости от скоупа правда пока не придумал, как красиво это сделать... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 17:33 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
Если непонятно ЕвгенийВ куда ее пристроить и как извлечь пользу. ЕвгенийВ разворачивание шаблона в код, в стиле С++. ЕвгенийВ будет заменять такую мутоту с кешированием и всякими Reflection/ExpressonTree ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2021, 19:43 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
fkthat ExpressionTree как раз и развернется в прямой вызов конструктора. Вообще вызов new constructor(... , в смысле выделения памяти, без действий описанных в конструкторе, довольно дешев и оптимизирован, но не бесплатен совсем. В лучшем случае, если собираем его через ExpressionTree и конструктор без параметров - получим delegate.Invoke(), а это несколько лишних callvirt, проход по InvocationList и т. д. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 11:01 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
new - где то раз в 20 быстрее вызова делегата ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 11:10 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
ЕвгенийВ new - где то раз в 20 быстрее вызова делегата Откуда именно такое число? Мне недавно пришлось оптимизировать вызов статик-метода через рефлекшн (рефлекшн - поскольку тип, у которого надо было вызывать метод, internal и в другой сборке, которая не моя). Самым оптимальным оказался вариант конструирования делегата на основе MethodInfo, и скорость вызова такого делегата оказалась практически эквивалентной непосредственному вызову метода. Если интересно - тест с бенчмарком и результаты здесь . ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 12:25 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Львиную долю вносит выполнение Next() и ToString(), особенно последний, поэтому время выполнения не различается в разы. Для замера именно времени вызова нужно максимально упростить Foo.Bar Код: c# 1.
И передавать в него константу. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 14:30 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
ЕвгенийВ Для замера именно времени вызова нужно максимально упростить Foo.Bar И передавать в него константу. В таком варианте бенчмарк-библиотека (стандартно, BenchmarkDotNet) не может измерить длительность прямого вызова метода, и выдает предупреждение Код: plaintext 1. 2. 3.
- видимо, в релизе (в debug-конфигурации запуск бенчмарков невозможен) происходит такая оптимизация, что фактически отсутствует сам вызов метода (IL не смотрел), и нужна какая-то минимальная нагрузка. Если из бенчмарка выкинуть Random, и передавать в метод всегда константу (0), но оставить возврат n.ToString, то картина остается примерно прежней: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 16:01 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
К черту бенчмарки, тут Stopwatch наше все :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 16:48 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Код: plaintext 1. 2. 3. 4.
Разницы вообще нет ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 22:22 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
fkthat, Что ты мерял? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2021, 23:24 |
|
Source Generators, варианты?
|
|||
---|---|---|---|
#18+
ЕвгенийВ fkthat, Что ты мерял? Вызов конструктора. Напрямую и через делегат полученный компиляцией Expression. Код вызовов выше. Одиночный вызов слишком быстрый чтобы снять метрики, поэтому измеряется 1024 вызова. Вызываемый класс: Код: c# 1. 2. 3.
Но вообще, я думаю, если в приложении приходится постоянно создавать миллионы объектов, то стоит задуматься о дизайне в целом. Применять что-нибудь типа flyweight pattern . ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2021, 08:09 |
|
|
start [/forum/topic.php?fid=20&tid=1398251]: |
0ms |
get settings: |
19ms |
get forum list: |
25ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
128ms |
get topic data: |
41ms |
get forum data: |
3ms |
get page messages: |
323ms |
get tp. blocked users: |
2ms |
others: | 324ms |
total: | 871ms |
0 / 0 |