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)
Ответ на: комментарий от andalevor

Так я в пример и привел динамическую типизацию. Понятно, почему не стоит сравнивать статичные языки с динамическими. А сравнить по синтаксису два статичных языка, с примерно одинаковыми языковыми возможностями, вполне разумно.

Если ты говоришь, что тебе под задачу не подходят какие-то языки, то это о другом.

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

Ок. Write-only. Тогда вопросов нет.

Вы видели сорцы C/C++ либ? Вот это и есть write-only, ничего не поделаешь.

Так надо оптимизации вообще выключать или нет?

Зачем? Всё и так работает.

RazrFalcon ★★★★★
()

Кстати, для тех кому интересны пруфы. Я уже не раз говорил, что llvm импортирует семантику из С/С++. А раст из llvm. Собственно вторичное бездарное говно и есть вторичное бездарное говно. На самом деле это не всегда даже в доках к llvm явно написано. Но тут в очередной раз нечаянно нажав на ссылку - я увидел её:

The atomic intrinsics provide common atomic operations on machine words, with multiple possible memory orderings. They obey the same semantics as C++11. See the LLVM documentation on [atomics].

Недорабтку в раст-пропаганде. Обычно все такие отсылки затираются, но это типа интринсики + бюро пропаганды ещё не одобрило.

https://llvm.org/docs/LangRef.html#memory-model-for-concurrent-operations

Очередной пример из множество, где цепочка явно декларируется.

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

Он регулярно обновлялся все эти годы.

Лучше бы не обновляли, выпускают уже не бета, а альфа версии, последний рио как пример, отладчик не работает, надо несколько раз пересобирать чтобы изменения в исходниках дошли до исполняемого файла, сервис для интелсенса постоянно грузит процессор, но интелсенс при этом не работает. Это даже глючнее чем C++ Builder 4.

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

Любой текстовый редактор умеет подсвечивать скобки, если вам так сложно найти конец метода. Проблема высосана из пальца.

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

Чтобы скобки подсвечивались, например, в vim-е, по ним нужно бегать. Тогда как наличие ключевого слова return позволяет осознать структуру кода даже не передвигаясь по нему.

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

Речь вообще-то про читабельность. Читать код с явными return для меня проще. Уже объяснил почему.

Доказывать мне, что я не прав, нет смысла, т.к. читабельность — это вещь субъективная. Для меня, например, программы на Pascal/Modula-2/Eiffel несколько более читабельные, чем на C-подобных языках. Но для многих людей все наоборот.

eao197 ★★★★★
()

TL;DR - в итоге-то что получилось-то? сишка нагибает дважды плюсы, а те в свою очередь растишку дважды (даже чуть поболее)? И ситуацию никто не смог изменить за 5 страниц треда?

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

TL;DR - в итоге-то что получилось-то?

У всех идентичная производительность. ЧТД.

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

сишка нагибает дважды плюсы

Это сишка не сможет нагнуть плюсы. Поэтому нет. Это даже не сишка, а дристня какая-то. Да и кресты не кресты.

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

Это флаг оптимизации некоторых оптимизирующих компиляторов. На конечный результат в данной задаче не влияет.

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

Получилось, что для указанной реализации на c++ (а реализации сильно разные) получилось не очень. Но это поправимо.

Реализация rust (использование функционального подхода + unsafe + отключение проверок) догнала по скорости императивную реализацию на C (без включения fast-math, как очень настаивали). Но выглядит конечный результат теперь так, что ни лучше, ни проще не стало.

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

Я же уже объяснял вам, что обычные оптимизации, типа инлайнинга или автовекторизации, не влияют на результат работы программы. fast-math - влияет. Если на ваш хелло-ворд это не влияет - замечательно, но не нужно экстраполировать на всех. Типичный код даже с -O3 может сломаться.

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

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

Разница будет когда вы упакуете это в либу и начнёте её использовать. Вот тут шаблоны/дженерики сильно помогут. Но для сишников это слишком сложно.

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

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

Но как код будет выглядеть при реализации сложных разностных схем представить не берусь.

Типичный код даже с -O3 может сломаться.

Может, тем не менее здесь его использовали, т.к. здесь не ломается.

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

Я не экстраполирую на всех.

Экстраполируете. Написание расчётов на 100 строк - это не все области применения ЯП.

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

Вот тут шаблоны/дженерики сильно помогут.

