LINUX.ORG.RU

Правильно ли я пишу на Rust?

 , ,


1

7

Часто мелькает Rust и в новостях, и в темах. Решил попробовать переписать один тест с С на Rust. Для сравнения написал вариант и на C++. На Rust получилось в 4+ раза медленнее, чем на С и в 2+ раза медленнее, чем на C++. Есть подозрение, что я делаю что-то неправильно, но не знаю что. Помогите, пожалуйста, разобраться.

UPD. Мои цифры:

$ gcc c_v1.c -Ofast -march=native
$ ./a.out 3000
16.439091
-287.250083
$ g++ cpp_v2.cpp -Ofast -march=native
$ ./a.out 3000
31.3826
-287.25
$ rustc rust_v1.rs -C opt-level=3 -C target-cpu=native
$ ./rust_v1 3000
71.570172703s
-287.2500833333321
★★

Последнее исправление: andalevor (всего исправлений: 1)

Ответ на: комментарий от RazrFalcon

В свое время (правда, это было в середине 90-х), мы делали все самостоятельно: запрашиваешь у Windows размер экрана в мм и размер в пикселях, после чего вычисляешь DPI и пляшешь дальше от этого параметра. Но у нас была специфика. Нам нужно было показывать на экране и распечатывать на принтере технологические схемы, поэтому проще оказалось сразу привязаться к пунктам/миллиметрам и для отображения на экран, и для отображения на принтер. Плюс мы работали практически поверх голого WinAPI, без всяких OWL/VCL/MFC.

Что характерно, диалоги, которые рисовались в редакторе ресурсов без проблем масштабировались при переходе с одного разрешения на другое. Поскольку в ресурсах координаты/размеры задавались не в пикселях, а в долях от размера системного шрифта. Соответственно, и сам диалог, и контролы в нем сохраняли свои пропорции даже на экранах с большим разрешением, чем использовалось при рисовании диалога.

Внимания требовали контролы, которые приходилось создавать в окнах вручную, т.к. везде нужно было работать с пикселями. Характерный пример – статус-бар, который тогда многие любили делать высотой в 10px.

В таких случаях мы поступали проще: рассчитывали размер нужных нам контролов исходя из долей общего размера экрана. Скажем, высота статус-бара была 10% от высоты экрана. А уж сколько пикселей там получится зависело от разрешения. Соответственно, внутри статус-бара размер шрифта рассчитывался исходя из фактической его высоты.

Не скажу, чтобы это было сложно. Особенно если создать себе набор подходящих инструментов, которые бы инкапсулировали бы это все в себе.

Побочным эффектом от этого был культурный шок от чужого кода, в котором все размеры задавались напрямую в пикселях и, более того, все это хардкодилось прямо в коде…

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Да он же, как супергерой. Вот не нравится им, например, Раст. Но им сложно это аргументировать, а он не пасует перед трудностями. Получается, он реализует их сокровенное желание. Зачем такого игнорировать(?)

Virtuos86 ★★★★★
()
Ответ на: комментарий от RazrFalcon

В QML они пытались вижеты поддерживать, но во второй версии контролов всё выкинули, ибо нативные виджеты рисует только проц и они все тормозят.

Нативный стиль в QuickControls выкинули из-за проблем с корректностью отрисовки, а не ее скорости. Например, на маке практически нереально нормально отрисовать кнопку нестандартной высоты, а при анимации она будет чудесным образом трансформироваться. Потому не стоит натягивать реальность на свою точку зрения и выдумывать чушь.

anonymous
()

Шутка.

Rust === Trus

anonymous
()
Ответ на: комментарий от anonymous

При чём тут высота кнопки? Основной посыл Qt Quick Controls 2 - производительность. Больше кода на C++, а не на JS. Быстрее отрисовка. И тд.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

При чём тут высота кнопки?

Вопросов больше не имею. Когда чистый теоретик рассуждает о чем-то - его не переубедишь. А я, если что, Qt-е стили лично фиксил.

