
Александр
18.06.2018
10:57:04

A64m
18.06.2018
10:57:05
чем угодно это чем?

Александр
18.06.2018
10:58:32
Хотя бы тем, что компилируется и не имеет GIL

Google

Алексей
18.06.2018
10:58:34

A64m
18.06.2018
10:58:50

Алексей
18.06.2018
11:00:01
Я вот в универе писал одну программу на крестах. Как раз по части числодробления. Так в ней даже между debug и release режимом компиляции была колоссальная разница в производительности.
И не сказать, чтобы я там использовал хитрые оптимизации.

A64m
18.06.2018
11:00:39
Хотя бы тем, что компилируется и не имеет GIL
желательно чтоб у этого компилирующегося не было своего гц, потому что интероп между языками с разными рантаймами это адище. ну и если использовать большинство этих компилирующихся языков то и питон не нужен, они лидо такие же по уровню, либо еще лучше

Александр
18.06.2018
11:00:46

A64m
18.06.2018
11:01:23
так что сочетание - скрипт + низвоуровневый язык для скорости - это чисто C или плюсовая специфика, с другими языками скрипт и не нужен

Алексей
18.06.2018
11:01:44
Ну вот как раз C# - это один из тех редких языков, который фактически поддерживает аллокацию на стеке.

Александр
18.06.2018
11:02:36
Да, но я не уверен, что именно из-за этой фичи прототип выигрывал.

Алексей
18.06.2018
11:03:12
Точнее даже дело не только в этом. То есть структуры в C# - это фактически значения, которые как правило будут выделены в той же области памяти, что и содержащий их объект. Не знаю как это лучше описать даже.

A64m
18.06.2018
11:03:17
у сишарпа сносная производительность потому что гц нормальный, в который много труда вложено

Александр
18.06.2018
11:03:45

Алексей
18.06.2018
11:03:49
То есть плотность хранения данных выше, указателей меньше, меньше кеш-промахов.

Google

Алексей
18.06.2018
11:03:59

Александр
18.06.2018
11:04:31
Да, подозреваю, как раз кеш-промахи и были самой главной проблемой того плюсового кода

Алексей
18.06.2018
11:05:02
Чем это вообще может быть обусловленно?

Александр
18.06.2018
11:05:38
Там было слишком много ООП, которое дробило структуры данных и коллекции :(
Но наверняка сказать не могу, так как если бы знал, поучаствовал бы в оптимизации

Алексей
18.06.2018
11:07:00
Странно весьма, тогда почему на шарпе было лучше? Короче, мало инфы доступно.

A64m
18.06.2018
11:07:33
потому что такой код с кучей объектов и будет быстрее на языке с ГЦ
если же все на плоских структурах делать, то плюсы все равно выиграют

Алексей
18.06.2018
11:08:15
Значит походу хреново C++ код написали.

Александр
18.06.2018
11:08:17
Отличия C#-прототипа от С++ кода все же радикальные. А прототип оказался быстрее на несколько процентов в среднем, но стабильно. Просто над прототипом не работали, а над плюсовым кодом - работали

Алексей
18.06.2018
11:08:20
Во во.

A64m
18.06.2018
11:08:35
не так как у языка где нет каких-то разновидностей анбоксинга, конечно

Алексей
18.06.2018
11:09:04
Или у них была куча памяти и аллокаций и GC редко запускался.
Тогда может быть выйгрышь за счёт быстроты аллокаций при наличии GC.

Евгений
18.06.2018
11:10:37
Хм, а в плюсах есть инструменты профилирования попадания данных в кеш?

A64m
18.06.2018
11:10:58
ну, в случаях когда "гипотеза поколений" работает
а в некоем сферовакуумном ООП коде она вполне работает

Alexander
18.06.2018
11:11:54
ну хоть что-то с ООП нормально работает

Ilya
18.06.2018
11:12:04

Google

Александр
18.06.2018
11:12:48
Фортран, через С-интерфейс :))

Alexander
18.06.2018
11:13:20

Александр
18.06.2018
11:13:56
Ну что вы пристали. Выберите себе язык, вон их сколько

Dmitry
18.06.2018
11:13:57

Алексей
18.06.2018
11:14:42
ну, в случаях когда "гипотеза поколений" работает
Не, я вообще про то, что аллокация памяти при наличии сборщика мусора может выполняться быстрее, чем без него. А гипотеза поколений может как раз покрыта объектами на стеке. Правда у языков типа C# может быть escape analysis, который тоже хотя бы частично может разгрузить GC. Плюс дотнет в отличии от крестов может запросто делать оптимизации во время выполнения.

Ilya
18.06.2018
11:14:46