Да на здоровье. Если доживём до момента упаковки.

Но для сишников это слишком сложно.

Кто сказал C++?

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

Не экстраполирую, о применении этого флага я всегда говорил в рамках определённого класса задач. Далеко не всех вычислительных.

Написание расчётов на 100 строк - это не все области применения ЯП.

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

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

А я больше ни за кого и не говорил.

Что до остальных, то далеко не всем нравится синтаксис Rust-а. Смиритесь. Читать криптограммы нравится далеко не каждому.

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

Читать криптограммы нравится далеко не каждому.

Опять перегибаете.

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

Во-во. Только это уже ассемблер.

За пример реализации на rust спасибо.

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

Не обращай на него внимания, он - местный сумасшедший.

Как удобно — объявил человека сумасшедшим, и тебе уже не нужно отвечать на его аргументы. Хотя любой адекватный технарь узрит в его постах рациональное зерно, отбросив всю лирику, можно увидеть, что он озвучивает вполне адекватные тезисы. Но если ты, как кисельная барышня разваливаешься от одного упоминания слова «говно», то тут тебе уже никто не поможет. Просто подумай, что завтра раст-секта может уже тебя объявить сумасшедшим, хотя учитывая, как ты тут, словно, серая мышь расшаркиваешься перед ними, то, наверное, тебе это не грозит.

P.S. Я не царь.

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

Хотя любой адекватный технарь узрит в его постах рациональное зерно

Правильно ли я понимаю, надо постоянно бегать по улицам и пытаться во всех узреть рациональное зерно? Ты просто обязан отвечать всем кто что-то говорит тебе? Почему возможность говорить с царем становится, согласно твоей позиции, обязанностью говорить с царем?

Должен ли я превозмогать себя и общаться со всеми, кого я считаю полными мудаками?

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

Правильно ли я понимаю, надо постоянно бегать по улицам и пытаться во всех узреть рациональное зерно?

Не пытайся играть в аналогии, у тебя не получается.

Например, из двух абзацев я выбросил где-то около 10% текста и получился следующий пост:

Когда их спрашиваешь «а почему у тебя явные касты?», «а почему у тебя явное &для ссылок?», «а почему у тебя явное написание типа возврата?» и ещё тысячи почему.
Что они отвечают? Правильно - они сообщают, транслируя пропаганду «у нас всё явное и это правильно». Но в моментах, где-то неявное (допустим пересоздание переменной), тот же return, то тут они начинают кукарекать совершенно иное. Оказывается - явное уже ненужно и мусор.

Можешь даже попытаться ответить на его аргументы, если сможешь. Если попросишь, я даже смогу передавать тебе его посты каждый раз, раз твоя тонкая натура не сможет воспринять их.

Если ты не можешь на лету, при чтении выполнять эти преобразования у себя в голове, то я серьезно сомневаюсь в твоих способностях, ведь завтра ты можешь отказаться читать чей-то в пост только из-за того, что в нём будут неправильно расставлены запятые. А если на улице на тебя кто-то косо посмотрит, то ты, наверное, вообще забьешься в угол и будешь кричать: «ААА! Я считаю его полным мудаком, ведь он косо на меня посмотрел! Уберите его от меня кто-нибудь!!!»

Должен ли я превозмогать себя и общаться со всеми, кого я считаю полными мудаками?

Конечно ты ничего никому не должен, но попытки адептов полностью игнорировать его вопросы о целесообразности того или иного решения, принятого при проектировании раста, только из-за наличия слова «говно» в его постах, наводят на мысль, что эти самые адепты просто не знают, что ответить.

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

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

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

Для затравки. Тезис «код let v: Vec<_> = (0..6).collect(); свидетельствует об отсутствии вывода типов» - неверен.

.collect() собирает в любой контейнер, реализующий FromIterator, поэтому нужно указать в какой именно контейнер собирать. Что именно собирать будет определено с помощью вывода типов.

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

Конечно ты ничего никому не должен

Наконец-то, ты сам до всего дошел.

— Я понимаю Вашу иронию, профессор. Мы сейчас уйдём! Но я, как заведующий культотделом нашего дома…
— Заведующая…
— Заведующая… предлагаю вам взять несколько журналов — в пользу детей Германии! По полтиннику штука!
— Нет, не возьму.
— Но почему Вы отказываетесь?
— Не хочу.
— Вы не сочувствуете детям Германии?
— Сочувствую.
— А, полтинника жалко?!
— Нет.
— Так почему же?
— Не хочу.
vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Наконец-то, ты сам до всего дошел.