anonymous
()
Ответ на: комментарий от eao197

Проблема с таким подходом, что очень легко где-то забыть умножить на коэффициент и получить неверное отображение.

В Qt таких проблем нет, так как всё задаётся в поинтах и прозрачно масштабируется (разве что растру нужно вручную dpi указывать).

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Шикарные у вас аргументы - «это не нужно», «все еще впереди».

Раст интересный язык который решает важную задачу интересным способом. Но в угоду этому принесено многое в языке. Например, циклический граф с гетерогенными узлами на нем написать очень непросто, мягко говоря. А это основная структура данных, которая используется в гуях. И тут давали ссылку на блог, где автор пишет что бросил раст из-за этого и подробно описывает ситуацию не оставляя никакого пространства для догадок. А вы на это замечание отвечаете просто - все еще впереди. Аргументация так себе...

Мое мнение что Раст - замечательный язык, но нишевый. Хайп вокруг него чрезвычайно преувеличен. И пока (все конечно может измениться) я вижу у него такое же будущее как у перла - кодовая база на перле уже прочно сидит в том же дебиане, однако сейчас у него уже не та популярность. Также у Раста код будет в мозилле, но люди разберутся что к чему. Да и другие начнут хайповать - мода то она же проходит со временем.

yetanother ★★
()
Ответ на: комментарий от yetanother

То есть десятки людей в моззиле дураки и слепо переписывают лису на раст? Тем временем анонимы с лора уже поняли всю бесперспективность раста. Зсб чё.

Ну и вы не с тем воюете. Я активно пишу на расте уже третий год и прекрасно знаю про его проблемы и ограничения. А ваши попытки открыть некую истину выглядят как минимум смехотворно.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ну зачем вы перевираете мои слова? Я никогда не говорил, что в мозилле дураки или что раст бесперспективный. Покажите хоть один мой пост с таким утверждением? Я говорю, что раст - нишевый язык, не общего назначения, вот и все. И ниша эта может быть большая, и писать на нем могут многое. Но не все. И были уже конкретные ссылки про то, что не смогли люди написать на расте - но вы почему-то игнорируете этот момент.

Завязывайте мыслить категориями черное-белое.

yetanother ★★
()
Ответ на: комментарий от yetanother

А это основная структура данных, которая используется в гуях.

В GUI не все связи равнозначны. Связи по владению образуют дерево. Остальные связи можно сделать на слабых указателях.

автор пишет что бросил раст из-за этого

Не, там автор пишет, что каждый раз проверять хэндлы на каждый вызов wayland в GUI приложении он не хочет. Проверка хэндла: одно сравнение значения в регистре с нулём, один условный переход. Условие практически никогда не выполняется, у предсказателя ветвлений проблем нет. Цена: около одного такта процессора, в программе нужно писать знак вопроса после вызова функции и вручную чистить ресурсы в соответствующем коллбэке.

Поэтому он решил разработать систему для получения статических гарантий при работе с ресурсами, которые могут появляться и исчезать не под контролем программиста (подключение/отключение монитора, например) заодно с системой автоматического управления памятью под ресурсы. И не смог.

red75prim ★★★
()
Ответ на: комментарий от yetanother

И были уже конкретные ссылки про то, что не смогли люди написать на расте

И было обсуждение, которое некоторые не осилили прочитать. Спойлер: ТС пытался натянуть сову на глобус и у него не вышло. Но виноват конечно же rust.

RazrFalcon ★★★★★
()
Ответ на: комментарий от red75prim

У этого автора другой момент, который заключается в том, что чтобы писать на расте по факту нужно чтобы весь стек был на расте, иначе приходится городить жуткие костыли и вообще все непросто. На мой взгляд это вполне логично, раст предоставляет определенные гарантии, но чтобы они выполнялись он тоже предъявляет определенные требования по принципу за все нужно платить. Это и делает раст нишевым языком, потому что не всегда требования раста выполняются. На низком уровне, например, где реальное железо, а не абстрактная красивая модель, без unsafe уже не обойтись вообще никак, что как бы сводит на нет все гарантии.

