Алексей
для числодробилок (и машлёрна в том числе) ещё ничего лучше плюсов и не придумали
саша
A64m
есть гораздо более очевидно тормозные и требовательные к памяти приложения на плюсах - браузеры. правда ни на чам другом их что-то не пишут
Алексей
а как же руст? :(
руст только недавно появился и ещё не обрёл и сотой популярности плюсов, да и плюсового числодробительного кода, который можно заюзать, уже немало накопилось
саша
A64m
чем угодно это чем?
Alexander
Хотя бы тем, что компилируется и не имеет GIL
Алексей
саша
Алексей
Я вот в универе писал одну программу на крестах. Как раз по части числодробления. Так в ней даже между debug и release режимом компиляции была колоссальная разница в производительности.
Алексей
И не сказать, чтобы я там использовал хитрые оптимизации.
A64m
Хотя бы тем, что компилируется и не имеет GIL
желательно чтоб у этого компилирующегося не было своего гц, потому что интероп между языками с разными рантаймами это адище. ну и если использовать большинство этих компилирующихся языков то и питон не нужен, они лидо такие же по уровню, либо еще лучше
A64m
так что сочетание - скрипт + низвоуровневый язык для скорости - это чисто C или плюсовая специфика, с другими языками скрипт и не нужен
Алексей
Ну вот как раз C# - это один из тех редких языков, который фактически поддерживает аллокацию на стеке.
Alexander
Да, но я не уверен, что именно из-за этой фичи прототип выигрывал.
Алексей
Точнее даже дело не только в этом. То есть структуры в C# - это фактически значения, которые как правило будут выделены в той же области памяти, что и содержащий их объект. Не знаю как это лучше описать даже.
A64m
у сишарпа сносная производительность потому что гц нормальный, в который много труда вложено
Alexander
Алексей
То есть плотность хранения данных выше, указателей меньше, меньше кеш-промахов.
Алексей
Alexander
Да, подозреваю, как раз кеш-промахи и были самой главной проблемой того плюсового кода
Алексей
Алексей
Чем это вообще может быть обусловленно?
Alexander
Там было слишком много ООП, которое дробило структуры данных и коллекции :(
Alexander
Но наверняка сказать не могу, так как если бы знал, поучаствовал бы в оптимизации
Алексей
Странно весьма, тогда почему на шарпе было лучше? Короче, мало инфы доступно.
A64m
потому что такой код с кучей объектов и будет быстрее на языке с ГЦ
A64m
если же все на плоских структурах делать, то плюсы все равно выиграют
Алексей
Значит походу хреново C++ код написали.
Alexander
Отличия C#-прототипа от С++ кода все же радикальные. А прототип оказался быстрее на несколько процентов в среднем, но стабильно. Просто над прототипом не работали, а над плюсовым кодом - работали
Алексей
Во во.
A64m
не так как у языка где нет каких-то разновидностей анбоксинга, конечно
Алексей
Или у них была куча памяти и аллокаций и GC редко запускался.
Алексей
Тогда может быть выйгрышь за счёт быстроты аллокаций при наличии GC.
Евгений
Хм, а в плюсах есть инструменты профилирования попадания данных в кеш?
A64m
ну, в случаях когда "гипотеза поколений" работает
A64m
а в некоем сферовакуумном ООП коде она вполне работает
саша
ну хоть что-то с ООП нормально работает
Ilya
Alexander
Фортран, через С-интерфейс :))
Alexander
Ну что вы пристали. Выберите себе язык, вон их сколько
Dmitry
Алексей
ну, в случаях когда "гипотеза поколений" работает
Не, я вообще про то, что аллокация памяти при наличии сборщика мусора может выполняться быстрее, чем без него. А гипотеза поколений может как раз покрыта объектами на стеке. Правда у языков типа C# может быть escape analysis, который тоже хотя бы частично может разгрузить GC. Плюс дотнет в отличии от крестов может запросто делать оптимизации во время выполнения.
Alexander
По поводу Java холиварить скучно :(
Alexander
Да и по поводу Питона тоже.
Ilya
Евгений
На фортране же
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
"Как тебе такое, Илон Маск"
Dmitry
М
Раст породжает простыни избыточного текста, точно так же, как си
Cat
сам порождает?
саша
С чего бы?
Разные возможности для построения абстракций. Тайпклассы и нормальный параметрический полиморфизм(правда без HKT) vs ООП и template hell
М
Плюс не факт что раст, написанный сейчас, скомпилится через 20 лет. Или я ошибаюсь?
саша
Danila Matveev
чатик опять продали?
A64m
Cat
саша
Алексей
Dmitry
саша
А это всё точно использовалось в 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 и вообще красивые абстракции.
ну если код на си/плюсах плохой, то понятно что на других языках можно написать быстрее, и это до какого-то уровня легче, ведь языки-то более-менее нормальные, не си. но начиная с некоторого уровня ручной оптимизации кода на си/плюсах это уже малореально
Алексей