Классно ты проигнорировал остальную часть предложения, не говоря уже о всем сообщении. Ну ничего, я тебе помогу:

Конечно ты ничего никому не должен, но попытки адептов полностью игнорировать его вопросы о целесообразности того или иного решения, принятого при проектировании раста, только из-за наличия слова «говно» в его постах, наводят на мысль, что эти самые адепты просто не знают, что ответить.

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

Он не может нормально и кратко излагать мысли. Это проблема с беспорядком в голове. У него месяцы и годы стен говна, которые читать 1) долго 2) лень 3) что-то упустим.

Пускай начнет заново в совершенно новом посте наполненом исключительно техническим смыслом. Используя Markdown список.

Недостатки Rust:

P.S. Писать «адепты - петухи и мрази» пусть не утруждается печатать.

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

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

Из моего предыдущего сообщения:

Например, из двух абзацев я выбросил где-то около 10% текста и получился следующий пост:

Когда их спрашиваешь «а почему у тебя явные касты?», «а почему у тебя явное &для ссылок?», «а почему у тебя явное написание типа возврата?» и ещё тысячи почему. Что они отвечают? Правильно - они сообщают, транслируя пропаганду «у нас всё явное и это правильно». Но в моментах, где-то неявное (допустим пересоздание переменной), тот же return, то тут они начинают кукарекать совершенно иное. Оказывается - явное уже ненужно и мусор.

Н - непоследовательность (или неконсистентность, кому как больше нравится).

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

Можешь даже попытаться ответить на его аргументы, если сможешь

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

Почему shadowing («пересоздание переменной») неявный? «Неявный» здесь используется уже не в смысле «отсутствующий в исходном коде», а «невыдающий ошибок/предупреждений при компиляции». Почему так сделано? Видимо в Ocaml, из которого взяты некоторые идеи Rust’а, это не создавало проблем.

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

Because collect() is so general, it can cause problems with type inference. As such, collect() is one of the few times you'll see the syntax affectionately known as the 'turbofish': ::<>. This helps the inference algorithm understand specifically which collection you're trying to collect into.

Т.е. даже в мануале по этому говну написано, что может иметь проблемы с выводом типов.

К тому же, в данном случае это неважно - проблемы там глубже. Обо всём этом я уже тысячи раз писал. В целом эта проблема отражается в том - почему в этом говне нету вывода типов для функций, да и ни для чего нету.

Причина в том, что это мусорное говно затирает типы, а так же нету никаких преобразований типов. Не говоря уже о каком-то статическом диспатче.

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

Все обсосано давно.

Почему return неявный?

https://stackoverflow.com/a/51642696. Решили сделать такой компромисс. Обратное не работает? Global type inference глупая идея? Нет, работает вполне успешно в других ЯП. И имеет свои недостатки. Но решили сделать такой компромисс.

Мое личное мнение - пора вводить global type inference. В Haskell/OCaml никто не умер. Все равно через generics и зависимые типы можно сломать код далеко - проблема, которую local type inference вроде призван решать.

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

Это аргументы? Это вкусовщина.

Бездарность, это аргумент. Тупая ты шлюха, потому что это выдаётся за аргумент в твоей методички.

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

Нет, бездарность. Ты опять врёшь. Это мусорный костыль для блоков. Существует он только потому, что-бы родить говнолямбды ворованные.

Семантика этого говна так же ворованная из gnuc-блоков. Там так же нету return, но там это объявлено на уровне базовой семантики. У выражения есть результат.

Тебя, клоун, макают в дерьмо не из-за reutrn, а из-за отсутствия ; и неконсистентности.

К тому же, даже из того, что ты блеешь - это спащенная семантика gnuc-блоков. У тебя же всё не так. Блок может ничего не возвращать и это уже будет не выражение.

Если бы это было так, то ты бы обязан блок возвращать значение, что-бы он стал выражением. Но тогда всё твоё говно полывёт.

Почему shadowing («пересоздание переменной») неявный? «Неявный» здесь используется уже не в смысле «отсутствующий в исходном коде», а «невыдающий ошибок/предупреждений при компиляции». Почему так сделано? Видимо в Ocaml, из которого взяты некоторые идеи Rust’а, это не создавало проблем.

