Re[40]: MS забило на дотнет. Питону - да, сишарпу - нет?
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.09.21 11:30
Оценка:
Здравствуйте, vdimas, Вы писали:

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


V>На практике не нарываемся, если класс содержит только примитивные типы в полях.

V>Структуры в АПИ обычно идут по указателю, на стороне C# это ref для struct или просто классы по ссылке.
V>Маршаллер пинит экземпляры таких классов, вот и весь маршаллинг.
Плюс коррекция указателя. Ок.

V>Ограничений, считай, два всего:

V>- они могут располагаться только на стеке;
V>- не могут быть аргументами генериков.
Не могут реализовывать интерфейсы. Не могут использоваться в async методах или блоках итераторов.
V>Оба случая хорошо подходят под интероп.
Ну, получается их область действия ограничена тонким слоем интеропа, а общаться с прикладным кодом надо уже через классы или классические структуры.

V>>>В select в линухах подаются битовые массивы, поэтому stackalloc решает вопрос.

V>>>Длина битовых массивов идёт первым аргументом — как максимальный номер хендла.
S>>Ну это тривиальный частный случай. Как только мы встречаем что-то сложнее примитивного массива интов, начинаются танцы с бубном.

V>Такой же stackalloc начинается.

О, это интересно. То есть вы размечаете "структуру" в стеке как серию stackalloc? А есть гарантии их взаимного расположения?

V>Чтобы GC игнорировал стек нейтивных вызовов.

V>Т.е., возможна зебра вглубь всех вызовов:
V>- из управляемого кода в нейтив;
V>- оттуда приходит колбэк в управляемый код (многие перечисления в системных АПИ так работают);
V>- из этого фрейма опять вызывается что-то в нейтиве.
Ну в вашем-то случае весь метод — это инкремент лонга по указателю. Никаких колбэков, никаких зебр.

V>Указанные два "островка" управляемого стека должны быть связаны в однонаправленный список, от текущего верха стека к его нижним фреймам.

V>Дотнетный дебаггер при отладке, кстате, показывает места, где участки нейтивного стека пропущены.
Ну, это если у нас реально тяжёлый нативный метод — долго работает и/или делает колбэки в менеджед. В первом случае микросекунды задержки нам неважны; во втором случае такой метод просится на перетаскивание в менеджед.

S>>Я на своём уровне некомпетентности вижу только одну глобальную проблему: нет, как такового, хотспоттинга. Tiered compilation выглядит как жалкое подобие левой руки.


V>Tiered compilation и есть hotspot.

Ну это очень вольная трактовка. Формально — да, но с тех пор, как появилась сама идея "оптимизируем только узкие места", её стандартная трактовка расширилась до "runtime profile-based dynamic optimization".
То есть "учитываем счётчик вызовов для применения tier1" — это очень, очень примитивный уровень. Чтобы, к примеру, заработал спекулятивный инлайнинг, нужно:
— прикрутить инструментирование кода для определения частотности call targets
— прикрутить умение JIT-тить инлайн ожидаемого таргета с guard condition
— прикрутить умение откатывать оптимизацию (или применять повторный JIT) при превышении порога частоты срабатывания guard condition.
Это одно стоит в разы больше, чем, собственно, tiered compilation. А ведь помимо этого в настоящем хотспоте (т.е. в profile guided optimization) ещё много чего прикручено.

V>В моём примере с IConfig до появления Tiered compilation джит сразу генерил свой оптимизированный, но глупый код.

V>Теперь этот код надо исполнять сколько-то раз в цикле, чтобы джит его соптимизировал, иначе там 1-в-1 с исходником.
Ну, именно поэтому BDN имеет фазу прогрева

V>Средней величины дотнетное приложение до него запускалось по 600-800 ms, сейчас примерно вдвое быстрее.

Ну почему же "ничего более". Прямо в анонсе показывали ускорение steady state, местами почти двукратное.

V>Особенно чувствительны к этой технологии те приложения, где инициализируется много статических данных (например, WPF и прочие, где описаны мильоны dependency property).

V>Cтоимость джита инициализирующего кода была в разы больше стоимости его исполнения, а код-то одноразовый.
Возможно. Я WPF приложения никогда не видел

V>Спасёт только качественный AOT.

Это для десктопа. А для любимого мной бэкенда важен именно хотспот, т.к. никакой AOT не предскажет реальную нагрузку.
V>К нашей пенсии всё будет ОК, не переживай. ))
А вот я уверен, что и тогда будет к чему стремиться.

V>Ммм...

V>В общем, там несравнимые объемы и сложность кода, имелось ввиду это.
V>Если тебе Рослин кажется сложным проектом — ты сильно заблуждаешься.
V>Рослин простой как балалайка, хотя и достаточно объемный.
Ну так его пилили не столько лет, сколько GCC

V>И что странно — нормального оптимизирующего компилятора C# всё еще нет.

V>Т.е. слишком многое оставлено джиту такого, что можно причесать и до джит.
Да, с этим согласен.

V>Например, тот же пример с SomeClass<Config1> c1 = ...; c.Foo();

V>Если все типы объявлены в одной сборке, там нефик делать соптимизировать лишнее компилятором.
Да пусть хотя бы свой dup для value типов уберут А то смешно сказать — два совершенно семантически эквивалентных куска С# кода порождают совершенно разный бинарь. Ну куда это годится?

V>Аналогично куча строковых вычислений и прочих, особенно при инициализации — компилятор честным образом отдаёт это всё в рантайм, хотя там до половины и более зачастую вычислимы в compile time.

Как раз простые строковые вычисления компилятор делает сразу.

V>Основное при разработке сложных проектов — хорошо понимать собственный код.

V>Итеративность в этом смысле привносит оперативность.
V>Т.е., в чём-то больше работы, да, но в целом происходящее оперативнее, т.к. некоторые бока/недоработки нового кода раньше вскрываются.
Ну о какой итеративности можно тут говорить? Они же не могли выпустить "рослин шарп 1.0" без генериков и прочих плюшек, и потом итеративно его деливерить.
Внутри проекта, понятное дело, были какие-то майлстоуны и дедлайны, но снаружи всё это не могло быть наблюдаемо.

V>Любому "светлому будущему" надо по классике отводить примерно 9 месяцев на что-то средней сложности и не более 18-ти для чего-то совсем кардинального.

V>А тут 5-6 лет возни.
Ну-ну
V>И не переубедишь. ))
Ну, может вам в Теслу пойти? А то с анонса автопилота прошло уже существенно больше 18 месяцев, а он всё ещё не ездит.

S>>Многие компании на этом вообще ломаются.


V>Спас ход конём — выкатили для линухов и ушли в опенсорс, аудитория потихоньку возвращается.

Да, шанс есть. Но надо ещё пилить, пилить, и пилить.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.