powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Rust - быстродействие
24 сообщений из 24, страница 1 из 1
Rust - быстродействие
    #40071013
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил освоить Rust, с коллегами зашел разговор "за быстродествие", накидали тест и оказалось, что nodejs не особо то медленнее в синтетическом бенчмарке.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
use std::time::Instant;

fn main() {
    let mut result: f64 = 100.0;
    let started_at = Instant::now();

    for _ in 0..1000_000_000 {
        result /= 1.0000000001;
    }

    let elapsed = started_at.elapsed();

    println!("Execution time: {}ms", elapsed.as_millis());
    println!("result = {}", result)
}



На моей машине время такое:

Код: plaintext
1.
2.
3.
4.
5.
hett@hett-pc:/data/projects/rust-test$ cargo build --release
    Finished release [optimized] target(s) in 0.00s
hett@hett-pc:/data/projects/rust-test$ ./target/release/rust-test 
Execution time: 5528ms
result = 90.48374105540306

Профиль билда - по-умолчанию.

nodejs показала чуть большее время:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
let start = new Date();

let result = 100.0;
for (let i = 0; i < 1000000000; i++) {
    result /= 1.0000000001
}

let end = new Date() - start;
console.info("Execution time: %dms", end);
console.info("Result: %f", result);




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.
hett@hett-pc:/data/projects/rust-test$ g++ -Ofast -o /tmp/cpp-test /tmp/test.cpp
hett@hett-pc:/data/projects/rust-test$ /tmp/cpp-test
Time difference = 685[ms]
Result = 90.4837


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <iostream>
#include <chrono>

int main() {

    std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();

    double result = 100.0;
    for (long c = 0; c < 1000000000; c++) {
        result /= 1.0000000001;
    }

    std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

    std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() << "[ms]" << std::endl;
    std::cout << "Result = " << result;

    return 0;
}



Понимаю, что тест банальный, но хотелось бы понять, почему rust делает это относительно медленно?
Кстати на java 11 и golang время примерно то же что у Rust.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071024
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Писал, писал ответ.... и потом до меня дошло.

Тест совершенно не корректен.

C++ оптимизатор вполне мог ВЕСЬ цикл выполнить в Compile time и в момент Execute просто печатать уже готовый результат. В свое время так обжигался. Нужно было время попрофилировать, но оптимизирующий компилятор многие циклы просто предвычислил. По хорошему, нужно ассемблерный код после C++ смотреть.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071039
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Писал, писал ответ.... и потом до меня дошло.

Тест совершенно не корректен.

C++ оптимизатор вполне мог ВЕСЬ цикл выполнить в Compile time и в момент Execute просто печатать уже готовый результат. В свое время так обжигался. Нужно было время попрофилировать, но оптимизирующий компилятор многие циклы просто предвычислил. По хорошему, нужно ассемблерный код после C++ смотреть.


Ну он что-то делал 700 мс все же.
Если просто складывать числа, то и компилятор раста оптимизирует до 0 мс.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071052
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

почти наверно, в степень возводил.
вот набери в окне Immediate Excel

Код: vbnet
1.
Debug.Print 100# / (1.0000000001 ^ 1000000000); 1.0000000001 ^ 1000000000


excel90,4837410553825 1,10517092721435

да, и интереснее то, что у rust c nodejs уж больно подозрительно точный результат, чтобы предполагать отсутствие промежуточных оптимизаций.
Боюсь, даже сохранение промежуточных результатов в расширенной мантиссе на 64 бита
не выглядит оправданием отсутствия катастрофы в точности вычисления.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071054
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

вчера только читал, кстати, статью Кахана, где он сильно печалился, что всё пропало -
и образование, и вычисления на вещественных числах двоичной точности.

Никто, мол, уже не знает, и не догадывается, как подозревать - правильное число выдала программа, или нет,
и какова потеря точности в реализованном вычислении.
Почему такой ответ? А вот потому, что компьютер так сказал.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071077
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, rust такой цикл разворачивает по 5 делений за итерацию, а GCC нет.
https://godbolt.org/z/Y6sYM3dbP

Интересно, в вашей версии что там.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071096
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Кстати, rust такой цикл разворачивает по 5 делений за итерацию, а GCC нет.
https://godbolt.org/z/Y6sYM3dbP

Интересно, в вашей версии что там.


О, крутецкий ресурс, спасибо.
Если использовать o2, то программа собранная g++ получается медленнее чем у Rust (и понятно теперь почему).
А если указать -Ofast, то функция выглядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        mulpd   xmm0, xmm1
        add     eax, 1
        cmp     eax, 500000000
        jne     .L2
        movdqa  xmm1, xmm0
        psrldq  xmm1, 8
        mulpd   xmm0, xmm1
        mulsd   xmm0, QWORD PTR .LC2[rip]
        ret

