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

сравнивать нужно без fast-math, ибо это фича компилятора, а не языка.

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

Но раз уж есть llvm, то удобнее, сравнивать компиляторами основанными на нём и, по возможности, с одинаковыми, насколько это вообще возможно, уровнями оптимизации. У того же C++ Builder нет флага «-O3».

Только при прочих «равных» в последних примерах реализаций какое-то месиво получилось. Оно того стоило?

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

Сравнивать нужно тогда вообще без оптимизаций

В GCC не все оптимизации отключаются, в Clang наверное тоже.

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

Я имел ввиду, что хотя бы их не включать явно. Но при желании можно и поотключать принудительно всё что можно. Только в обоих случаях останется вопрос что вообще сравнивается и самое важное «зачем»? Это будет равносильно сферическому коню в вакууме и неуловимо у Джо одновременно.

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

Но при желании можно и поотключать принудительно всё что можно

Сильно сомневаюсь, что у GCC и Clang можно отключить все оптимизации… Даже принудительно.

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

поотключать принудительно всё что можно

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

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

Реализацию я пишу один раз.

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

Так надо оптимизации вообще выключать или нет? Это же свойство компилятора. И что с чем сравниваем то, если отключаем?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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