А так да, я имел в виду другую статью, которую анонимус привел.

yetanother ★★
()
Ответ на: комментарий от yetanother

без unsafe уже не обойтись вообще никак, что как бы сводит на нет все гарантии

Вы так и не поняли суть раста. unsafe не какая-то опциональная фича - это часть языка. Я сомневаюсь, что в принципе можно получить бинарь, который бы ни разу не задействовал unsafe.

Суть в чётком разделении Safe Rust и Unsafe Rust.

Читать до просветления: https://doc.rust-lang.org/nomicon/meet-safe-and-unsafe.html

RazrFalcon ★★★★★
()
Ответ на: комментарий от yetanother

без unsafe уже не обойтись вообще никак, что как бы сводит на нет все гарантии.

Вот почему история с динозавром («Или встречу, или нет, значит 50%») - это анекдот, а «гарантия не 100%, значит никаких гарантий нет» - нет?

red75prim ★★★
()
Ответ на: комментарий от anonymous

Боже мой, да сколько можно тыкать одной единственной статьей, одного единственного инженера-истерички из 2016го года.

Это как эталонный пример anecdotal evidence, достанутого из жопы, чтобы покормить свой confirmation bias (недостаток человеческого мозга выраженный в cклонности к подтверждению своей точки зрения). Надо в книгу по психологии это.

Когда жаба тормозит, то вся планета орет что жаба тормозит. Это очевидно всем у кого не лапти не на глазах. Другое дело что это бывает не важно для задачи, не в том месте узкое место или не так формируется стоимость решения.

Или реально одно и то же c Rust «но как же циклические графы, я хочу чтобы и в них компилятор угадывал кто чем владеет!».

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Для этого случая у яйцеголовых есть отличный аргумент - обьявить unsafe не Rust. Только ты делаешь unsafe, все бонусы зачисляются автоматически в лагерь С++. Естественно это манипуляция, но главное громко орать.

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

Нет, не «врети», а указываю на манипуляцию. Мнение одного инженера, если написано в виде ссылки в интернетах, автоматически считается доводом альфа и омега тотальной ненужности Rust.

Но нет. У него аргументы норм, отлично, учтем. От этого польза от Rust в других случаях не становится меньше.

vertexua ★★★★★
()
Ответ на: комментарий от red75prim

Смысл в том, что раст дает в том числе и 100% гарантию. Но только при выполнении определенных условий. Если эти условия не соблюдаются, раст в плане безопасности ничем не безопаснее С++. Это я к тому, что хайпа много вокруг раста, а когда доходит до деталей то сектанты сливаются. Раст это хороший инструмент для решения ряда задач, а не серебрянная пуля на все случаи жизни.

yetanother ★★
()
Ответ на: комментарий от anonymous

Вот когда IDEA перестанет тормозить, тогда и поговорим. (с)

RazrFalcon ★★★★★
()
Ответ на: комментарий от red75prim

Вот почему история с динозавром («Или встречу, или нет, значит 50%») - это анекдот, а «гарантия не 100%, значит никаких гарантий нет» - нет?

Потому что у технарей между 0 и 100 есть еще некоторые величины.

anonymous
()
Ответ на: комментарий от yetanother

Смысл в том, что раст дает в том числе и 100% гарантию.

Нет.

Если эти условия не соблюдаются, раст в плане безопасности ничем не безопаснее С++.

И снова мимо.

когда доходит до деталей то сектанты сливаются

Ага. Очень интересно слушать 100 раз пережёванные городские легенды.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Суть в чётком разделении Safe Rust и Unsafe Rust.

Не нужно уходить от ответа. Я речь веду о том, что Раст, наряду с гарантиями безопасности, которых действительно нет в других языках, имеет большие сложности с созданием циклического графа с неоднородными узлами. Еще раз повторяю - за все нужно платить. И на данный момент это делает Раст больше нишевым языком, чем языком общего назначения. В Расте слишком много принесено в угоду фактически одной фичи.