Он делает половину цикла, а потом умножает на 2 что ли? :)
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071100
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, тут что-то вообще хитрое.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071103
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

это и есть возведение в степень сначала, причем в лоб, без алгоритмических изысков,
но с применением векторного умножения, а потом однократное деление
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071106
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчет разворота на 5 - это не rust, это clang под растом на 5 разворачивает.
msvc в аналогичных условиях разворачивает на 10.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071132
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett
Понимаю, что тест банальный, но хотелось бы понять, почему rust делает это относительно медленно?
Кстати на java 11 и golang время примерно то же что у Rust.
это не Rust делает медленно, это nodejs делает быстро, небанально компилит функции в исполнимый код. Что самое интересное, даже типозависимо.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071140
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        mulpd   xmm0, xmm1
        add     eax, 1
        cmp     eax, 500000000
        jne     .L2
        movdqa  xmm1, xmm0
        psrldq  xmm1, 8
        mulpd   xmm0, xmm1
        mulsd   xmm0, QWORD PTR .LC2[rip]
        ret

я правильно понимаю, что g++ оптимзировал код до формулы, но при этом 500000000 получает сложением 1 в цикле?
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071183
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        mulpd   xmm0, xmm1
        add     eax, 1
        cmp     eax, 500000000
        jne     .L2
        movdqa  xmm1, xmm0
        psrldq  xmm1, 8
        mulpd   xmm0, xmm1
        mulsd   xmm0, QWORD PTR .LC2[rip]
        ret

я правильно понимаю, что g++ оптимзировал код до формулы, но при этом 500000000 получает сложением 1 в цикле?

Нет. Учи ассемблер. Тут цикл.


После устранения всех косяков:

На таких тривиальных примерах Раст будет хорош как и любой llvm-компилятор.

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

Впрочем, это не такая уж и проблема, если сравнивать с нодой и питоном =)
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071189
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
Но в реальности у него есть родовая травма - заимствование не позволяет нормально работать в многопоточке. Появляются лишние копирования общих данных.

Rc и Arc (Reference Count и Atomic Reference Count) не помогают?
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071191
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Юниор
Siemargl
Но в реальности у него есть родовая травма - заимствование не позволяет нормально работать в многопоточке. Появляются лишние копирования общих данных.

Rc и Arc (Reference Count и Atomic Reference Count) не помогают?
Это небесплатно, и даже очень.

RC дороже даже чем GC.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071193
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
Андрей Юниор
пропущено...

Rc и Arc (Reference Count и Atomic Reference Count) не помогают?
Это небесплатно, и даже очень.

RC дороже даже чем GC.
RC не дороже, просто "платить" за него приходится сразу, а за GC - "возможно потом" (что на мелких программах превращается в никогда, но с долгими и крупными всё иначе)
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071195
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
Siemargl
пропущено...
Это небесплатно, и даже очень.

RC дороже даже чем GC.
RC не дороже, просто "платить" за него приходится сразу, а за GC - "возможно потом" (что на мелких программах превращается в никогда, но с долгими и крупными всё иначе)

Дороже и сильно - ГЦ это неблокирующая сама себя зачистка "оптом".
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071213
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,


что ж они там десятилетия сочиняют кто во что горазд?
GC хорошо только на функциональщине пашет, так как циклов нету принципиально

может вы путаете с пуловым выделением? там действительно, оптом и сразу
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071231
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
Дороже и сильно - ГЦ это неблокирующая сама себя зачистка "оптом".

Не верится. Во-первых, не верится, что владение сильно (в большом количестве задач) мешает многопоточности. Во-вторых, если применять Rc/Arc, то не верится, что будет много накладных расходов.

Есть какие-то материалы на эту тему по расту/свифту/etc?
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071317
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
...
Дороже и сильно - ГЦ это неблокирующая сама себя зачистка "оптом".

AFAIK была
В последней Java новомодный G1 garbage коллектор уже блокировать умудряется
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071355
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По данному кейсу сложно делать общие выводы о Rust IMHO.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071397
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Юниор
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
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071403
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, не стоит на benchmarksgame смотреть - там код неидиоматичный и нестандартный. Арены итп.

Статья про драйвера , тут и Раст есть кстати.

СвифтA total of 76% of the CPU time is spent
incrementing and decrementing reference counters.
...
Рейтинг: 0 / 0
Rust - быстродействие
    #40071580
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett, а попробуй сравнить на тех-же сорсцах Rust-Clang.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Rust - быстродействие
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]