x
Ага
x
Спасибо, буду дальше рыть
Dr. Friedrich
У нас в ришорпере для этого есть специальный smartlist или как-то так
Dr. Friedrich
У него особенность такая, что он — структура
Dr. Friedrich
И первые N элементов списка пакуются в эту структуру.
Dr. Friedrich
А остальные уже складываются в настоящий лист, если не влезают в структуру.
Dr. Friedrich
И это пофиксило овердофига memory traffic проблем.
Dr. Friedrich
Ну, разумеется, для тех случаев, когда у нас использовались листы длиной менее N элементов.
Dr. Friedrich
Да, понял. По духу ты правильно сказал :)
Dr. Friedrich
Спан считается безопасным потому, что у него баундс чеки.
Ayrat
У нас в ришорпере для этого есть специальный smartlist или как-то так
о, отличная идея. Внимание вопрос. Можно ли проверять на стаковерфлоу перед стакаллок? ну типа clr же знает начлао стака, знает текущий поинтер, можно перед стакаллоком убеждаться что он безопасный и если нет, сразу на хип?
Vasily
Интересно, как
Dr. Friedrich
Сходу нагуглился только вот этот страх: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.runtimehelpers.ensuresufficientexecutionstack
Dr. Friedrich
> Ensures that the remaining stack space is large enough to execute the average .NET Framework function. average 😂
Dr. Friedrich
Вообще, в том классе много интересных вещей
Dr. Friedrich
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.runtimehelpers.getobjectvalue?view=netcore-2.1
Dr. Friedrich
Нафига, интересно.
Ayrat
Вообще, в том классе много интересных вещей
EnsureSufficientExecutionStack походу в нативе реализован
Ayrat
в корефх его нет, а в сборке компайлерСервис только заголовочные файлы торчат
Ayrat
о, нашёл http://source.roslyn.io/#Microsoft.CodeAnalysis/InternalUtilities/StackGuard.cs,9be1606f7f7bdc17,references
Ayrat
а, не нашёл)))
Dr. Friedrich
EnsureSufficientExecutionStack походу в нативе реализован
Там все методы фуфлыжные, норм метода нету.
Dr. Friedrich
Ну, которому бы можно было передать количество памяти, например.
Ayrat
Там все методы фуфлыжные, норм метода нету.
кто ищет, тот всегда найдёт https://github.com/dotnet/coreclr/blob/af4ec7c89d0192ad14392da04e8c097da8ec9e48/src/vm/reflectioninvocation.cpp#L2055
Dr. Friedrich
> > plenty close enough for the purposes of this method
Ayrat
прям угарают в каждом методе
Ayrat
> > plenty close enough for the purposes of this method
и таки размеры удовлетворительного стака для этой функции захардкожены https://github.com/dotnet/coreclr/blob/7559844bbe9e4230217a9a9cf4be8a857531c8c8/src/vm/threads.cpp#L6698 128 * 1024 в x64 64 * 1024 в x86
Dr. Friedrich
А обычные гражданские его могут заюзать?
Дак свой напишите, это десяток строчек кода.
Dr. Friedrich
Вероятно, можно заюзать, если интеропишься с ReSharper SDK.
Dr. Friedrich
Но в бизнес-коде это несложно самому реализовать
Dr. Friedrich
Тут ещё желательно по своему коду иметь статистику — насколько много у вас коротких списков из N элементов
Dr. Friedrich
И под это подгонять структуру
Ayrat
100?
Dr. Friedrich
Щас скажу. Эта инфа в общем-то публичная, на митапах рассказывалось
Dr. Friedrich
100?
Щас будешь смеяться.
Dr. Friedrich
1 :)
Ayrat
воу воу воу
Ayrat
неожиданно капец
Ayrat
struct SmartList<T> { T value; List<T> OnHeap; .ctor(T[] arr) { if arr.Length = 1 then value = arr.[0] else OnHeap = arr.ToList() } }
Ayrat
сделано! :D
Bonart
сделано! :D
Нет-нет-нет, Дэвид Блейн. Индексатор хде?
Bonart
Итератор хде?
Ayrat
Нет-нет-нет, Дэвид Блейн. Индексатор хде?
Ну ладно-ладно)) вообще забавный юз-кейс, у меня пожалуй настолько коротких массиво мало
Bonart
Но тема хорошая, в плюсах так короткие строки оптимизируют
Ayrat
А вот это надо бы замерить
согласен. Это я не по приборам сказал, а по ощущениям
Bonart
Ну и конечно надо целую пачку методов ToSmartList() - без них оптимизация накроется
Ayrat
Ну и конечно надо целую пачку методов ToSmartList() - без них оптимизация накроется
рослином перед билдом подменять вызовы ToList() на ToSmartList()!
Ayrat
хотя я тут подумал. вот будь у меня например даже 5% списков единичной длины, то внедрив такую оптимизацию можно заметно (в пределах решарпера) сократить меморитраффик
Bonart
рослином перед билдом подменять вызовы ToList() на ToSmartList()!
Не проканает или будет весьма нетривиально, иначе первая же конвертация к интерфейсу сожрет все вкусности
Ayrat
т.е. это очень оправдано когда ты борешься аки лев за перформанс
Bonart
Решарпер само собой борется
Bonart
У нас хороший эффект давал переход к IIndexable - переставали плодиться лишние массивы в куче. Это было еще до ImmutableList
Dr. Friedrich
хотя я тут подумал. вот будь у меня например даже 5% списков единичной длины, то внедрив такую оптимизацию можно заметно (в пределах решарпера) сократить меморитраффик
Вроде я на митапе слышал, что у нас есть и смартлист чуть болеьшей длины (в пределах 4-5 элементов), но я не могу его найти :)
Romɑn
Когда хочешь в пайпы но не можешь
Romɑn
😱😱😱
Sergey
😱😱😱
Первоапрельская шутка не так далека от реальности была?)
x
открыл в райдере хеловорлд с эксерсизма, а оно так:
x
проект вроде простенький совсем
x
(дело происходит в линуксе)
x
или это широко известная фича?
Ayrat
или это широко известная фича?
я не понял в чём фича, но вижу задвоенные файлы в солюшн три
x
Да
Ayrat
Это фича?) Похожа на багу
x
Да
Ayrat
А, ну ладно.
x
Просто я вежливый очень