yetanother ★★
()
Ответ на: комментарий от vertexua

Боже мой, да сколько можно тыкать одной единственной статьей, одного единственного инженера-истерички из 2016го года.

Вот действительно, три года прошло, что же мы тут обсуждаем? Наверное уже появилась возможность создавать эти самые несчастные циклические графы с неоднородными узлами?

yetanother ★★
()
Ответ на: комментарий от yetanother

Создание циклического графа - это очень нишевая задача. И на языках без GC её всё равно нормально не реализовать.

В Расте слишком много принесено в угоду фактически одной фичи.

слишком много

Полегче с субъективностью.

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от yetanother

Но только при выполнении определенных условий. Если эти условия не соблюдаются, раст в плане безопасности ничем не безопаснее С++.

Только условия безопасности в Rust соблюдаются в 95% случаев, а в С++ только в 5% случаев идеально провереного всеми возможными анализаторами кода и половиной забаненых фич. Ваш аргумент «в Rust можно прицелиться и выстрелить в ногу. Следовательно это будут делать всегда, а значит это равно С++».

Раст это хороший инструмент для решения ряда задач, а не серебрянная пуля на все случаи жизни.

Но аргумент борцунов как раз в том чтобы затоптать Rust полностью и не дать ему преуспеть. Просто потому что боятся что лет через 10 прийдется слезать со своих плюсов на работке и в целом duck syndrome. Они то научились есть стекло на С++, значит молодняк тоже обязан. И методика заключается в тотальном отрицании любой пользы, в любых случаях, на любых задачах для любых людей.

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 2)
Ответ на: комментарий от RazrFalcon

Да все там реализовать 300 раз. Уже даже в том же Rust нагородили. Концептуально - всем владеет специализированый Map. Ноды ссылаются по индексам. И есть API чтобы не накосячить и не ссылаться в небо.

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Ссылку на раст-либу можно? Ибо я был автором одной из них.

RazrFalcon ★★★★★
()
Ответ на: комментарий от vertexua

Только условия безопасности в Rust соблюдаются в 95% случаев, а в С++ только в 5% случаев идеально провереного всеми возможными анализаторами кода и половиной забаненых фич.

Ну так а я про что говорю? В отдельных случаях Раст имеет преимущество над С++. В других случаях - наоборот. Просто есть разные инструменты и каждый лучше подходит для определенного круга задач.

Ваш аргумент «в Rust можно прицелиться и выстрелить в ногу. Следовательно это будут делать всегда, а значит это равно С++».

Зачем вы передергиваете?

Но аргумент борцунов как раз в том чтобы затоптать Rust полностью и не дать ему преуспеть.

Зачем вы бросаетесь в крайности? Лично я не отрицаю что Раст уже оказал большое влияние на индустрию. Другое дело, что инженер по определению должен быть технически подкован и понимать, где действительно польза от инструмента, а где хайп голимой воды.

yetanother ★★
()
Ответ на: комментарий от RazrFalcon

Создание циклического графа - это очень нишевая задача. И на языках без GC её всё равно нормально не реализовать.

Ну зачем ерунду-то городить, если не разбираетесь? Циклический граф это неотъемлемая часть многих, если не всех, GUI. Это раз. И, вы не поверите, но на плюсах (а там нет GC, на всякий случай) есть даже несколько GUI. Это два.

yetanother ★★
()
Ответ на: комментарий от yetanother

Ну тут пол-ЛОРа имеет не очень взвешеный подход, и просто бесятся с того чего не понимают.

В целом это такой настрой у людей, не пытаться достать с чего-то выгоду, а потешить ЧСВ тем что они такие умные и нашли как что-то сломать.

Надеюсь они в жизни не так себя ведут. А то увидели автомобиль - сразу залили взрывчатки в бак или начали дышать с выхлопной трубы, заливаясь гомерическим хохотом, как они всех перехитрили. Так же и с графами и Rust, вместо того чтобы ездить

