Performance Improvements in .NET 5
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.07.20 16:31
Оценка: 21 (3)
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/

Думал, что 3.1 это потолок, но и в .Net 5 нехило докрутили

Ну и для ARM64
https://devblogs.microsoft.com/dotnet/arm64-performance-in-net-5/
и солнце б утром не вставало, когда бы не было меня
Отредактировано 03.09.2020 7:19 Serginio1 . Предыдущая версия .
Re: CollectionsMarshal.AsSpan
От: Qbit86 Кипр
Дата: 14.07.20 08:08
Оценка: 11 (2) +1

CollectionsMarshal.AsSpan (dotnet/coreclr#26867). This method gives callers span-based access to the backing store of a List<T>.


https://github.com/dotnet/runtime/blob/master/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/CollectionsMarshal.cs
Глаза у меня добрые, но рубашка — смирительная!
Re: GC.AllocateUninitializedArray<T>
От: Qbit86 Кипр
Дата: 14.07.20 09:41
Оценка: 9 (1)

using the Uninitialized variant lets the GC hand back arrays without forcefully clearing them (unless they contain references, in which case it must clear at least those)

Глаза у меня добрые, но рубашка — смирительная!
Re: Performance Improvements in .NET 5
От: Mihas  
Дата: 15.07.20 08:51
Оценка:
Здравствуйте, Serginio1, Вы писали:

Интересно, на сколько этот эффект распространяется не в сторону увеличения скорости выполнения задачи, а в сторону уменьшения ресурсов на эту же задачу?
На милипизерных виртуалочках?
На старых компах?
На какой-нибудь встройке?
Re[2]: Performance Improvements in .NET 5
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 15.07.20 10:51
Оценка: +1
Здравствуйте, Mihas, Вы писали:

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


M>Интересно, на сколько этот эффект распространяется не в сторону увеличения скорости выполнения задачи, а в сторону уменьшения ресурсов на эту же задачу?

M>На милипизерных виртуалочках?
M>На старых компах?
M>На какой-нибудь встройке?

Ну там приводится размер ассеблерного кода.
Который для .Net 5 значительно меньше.
Грядет эра IoT. К нему и готовятся. Плюс развивается CoreRT

Ну и Если .NET работает везде, то на Windows 3.11 и DOS тоже
и солнце б утром не вставало, когда бы не было меня
Re: Performance Improvements in .NET 5
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.07.20 11:20
Оценка: 22 (3) +3
Здравствуйте, Serginio1, Вы писали:
S>Думал, что 3.1 это потолок, но и в .Net 5 нехило докрутили
Да какой там потолок — там ещё копать и копать.
Та же tiered compilation — детский лепет.
Ну или вот лично меня, к примеру, оскорбляет то, что один и тот же MSIL оптимизируется по-разному, будучи зачитан в сборке с диска, и будучи запихан в динамически сгенерированный код (неважно, через dynamic method или TypeBuilder).
Это зарубает целый класс оптимизаций — вот мы берём какой-то DSL, из которого порождаем дотнетовый код на лету. Динамическое построение как раз призвано сделать его быстрым — потому что иначе можно просто нагенерировать C# код для самого общего случая. И вот мы типа делаем частичные вычисления и ручную специализацию. Вначале — на примерах типа 2*2 — всё хорошо; а потом хлоп! И порождаемый код вместо 60% времени работы неоптимизированного аналога начинает тратить 170%.

Понятно, что можно пооптимизировать порождаемый MSIL, но какого, простите, хрена?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Performance Improvements in .NET 5
От: Ночной Смотрящий Россия  
Дата: 15.07.20 12:08
Оценка:
Здравствуйте, Mihas, Вы писали:

M>Интересно, на сколько этот эффект распространяется не в сторону увеличения скорости выполнения задачи, а в сторону уменьшения ресурсов на эту же задачу?


Какой эффект? Там по ссылке большая статья с целой кучей разнородных изменений. Какие то изменения влияют и на потребление ресурсов — устранение проверок, оптимизация GC, тип half и т.п. Примеры по ссылке есть.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Performance Improvements in .NET 5
От: Sharov Россия  
Дата: 21.07.20 14:13
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

S>>Думал, что 3.1 это потолок, но и в .Net 5 нехило докрутили
S>Да какой там потолок — там ещё копать и копать.
S>Та же tiered compilation — детский лепет.
S>Ну или вот лично меня, к примеру, оскорбляет то, что один и тот же MSIL оптимизируется по-разному, будучи зачитан в сборке с диска, и будучи запихан в динамически сгенерированный код (неважно, через dynamic method или TypeBuilder).
S>Это зарубает целый класс оптимизаций — вот мы берём какой-то DSL, из которого порождаем дотнетовый код на лету. Динамическое построение как раз призвано сделать его быстрым — потому что иначе можно просто нагенерировать C# код для самого общего случая. И вот мы типа делаем частичные вычисления и ручную специализацию. Вначале — на примерах типа 2*2 — всё хорошо; а потом хлоп! И порождаемый код вместо 60% времени работы неоптимизированного аналога начинает тратить 170%.

А CLR или DRL за этот код отвечает? По идее CLR, но видать не все так просто...
Кодом людям нужно помогать!
Re[2]: Performance Improvements in .NET 5
От: Mystic Artifact  
Дата: 21.07.20 14:47
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Да какой там потолок — там ещё копать и копать.

S>Та же tiered compilation — детский лепет.
Вроде как и классная штука, но блин, это издевательство. Tier-0 часто не инлайнит даже простые геттеры, а к тому моменту когда наступит Tier-1 консольная утилита уже всё сделала.
Inlining Analyzer в студии тоже тоже судя по всему получает выхлоп от tier-0, и фактически врёт о возможности инлайнинга.
Re[2]: GC.AllocateUninitializedArray<T>
От: Mystic Artifact  
Дата: 21.07.20 20:38
Оценка: 77 (2) +1
Здравствуйте, Qbit86, Вы писали:

Q>

using the Uninitialized variant lets the GC hand back arrays without forcefully clearing them (unless they contain references, in which case it must clear at least those)

Это конечно же отлично, вот только как держали за дебилов пользователей рантайма — так и держат.
Да, сейчас, уже в 3.1 можно сделать полный не ущербный аналог List<T> (раньше ведь и того нельзя было), благодаря доступному публично System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences<T>. Но, практика создавать неуниверсальные решения — по прежнему тут. Span из стандартного List? На кой она нахрен сдалась вообще, если это сделано как специальный случай? Что делать владельцам других коллекций? Т.е. пока один разрыв устранен — с т.з. API (usability, ага) — добавляем новый разрыв. Т.е. решения — костыли, а не фундаментальные решения которые работают одинаково хорошо для всех. И такого — там очень много (в плане эксплуатации знания о внутренностях, но их невозможно повторить в отдельно стоящей библиотеки, без форка рантайма). Ну ладно, там этого не так и много, но там это есть. Мне (лично) привычнее видеть когда всё "честно" (например в C++).

Со структурами это вообще прикол — теперь вообще невозможно понять когда будет создана "defensive copy" кроме как анализ IL (а ещё лучше выхлопа JIT, но для того что бы добраться до него, нужно приседаний поболее). Тем не менее всё, что произошло со структурами — это супер. Теперь, их наконец-то можно использовать как poor-man врапперы которые не стоят практически ничего. Но, с точки зрения диагностики возможных проблем — это кошмарчик. Работающих анализаторов просто на данный момент не существует (я про из коробки). Поэтому, по прежнему, ридонли предпочтительно. Введение кстати readonly-методов работы со структурами это кстати класс — позволяет делать структуру враппер как с возможностью записи так и без неё. Это, реально супер — т.к. избавляет от необходимости дублирования. У меня востребовано. Но, опять же — а почему методы класса не могут быть такими? Почему, вопреки документации get автопроперти не становятся автоматически ридонли? И наконец — а компилятор, не видит сам, кто здесь ридонли...?

Это, я к чему — работы там — непаханное болото. Очень классно, что оно активно сдвигается, но как по мне GC.AllocateUninitializedArray и подобные вещи на этом фоне — меркнут. Да, они позволяют делать легально некоторые вещи, но в то же время, ArrayPool это же самое не использует? Более того, провоцирует возвращать очищенные массивы в пул. А оно надо? Да, есть параметр. Но, это именно вывернутый вопрос наизнанку, т.к. сейчас любая библиотека может вернуть как очищенный так и не очищенный буффер в него. Это инфраструктурный фейл. Нам впарили фичу которая не нужна, и нам дали инструмент который может дать обойти фичу которая нам не нужна. Но из коробки, инструмента который бы оперировал понятным образом (т.е. поведение не варировалось бы от левой пятки имплементации сторонних библиотек) — нет, что ставит под сомнение адекватность этого API. (Т.е. если ты очень хочешь получить чистый буффер — то не должен использовать пул, или использовать свой пул, на их же основе и возвращать туда только чистые буфера... — т.е. если бы стандартный пул возвращал всегда не очищенные буфера — ничего бы не произошло, код на основании тех же конвенций при необходимости мог бы его очищать...) Да, да. Имхо, подобного там много.

Тут, я конечно в целом высыпал какой-то несвязанный негатив, прошу прощения. Вообще — в целом — я очень доволен тем, что оно развивается просто семимильными шагами, по сравнению с тем как было.

PS: Вот — жду нормальных указателей на функции. — вроде скоро должны появиться. Врапить указатели в делегаты и кешировать, это нормально и так, но если можно без этого... ух!
Re[3]: Performance Improvements in .NET 5
От: rameel https://github.com/rsdn/CodeJam
Дата: 21.07.20 23:15
Оценка: 17 (3)
Здравствуйте, Mystic Artifact, Вы писали:

S>>Та же tiered compilation — детский лепет.

MA> Вроде как и классная штука, но блин, это издевательство. Tier-0 часто не инлайнит даже простые геттеры, а к тому моменту когда наступит Tier-1 консольная утилита уже всё сделала.

Для консольных можно отключить, если это так важно
<PropertyGroup>
    <TieredCompilation>false</TieredCompilation>
</PropertyGroup>
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[4]: Performance Improvements in .NET 5
От: Mystic Artifact  
Дата: 22.07.20 00:02
Оценка:
Здравствуйте, rameel, Вы писали:

R>Для консольных можно отключить, если это так важно

R>
R><PropertyGroup>
R>    <TieredCompilation>false</TieredCompilation>
R></PropertyGroup>    
R>


Спасибо. Я вроде как и вкурсе, но вчера пока баловался с COMPlus_* параметрами, не видел разницы изучая выхлоп джита. Скорее всего было поздно и я что-то напутал.
Re: Performance Improvements in .NET 5
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.07.20 08:17
Оценка: 2 (1)
Вот еще ссылочка на статьи про улучшения Performance
https://devblogs.microsoft.com/dotnet/announcing-net-5-0-preview-7/
и солнце б утром не вставало, когда бы не было меня
Re[3]: GC.AllocateUninitializedArray<T>
От: Mystic Artifact  
Дата: 22.07.20 22:57
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA> Это, я к чему — работы там — непаханное болото. Очень классно, что оно активно сдвигается, но как по мне GC.AllocateUninitializedArray и подобные вещи на этом фоне — меркнут. Да, они позволяют делать легально некоторые вещи, но в то же время, ArrayPool это же самое не использует? Более того, провоцирует возвращать очищенные массивы в пул. А оно надо? Да, есть параметр. Но, это именно вывернутый вопрос наизнанку, т.к. сейчас любая библиотека может вернуть как очищенный так и не очищенный буффер в него. Это инфраструктурный фейл. Нам впарили фичу которая не нужна, и нам дали инструмент который может дать обойти фичу которая нам не нужна. ...


В .NET 5 ArrayPool уже использует GC.AllocateUninitializedArray и при возврате буфера, по умолчанию он не очищается (как и в 3.1). Надо быть аккуратнее с заявлениями.
Отредактировано 22.07.2020 22:58 Mystic Artifact . Предыдущая версия .
Re[4]: GC.AllocateUninitializedArray<T>
От: Mystic Artifact  
Дата: 24.07.20 14:20
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

И тем не менее, нашел что запутало
Неинициализированные массивы используются в ArrayPool.Shared, но пул возвращаемый ч/з ArrayPool.Create — на сейчас (net5.0-preview8) — использует обычное создание массива. То ли недосмотр, то ли баг.
Re: ARM64 Performance in .NET 5
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.09.20 07:20
Оценка: +1
https://devblogs.microsoft.com/dotnet/arm64-performance-in-net-5/
и солнце б утром не вставало, когда бы не было меня
Re[2]: про ARM64 плюс добавили NEON для Vector
От: VladCore  
Дата: 09.09.20 01:15
Оценка: 5 (1)
Здравствуйте, Serginio1, Вы писали:

про ARM64 там не всё

Еще добавили поддержку NEON-инструкций (типа SSE+AVX) для Vector и Vector<T>

ссылку не помню.
Отредактировано 09.09.2020 4:33 VladCore . Предыдущая версия .
Re[4]: GC.AllocateUninitializedArray<T>
От: Codealot Земля  
Дата: 09.09.20 02:26
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>> Это, я к чему — работы там — непаханное болото. Очень классно, что оно активно сдвигается, но как по мне GC.AllocateUninitializedArray и подобные вещи на этом фоне — меркнут. Да, они позволяют делать легально некоторые вещи, но в то же время, ArrayPool это же самое не использует? Более того, провоцирует возвращать очищенные массивы в пул. А оно надо? Да, есть параметр. Но, это именно вывернутый вопрос наизнанку, т.к. сейчас любая библиотека может вернуть как очищенный так и не очищенный буффер в него. Это инфраструктурный фейл. Нам впарили фичу которая не нужна, и нам дали инструмент который может дать обойти фичу которая нам не нужна. ...


MA> В .NET 5 ArrayPool уже использует GC.AllocateUninitializedArray и при возврате буфера, по умолчанию он не очищается (как и в 3.1). Надо быть аккуратнее с заявлениями.


Хм. Ты сам с собой споришь?
Ад пуст, все бесы здесь.
Re[5]: GC.AllocateUninitializedArray<T>
От: Mystic Artifact  
Дата: 19.09.20 20:53
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Хм. Ты сам с собой споришь?


Нет, просто даю уточнения по написанному. А так же хочу сказать, что куча мест в фреймворке не использует неинициализированные массивы ни пулы для буферов в очевидных местах. Ровно как и дефолтные реализации некоторых новых методов ради совместимости вызывают глубокое сомнение в адекватности происшедшего (напрмер Stream::Read(Span<byte>)).

Ну и если вернуться к ArrayPool — то Shared он шарится по TLS (что нихера не всегда оптимально), а ConfigurableArrayPool — не использует неинициализированные массивы, но причин на это нет.
Отредактировано 19.09.2020 20:57 Mystic Artifact . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.