Почему ты, бездарность, выделяешь один пример и что-то блеешь про него?

Тут видно, что эта мразь манипулирует. Т.к. тебя обвиняют не в том, что есть какой-то пример. Тебя обвиняют в системности и тезисах базовых методичках, которые объясняют эту системность. То, что ты, бездарный клоун, придумал какое-то оправдание чему - это никак не касается системности.

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

Никто ни о какой системности не думал, а все эти оправдания «мы против неявного» были придуманы уже позже. Очевидно, что ими никто не руководствовался.

И тебя, шлюха, не спрашивают почему так сделано - я знаю почему. И я знают, что никто эти не руководствовался. Я тебя спрашиваю за пропаганду и её тезисы. И те противоречия, которые эти тезисы вызывают.

anonymous
()

Веселый у вас тред, господа.

Раст ещё очень молодой язычок, а уже оброс таким диким количеством костылей и непоследовательностей в семантике, не представляю, что будет через лет 5-10. Думаю к тому времени все адепты разбегутся на другие новомодные, хелловоролдные язычки со звездочками на гитхабе.

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

Тебя поимела пропаганда. Никакой говнораст нихрена не молодой. Ему более 10 лет. На сишке/крестах через 10 лет написали весь мир.

К тому же, 10 лет тогда и сейчас - это совершенно разные величины. Сейчас у шлюх есть халявный рантайм, llvm, тысячи готовых решений, которые можно воровать. Ворованный из С++ синтаксис, ворованная из llvm семантика.

А ведь в том же llvm её создавали(правда тоже лишь адаптировали С/С++ семантику), в том же С/С++ всё это создавалось. Создавалось с нуля. И в то время, когда столько много инструментария не было.

По-сути 10 лет тогда - это года 2-3 сейчас. Достаточно посмотреть на какие-нибудь недоязычки родившиеся сейчас. Всякие го там.

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

Ссарь ты такой обоссышь. Твою мамку в попец жахнули и к вечеру ты высрался в кустах.

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

Тебя поимела пропаганда. Никакой говнораст нихрена не молодой. Ему более 10 лет. На сишке/крестах через 10 лет написали весь мир.

Ну, я к тому, что Mozilla, «пытаясь» «решить» «проблемы» C++, создала костыльного монстра, программирование на котором на 98.7% состоит из вызова C-библиотек или написание биндингов к ним. А весь цивилизованный low-level мир, при этом, продолжает использовать проверенные десятилетиями решения в лице C и C++, и смотрит на Mozill'у и все расто-кодло, как на опущенных.

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

@vertexua, залогинься, будь так добр, а то и правда смешно ведь выглядишь.

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

На самом деле на всех 3х языках получилось примерно одинаково. Везде использовался ffast-math и О3 так или иначе.

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

Ну, я к тому, что Mozilla, «пытаясь» «решить» «проблемы» C++,

В этом я очень сомневаюсь. Я не верил ещё изначально, но теперь уже всё встало на свои места.

В целом какой-то креативный идиот в говнозиле родил этот гениальный план. А давайте ка мы вместо запила броузера(всё равно опущенные хоромом) будем придумывать 1) оправдания почему не запилили, 2) создадим целый штаб пропаганды и будет обрабатывать хомячьё, 3) выдумывать новые смыслы.

Что мы видим. Адепты мазилы действительно бездарные идиоты, мусорные жертвы пропаганды.

Говнозила продолжает рассказывать про супер-проблемы с++(правда почему у хрома их нет, хотя именно он опустил мозилу и её адептов). Про молодость говнораста. Про «вот-вот заживём».

Так же форсится тема. «гугл - зло», «безопасноть - наше всё».

Кстати, я думаю, что «безопасность» и была базой и раст появился именно из тезиса, а не тезис из раста.

И теперь говнозила пытается продать хомячкам маня-безопасность. С++ плохой, а раст безопасный. Правда он нихрена не безопасный и говнофокс на 98% состоит из С/С++(на самом деле сам раст на 99% состоит из С/С++, так что реально там раста не 2%, а 1% от 2%).

Гугл опасный, правда говнозила кормиться с руки гугла.

Безопасность и свободка - два кита, на которых можно доить бездарное хомячьё. Хомячьё будет жрать любое говно - главное расскажи ему про свободку/безопасность, а ещё лучше пообещай.

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