vertexua ★★★★★
()
Ответ на: комментарий от RazrFalcon

/0

Так с тех пор ничего кардинально и не изменилось — сектанты по-прежнему 90% времени заняты написанием биндингов к биндингам для биндингов к сишным библиотекам, а остальные 10% уходят на вялые форумные попытки вознести до небес язычок «не такой как все».

А по факту имеем Раст, которому уже почти 10 лет, а реальных законченных проектов на нём — как не было, так и нет. За это время на C, или том же C++ было переписано полмира. Просто Mozilla не учла, что после промывки мозгов у сектантов теряется и способность к программированию. Отсюда и засилье хелловорлдов на Расте, как свидетельство надвигающейся интеллектуальной импотенции религиозного культа.

anonymous
()
Ответ на: комментарий от yetanother

И, вы не поверите, но на плюсах (а там нет GC, на всякий случай) есть даже несколько GUI.

Ага, и у вас конечно же есть огромный опыт использование Qt чтобы делать такие заявления. Спойлер: Qt фактически не проверяет корректность графа виджетов. Всё на плечах программиста.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

в этом соревновании очень большое значение имела корректность респонсов, которой было очень непросто добиться, и оптимизация под конкретные тестовые данные. 4 место Go и в целом большие разрывы по времени как бы намекают.

anonymous
()
Ответ на: комментарий от anonymous

которому уже почти 10 лет

Городская легенда №1

За это время на C, или том же C++ было переписано полмира

Городская легенда №2

написанием биндингов к биндингам для биндингов к сишным библиотекам

Городская легенда №3

Скучно.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ага, и у вас конечно же есть огромный опыт использование Qt чтобы делать такие заявления. Спойлер: Qt фактически не проверяет корректность графа виджетов. Всё на плечах программиста.

А я и не утверждал, что Qt проверяет корректность графа виджетов. Вы в очередной раз передергиваете. Я всего лишь утверждал, что на С++ вы можете легко и просто создать циклический граф с неоднородными узлами. А на Расте вы этого не можете. И вы это не отрицаете, но пытаетесь отвлечь внимание уводя дискуссию в сторону.

yetanother ★★
()

Все адекватные люди уже взглянули правде в глаза — был бы Раст таким хорошим языком, «убийцей» C или C++, то на нем бы уже написали качественные аналоги Qt или GTK, на C++ ведь смогли люди написать, даже на C смогли, но то ведь не промытые сектанты, а ТЕХНАРИ.

Своим неудачам на софтверном поприще Раст на 50% обязан бездарности представителей культа («нет, значит, не нужно!», «вы всё врете!» и т.п.), и на 50% — собственной неадекватности.

anonymous
()
Ответ на: комментарий от RazrFalcon

Такие же убогие как в C++? Могу конечно.

«Бегом побежал показывать.» ©

anonymous
()
Ответ на: комментарий от RazrFalcon

За 4-е года? Нда…

Что и требовалось доказать, секта «не шмогла», лучше в 316-ый раз переписать, недописать и снова переписать очередной клон coreutils.

anonymous
()
Ответ на: комментарий от anonymous

Все адекватные люди уже взглянули правде в глаза — был бы Раст таким хорошим языком, «убийцей» C или C++, то на нем бы уже написали качественные аналоги Qt или GTK

Уже сто раз обсудили.

то на нем бы уже написали качественные аналоги Qt или GTK

Нет, вывод не верен. Не написали бы, потому что сейчас тулкиты для десктопа никто не пишет вообще.

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от vertexua

Нет, вывод не верен. Не написали бы, потому что сейчас тулкиты для десктопа никто не пишет вообще.

Я этот твой ответ предугадал, и в своём посте прекрасно осветил:

Своим неудачам на софтверном поприще Раст на 50% обязан бездарности представителей культа («нет, значит, не нужно!», «вы всё врете!» и т.п.)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.