Алексей
для числодробилок (и машлёрна в том числе) ещё ничего лучше плюсов и не придумали
A64m
есть гораздо более очевидно тормозные и требовательные к памяти приложения на плюсах - браузеры. правда ни на чам другом их что-то не пишут
Алексей
а как же руст? :(
руст только недавно появился и ещё не обрёл и сотой популярности плюсов, да и плюсового числодробительного кода, который можно заюзать, уже немало накопилось
Alexander
Мне кажется вы ерунду говорите, сейчас например в том что машобе плюсами обмазывают узкие места а остальное питон. Но это уже не по теме чата, не буду спорили
Я говорю про тенденции, а не про частности. Вместо плюсов в питоне можно узкие места чем угодно обмазать, будет лучше. Но принято плюсами, так как сохраняется возможность оптимизировать эту часть по максимуму. Я утверждаю лишь, что базовая производительности плюсов, если над ней специально не работать, будет не так хороша, как если над ней работать. А иногда даже обычный плюсовый код по производительности может сравниться с некоторыми другими языками.
A64m
а как же руст? :(
низкая производительность по сравнению с плюсами
A64m
чем угодно это чем?
Alexander
Хотя бы тем, что компилируется и не имеет GIL
A64m
а как же руст? :( (2)
ну ладно пишут, но еще не дописали
Алексей
Я вот в универе писал одну программу на крестах. Как раз по части числодробления. Так в ней даже между debug и release режимом компиляции была колоссальная разница в производительности.
Алексей
И не сказать, чтобы я там использовал хитрые оптимизации.
A64m
Хотя бы тем, что компилируется и не имеет GIL
желательно чтоб у этого компилирующегося не было своего гц, потому что интероп между языками с разными рантаймами это адище. ну и если использовать большинство этих компилирующихся языков то и питон не нужен, они лидо такие же по уровню, либо еще лучше
Alexander
Сомневаюсь. Есть просто огромная куча языков, которая например тупо не поддерживает аллокацию объектов на стеке. Уже неплохой такой удар по производительности.
Ну вот смотри, такой пример из реальной практики в Касперском. На C# делали прототип движка классификации текстов, версия 3. Потом переносили на плюсы и заморачивались с оптимизациями. И в итоге C#-прототип все равно оказался чуточку быстрее, проще и безопаснее, при одинаковых реализованных фичах там и тут.
A64m
так что сочетание - скрипт + низвоуровневый язык для скорости - это чисто C или плюсовая специфика, с другими языками скрипт и не нужен
Алексей
Ну вот как раз C# - это один из тех редких языков, который фактически поддерживает аллокацию на стеке.
Alexander
Да, но я не уверен, что именно из-за этой фичи прототип выигрывал.
Алексей
Точнее даже дело не только в этом. То есть структуры в C# - это фактически значения, которые как правило будут выделены в той же области памяти, что и содержащий их объект. Не знаю как это лучше описать даже.
A64m
у сишарпа сносная производительность потому что гц нормальный, в который много труда вложено
Алексей
То есть плотность хранения данных выше, указателей меньше, меньше кеш-промахов.
Алексей
Value-типы
Ну да.
Alexander
Да, подозреваю, как раз кеш-промахи и были самой главной проблемой того плюсового кода
Алексей
Чем это вообще может быть обусловленно?
Alexander
Там было слишком много ООП, которое дробило структуры данных и коллекции :(
Alexander
Но наверняка сказать не могу, так как если бы знал, поучаствовал бы в оптимизации
Алексей
Странно весьма, тогда почему на шарпе было лучше? Короче, мало инфы доступно.
A64m
потому что такой код с кучей объектов и будет быстрее на языке с ГЦ
A64m
если же все на плоских структурах делать, то плюсы все равно выиграют
Алексей
Значит походу хреново C++ код написали.
Alexander
Отличия C#-прототипа от С++ кода все же радикальные. А прототип оказался быстрее на несколько процентов в среднем, но стабильно. Просто над прототипом не работали, а над плюсовым кодом - работали
Алексей
Во во.
A64m
не так как у языка где нет каких-то разновидностей анбоксинга, конечно
Алексей
Или у них была куча памяти и аллокаций и GC редко запускался.
Алексей
Тогда может быть выйгрышь за счёт быстроты аллокаций при наличии GC.
Евгений
Хм, а в плюсах есть инструменты профилирования попадания данных в кеш?
A64m
ну, в случаях когда "гипотеза поколений" работает
A64m
а в некоем сферовакуумном ООП коде она вполне работает
саша
ну хоть что-то с ООП нормально работает
Alexander
Фортран, через С-интерфейс :))
саша
Фортран, через С-интерфейс :))
Ну это такое. Что угодно - это компилируемый язык без GC?
Alexander
Ну что вы пристали. Выберите себе язык, вон их сколько
Алексей
ну, в случаях когда "гипотеза поколений" работает
Не, я вообще про то, что аллокация памяти при наличии сборщика мусора может выполняться быстрее, чем без него. А гипотеза поколений может как раз покрыта объектами на стеке. Правда у языков типа C# может быть escape analysis, который тоже хотя бы частично может разгрузить GC. Плюс дотнет в отличии от крестов может запросто делать оптимизации во время выполнения.
Ilya
Фортран, через С-интерфейс :))
ну фортран да, действительно можно:) я думал ты джаву скажешь, хотел уже похоливарить
Alexander
По поводу Java холиварить скучно :(
Alexander
Да и по поводу Питона тоже.
Евгений
На фортране же
Vasiliy
О, кстати, зачем далеко ходить за примерами не таких уж быстрых плюсов? Все олимпиадники знают, что в плюсах не нужно считывать чиселки при помощи потоков, они тормозят. И все делают scanf("%d", &x). Или построчно файл считать. Плюсовая версия значительно тормозней сишной.
Алексей
На фортране же
ну уж лучше на плюсах тогда, чем на фортране
Евгений
Помню лет 10 назад можно было на астроотделении матмеха спбгу подработать переписывая числодробительные либы с фортрана на плюсы
Евгений
Разница небольшая
саша
@A64m_qb0 Про производительность руста:
саша
У нас в JetBrains эксперимент проводили - переписали библиотеку miniz с Си на Rust (ну не С++, а Си, окей). miniz - это сейчас типа самая убероптимизированная inflate/deflate либа, быстрее zlib. Соотв. inflate/deflate - это чистая числодробилка. Есть массив байт на входе, нужно получить другой массив байт на выходе. Только алгоритм реализуй. Ну эта "убероптимизированность" miniz выражается в т.ч. в экстремально нечитаемом коде, где все состоит из макросов со всякими нелокальными goto и прочим. Полное адище. На Rust переписыали буквально по одной функции - Rust с Си превосходно линкуется. Т.е. БУКВАЛЬНО по одной функции переписывали, линковали и прогоняли тесты. Т.е. один в один вся реализация и структура программы сохранены остались. Как переписано было все, уже начали рефакторить. Короче получился очень красивый и читаемый код, просто ни в какое сравнение с оригиналом. Кроме того, блягодаря расту получаем статически гарантируемый type/memory safety. А дальше уже стали ЕГО ОПТИМИЗИРОВАТЬ ЕЩЕ. Потому что код читаемый, понятно что как работает и зачем нужно - можно оптимизивароть. А когда у тебя все на макросах с goto и небезопасно - там хуй что поймешь и боишься что-то трогать. В итоге у нас на 10-20% быстрее оригинала по разным бенчам. ДА, НА РАСТЕ БЫСТРЕЕ ЧЕМ НА СИ. А секрет прост - раст не меньше чем Си дает контроля за тем, какой там код будет сгенерен. Ты пишешь код, и понимаешь, что у тебя в ассемблере будет в этом месте. При этом type/memory/thread safety и вообще красивые абстракции.
Dmitry
Ну а теперь надо с Rust на плюсы перегнать обратно
Dmitry
И ещё +10 процентов скорости
саша
Dmitry
"Как тебе такое, Илон Маск"
М
Раст породжает простыни избыточного текста, точно так же, как си
Cat
сам порождает?
саша
С чего бы?
Разные возможности для построения абстракций. Тайпклассы и нормальный параметрический полиморфизм(правда без HKT) vs ООП и template hell
М
Плюс не факт что раст, написанный сейчас, скомпилится через 20 лет. Или я ошибаюсь?
Dmitry
Разные возможности для построения абстракций. Тайпклассы и нормальный параметрический полиморфизм(правда без HKT) vs ООП и template hell
Ну вот что-то мне подсказывает, что перевод Rust -> C/C++ не приведёт к лишнему бойлерплейту. И, кстати, тайпчекинг УЖЕ сделан в Rust'е, поэтому в C/C++ его уже меньше надо (если буквально переводить). Но вообще, интересно было бы посмотреть код на Rust этой miniz, который нельзя было бы читаемо перевести на C/C++
Danila Matveev
чатик опять продали?
саша
А это всё точно использовалось в miniz?
хз, но в русте ещё макросы человеческие, они тут https://github.com/alexchandel/miniz-rs/blob/master/src/tdefl.rs только так используются, ну и итераторы тоже
A64m
У нас в JetBrains эксперимент проводили - переписали библиотеку miniz с Си на Rust (ну не С++, а Си, окей). miniz - это сейчас типа самая убероптимизированная inflate/deflate либа, быстрее zlib. Соотв. inflate/deflate - это чистая числодробилка. Есть массив байт на входе, нужно получить другой массив байт на выходе. Только алгоритм реализуй. Ну эта "убероптимизированность" miniz выражается в т.ч. в экстремально нечитаемом коде, где все состоит из макросов со всякими нелокальными goto и прочим. Полное адище. На Rust переписыали буквально по одной функции - Rust с Си превосходно линкуется. Т.е. БУКВАЛЬНО по одной функции переписывали, линковали и прогоняли тесты. Т.е. один в один вся реализация и структура программы сохранены остались. Как переписано было все, уже начали рефакторить. Короче получился очень красивый и читаемый код, просто ни в какое сравнение с оригиналом. Кроме того, блягодаря расту получаем статически гарантируемый type/memory safety. А дальше уже стали ЕГО ОПТИМИЗИРОВАТЬ ЕЩЕ. Потому что код читаемый, понятно что как работает и зачем нужно - можно оптимизивароть. А когда у тебя все на макросах с goto и небезопасно - там хуй что поймешь и боишься что-то трогать. В итоге у нас на 10-20% быстрее оригинала по разным бенчам. ДА, НА РАСТЕ БЫСТРЕЕ ЧЕМ НА СИ. А секрет прост - раст не меньше чем Си дает контроля за тем, какой там код будет сгенерен. Ты пишешь код, и понимаешь, что у тебя в ассемблере будет в этом месте. При этом type/memory/thread safety и вообще красивые абстракции.
ну если код на си/плюсах плохой, то понятно что на других языках можно написать быстрее, и это до какого-то уровня легче, ведь языки-то более-менее нормальные, не си. но начиная с некоторого уровня ручной оптимизации кода на си/плюсах это уже малореально
A64m
Только младшее поколение тоже надо вилкой чистить. А на стеке считай автоматическое очищение.
не надо, в том и дело, гц же не читстит ничего а переносит живое - если живого почти нет, то и работы нет