Александр
18.06.2018
11:15:32
По поводу Java холиварить скучно :(
Да и по поводу Питона тоже.

Ilya
18.06.2018
11:16:33

Евгений
18.06.2018
11:17:02
На фортране же

Vasiliy
18.06.2018
11:17:21
О, кстати, зачем далеко ходить за примерами не таких уж быстрых плюсов? Все олимпиадники знают, что в плюсах не нужно считывать чиселки при помощи потоков, они тормозят. И все делают scanf("%d", &x). Или построчно файл считать. Плюсовая версия значительно тормозней сишной.

Алексей
18.06.2018
11:17:28

Евгений
18.06.2018
11:17:49
Помню лет 10 назад можно было на астроотделении матмеха спбгу подработать переписывая числодробительные либы с фортрана на плюсы
Разница небольшая


Alexander
18.06.2018
11:22:18
@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
18.06.2018
11:26:05
Ну а теперь надо с Rust на плюсы перегнать обратно
И ещё +10 процентов скорости

Alexander
18.06.2018
11:27:02

Dmitry
18.06.2018
11:27:05
"Как тебе такое, Илон Маск"

Google

Dmitry
18.06.2018
11:27:14

Mikhail
18.06.2018
11:27:28
Раст породжает простыни избыточного текста, точно так же, как си

Sergey
18.06.2018
11:28:17
сам порождает?

Alexander
18.06.2018
11:28:40
С чего бы?
Разные возможности для построения абстракций. Тайпклассы и нормальный параметрический полиморфизм(правда без HKT) vs ООП и template hell

Mikhail
18.06.2018
11:30:07
Плюс не факт что раст, написанный сейчас, скомпилится через 20 лет. Или я ошибаюсь?

Alexander
18.06.2018
11:30:47

Dmitry
18.06.2018
11:31:16

Daniel
18.06.2018
11:32:41
чатик опять продали?

A64m
18.06.2018
11:32:53

Admin
ERROR: S client not available

Sergey
18.06.2018
11:33:48

Alexander
18.06.2018
11:33:52

Алексей
18.06.2018
11:34:06

Dmitry
18.06.2018
11:34:20

Alexander
18.06.2018
11:36:16
А это всё точно использовалось в miniz?
хз, но в русте ещё макросы человеческие, они тут https://github.com/alexchandel/miniz-rs/blob/master/src/tdefl.rs только так используются, ну и итераторы тоже


A64m
18.06.2018
11:36:34
У нас в JetBrains эксперимент проводили - переписали библиотеку miniz с Си на Rust (ну не С++, а Си, окей). miniz - это сейчас типа самая убероптимизированная inflate/deflate либа, быстрее zlib. Соотв. inflate/deflate - это чистая числодробилка. Есть массив байт на входе, нужно получить другой массив байт на выходе. Только алгоритм реализуй. Ну эта "убероптимизированность" miniz выражается в т.ч. в экстремально нечитаемом коде, где все состоит из макросов со всякими нелокальными goto и прочим. Полное адище.
На Rust переписыали буквально по одной функции - Rust с Си превосходно линкуется. Т.е. БУКВАЛЬНО по одной функции переписывали, линковали и прогоняли тесты. Т.е. один в один вся реализация и структура программы сохранены остались. Как переписано было все, уже начали рефакторить. Короче получился очень красивый и читаемый код, просто ни в какое сравнение с оригиналом. Кроме того, блягодаря расту получаем статически гарантируемый type/memory safety. А дальше уже стали ЕГО ОПТИМИЗИРОВАТЬ ЕЩЕ. Потому что код читаемый, понятно что как работает и зачем нужно - можно оптимизивароть. А когда у тебя все на макросах с goto и небезопасно - там хуй что поймешь и боишься что-то трогать. В итоге у нас на 10-20% быстрее оригинала по разным бенчам. ДА, НА РАСТЕ БЫСТРЕЕ ЧЕМ НА СИ. А секрет прост - раст не меньше чем Си дает контроля за тем, какой там код будет сгенерен. Ты пишешь код, и понимаешь, что у тебя в ассемблере будет в этом месте. При этом type/memory/thread safety и вообще красивые абстракции.
ну если код на си/плюсах плохой, то понятно что на других языках можно написать быстрее, и это до какого-то уровня легче, ведь языки-то более-менее нормальные, не си. но начиная с некоторого уровня ручной оптимизации кода на си/плюсах это уже малореально


Алексей
18.06.2018
11:37:37

A64m
18.06.2018
11:38:12
все адище с гц от массового выживания

Dmitry
18.06.2018
11:40:09
Кстати, давно мучает вопрос. А почему не сделают в Haskell отключение GC на время? Вот я хочу выполнить какую-то операцию (в IO), делаю turnoffGC, потом быстренько делаю её, а потом снова turnonGC. Если памяти не хватит -- ну это мои проблемы, готов на это пойти.

Google

Dmitry
18.06.2018
11:40:15
Можно как-то это сделать?

A64m
18.06.2018
11:40:43
в CLR, напрмиер это даже сделано

Dmitry
18.06.2018
11:41:16
CLR ?
Что это?

A64m
18.06.2018
11:41:24
.net

Dmitry
18.06.2018
11:41:33
А
Ну а в Haskell?

A64m
18.06.2018
11:42:11
в хаскеле это до недавнего времени был нереалистичный сценарий, вседь все адово аллоцирует

Dmitry
18.06.2018
11:42:46
А... А сейчас как?

A64m
18.06.2018
11:43:01
недавно потимизатор стал более менее регулярно неаллоцирующие циклы получать и из-за этого повылезали всякие проблемы даже, типа того что треды не переключаются без аллокации и т.д.
т.е. все рассчитывалось на то что постоянно адовые аллокации
теперь может и добавят такую фичу, но не факт, просто некому такими вещами заниматься
ну, формально это, в каком-то смысле, сейчас доступно в хаскеле - во время опасного сишного вызова ничего собираться не будет

Leonid
18.06.2018
12:04:37
в русте кстати есть возможности писать производительный код, но llvm генерит довольно отвратительный asm.

A
18.06.2018
12:05:16
Отвратительность его в чем?
Читается плохо и не самый
эффективный?

A64m
18.06.2018
12:06:24
там емнип проблемы с определением алиазинга, и потому ллвм плохо оптимизирует

Leonid
18.06.2018
12:08:08
алиасинг да. руст мог бы местами лушче детектить и аннотировать. но и С llvm генерит не очень
обсобенно с битами и шифтами
до GCC ему далеко

Mikhail
18.06.2018
12:11:37
LLVM компилит в свой язык, поэтому
Плата за портабельность