|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Решил освоить Rust, с коллегами зашел разговор "за быстродествие", накидали тест и оказалось, что nodejs не особо то медленнее в синтетическом бенчмарке. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
На моей машине время такое: Код: plaintext 1. 2. 3. 4. 5.
Профиль билда - по-умолчанию. nodejs показала чуть большее время: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
hett@hett-pc:/data/projects/rust-test$ node ~/tmp/node.js Execution time: 5796ms Result: 90.48374105540306 PS^ на cpp удалось получить ~700 мс, для сравнения. Код: plaintext 1. 2. 3. 4.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Понимаю, что тест банальный, но хотелось бы понять, почему rust делает это относительно медленно? Кстати на java 11 и golang время примерно то же что у Rust. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 12:20 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Писал, писал ответ.... и потом до меня дошло. Тест совершенно не корректен. C++ оптимизатор вполне мог ВЕСЬ цикл выполнить в Compile time и в момент Execute просто печатать уже готовый результат. В свое время так обжигался. Нужно было время попрофилировать, но оптимизирующий компилятор многие циклы просто предвычислил. По хорошему, нужно ассемблерный код после C++ смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 13:12 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Писал, писал ответ.... и потом до меня дошло. Тест совершенно не корректен. C++ оптимизатор вполне мог ВЕСЬ цикл выполнить в Compile time и в момент Execute просто печатать уже готовый результат. В свое время так обжигался. Нужно было время попрофилировать, но оптимизирующий компилятор многие циклы просто предвычислил. По хорошему, нужно ассемблерный код после C++ смотреть. Ну он что-то делал 700 мс все же. Если просто складывать числа, то и компилятор раста оптимизирует до 0 мс. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 13:37 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Hett, почти наверно, в степень возводил. вот набери в окне Immediate Excel Код: vbnet 1.
excel90,4837410553825 1,10517092721435 да, и интереснее то, что у rust c nodejs уж больно подозрительно точный результат, чтобы предполагать отсутствие промежуточных оптимизаций. Боюсь, даже сохранение промежуточных результатов в расширенной мантиссе на 64 бита не выглядит оправданием отсутствия катастрофы в точности вычисления. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 14:01 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
booby, вчера только читал, кстати, статью Кахана, где он сильно печалился, что всё пропало - и образование, и вычисления на вещественных числах двоичной точности. Никто, мол, уже не знает, и не догадывается, как подозревать - правильное число выдала программа, или нет, и какова потеря точности в реализованном вычислении. Почему такой ответ? А вот потому, что компьютер так сказал. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 14:06 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Кстати, rust такой цикл разворачивает по 5 делений за итерацию, а GCC нет. https://godbolt.org/z/Y6sYM3dbP Интересно, в вашей версии что там. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 15:00 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Кстати, rust такой цикл разворачивает по 5 делений за итерацию, а GCC нет. https://godbolt.org/z/Y6sYM3dbP Интересно, в вашей версии что там. О, крутецкий ресурс, спасибо. Если использовать o2, то программа собранная g++ получается медленнее чем у Rust (и понятно теперь почему). А если указать -Ofast, то функция выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Он делает половину цикла, а потом умножает на 2 что ли? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 16:25 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Хотя нет, тут что-то вообще хитрое. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 16:38 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Hett, это и есть возведение в степень сначала, причем в лоб, без алгоритмических изысков, но с применением векторного умножения, а потом однократное деление ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 16:44 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
насчет разворота на 5 - это не rust, это clang под растом на 5 разворачивает. msvc в аналогичных условиях разворачивает на 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 16:47 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Hett Понимаю, что тест банальный, но хотелось бы понять, почему rust делает это относительно медленно? Кстати на java 11 и golang время примерно то же что у Rust. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 18:23 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
я правильно понимаю, что g++ оптимзировал код до формулы, но при этом 500000000 получает сложением 1 в цикле? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 18:43 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Hett Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
я правильно понимаю, что g++ оптимзировал код до формулы, но при этом 500000000 получает сложением 1 в цикле? Нет. Учи ассемблер. Тут цикл. После устранения всех косяков: На таких тривиальных примерах Раст будет хорош как и любой llvm-компилятор. Но в реальности у него есть родовая травма - заимствование не позволяет нормально работать в многопоточке. Появляются лишние копирования общих данных. Впрочем, это не такая уж и проблема, если сравнивать с нодой и питоном =) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 23:27 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Siemargl Но в реальности у него есть родовая травма - заимствование не позволяет нормально работать в многопоточке. Появляются лишние копирования общих данных. Rc и Arc (Reference Count и Atomic Reference Count) не помогают? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 23:44 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Андрей Юниор Siemargl Но в реальности у него есть родовая травма - заимствование не позволяет нормально работать в многопоточке. Появляются лишние копирования общих данных. Rc и Arc (Reference Count и Atomic Reference Count) не помогают? RC дороже даже чем GC. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2021, 23:57 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Siemargl Андрей Юниор пропущено... Rc и Arc (Reference Count и Atomic Reference Count) не помогают? RC дороже даже чем GC. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2021, 00:18 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
kealon(Ruslan) Siemargl пропущено... Это небесплатно, и даже очень. RC дороже даже чем GC. Дороже и сильно - ГЦ это неблокирующая сама себя зачистка "оптом". ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2021, 00:30 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Siemargl, что ж они там десятилетия сочиняют кто во что горазд? GC хорошо только на функциональщине пашет, так как циклов нету принципиально может вы путаете с пуловым выделением? там действительно, оптом и сразу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2021, 08:30 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Siemargl Дороже и сильно - ГЦ это неблокирующая сама себя зачистка "оптом". Не верится. Во-первых, не верится, что владение сильно (в большом количестве задач) мешает многопоточности. Во-вторых, если применять Rc/Arc, то не верится, что будет много накладных расходов. Есть какие-то материалы на эту тему по расту/свифту/etc? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2021, 09:45 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Siemargl ... Дороже и сильно - ГЦ это неблокирующая сама себя зачистка "оптом". AFAIK была В последней Java новомодный G1 garbage коллектор уже блокировать умудряется ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2021, 14:17 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
По данному кейсу сложно делать общие выводы о Rust IMHO. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2021, 14:51 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Андрей Юниор Siemargl Дороже и сильно - ГЦ это неблокирующая сама себя зачистка "оптом". Не верится. Во-первых, не верится, что владение сильно (в большом количестве задач) мешает многопоточности. Во-вторых, если применять Rc/Arc, то не верится, что будет много накладных расходов. Есть какие-то материалы на эту тему по расту/свифту/etc? В С++ же shared_ptr тоже ARC. P.S. Кстати, потестить разные подходы к выделению памяти GC/ARC/ORC(nim) было бы интересно, но сложно придумать адекватный тесткейз. Например в C# в цикле 50кк раз string += "x" кладет ГЦ на лопатки. Вот кстати простые тесты https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/swift-gpp.html ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2021, 16:26 |
|
Rust - быстродействие
|
|||
---|---|---|---|
#18+
Хотя нет, не стоит на benchmarksgame смотреть - там код неидиоматичный и нестандартный. Арены итп. Статья про драйвера , тут и Раст есть кстати. СвифтA total of 76% of the CPU time is spent incrementing and decrementing reference counters. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2021, 16:40 |
|
|
start [/forum/topic.php?fid=16&fpage=3&tid=1339662]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 265ms |
total: | 419ms |
0 / 0 |