LINUX.ORG.RU

Rust 1.7

 


1

6

Команда Rust рада объявить о выпуске новой стабильной версии Rust 1.7. Rust является системным языком программирования, сосредоточенным на безопасности, быстроте и многопоточности.

В этой версии основные изменения коснулись библиотек. Изменения, связанные с языком, готовятся в будущих выпусках.

В версии 1.7 были стабилизированы около 40 библиотечных функций и методов. Одним из стабилизированных API является поддержка задаваемых пользователем алгоритмов хеширования в типе HashMap<K, V> стандартной библиотеки. Теперь можно достигнуть значительного быстродействия за счёт возможности смены и использования более быстрого алгоритма хеширования.

Другие изменения:

  • <[T]>::clone_from_slice(), эффективный путь копирования данных из одного среза в другой срез.
  • Методы для удобства работы с Ipv4Addr и Ipv6Addr, такие как is_loopback(), который возвращает true или false, в зависимости от того, является ли адрес петлевым адресом, согласно RFC 6890.
  • Улучшения в CString, используемом в FFI.

Детальный RELEASE NOTES: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-170-2016-03...

>>> Анонс в блоге Rust

★★★★★

Проверено: tailgunner ()
Последнее исправление: cetjs2 (всего исправлений: 3)

Ответ на: комментарий от shkolnick-kun

А зовут тебя Isaac Gouy, и запускал ты это все на том же железе, что и...

facepalm.jpg

Там спинлок! Спинлок! Ау, мозг? Выходи на связь!

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

И чем спин-лок на трех потоках принципиально отличается от спин-лока на четырех?

Ядер у тебя сколько хоть?

Тем, что это критическая секция (с ней может работать только 1 поток), больше 3 потоков, прироста производительности не будет.

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

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

но язык - это ведь не религия

С каких пор?

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

Даже хардкорным крестовикам он жмёт

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

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

Предлагаешь заморозить все проекты и не начинать новые пока раст не дорастёт до этой версии? (:

Сейчас для массового пользователя, я бы попробовал java compact profile замутить для начала. Потом возможно стал бы колоться о кресты. Или может быть попробовал подход WebView как на Android, с разработкой интерфейса на HTML/JavaScript и каком-нибудь легком веб-движке, с бекендом на том же сыром Rust'e.

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

Его можно так использовать?

Chromium же используют, не вижу сложности допилить и Servo для таких задач.

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

Я знаю, что такое критическая секция.

Кстати, по какое-то загадочной причине у меня эта программа выдает сегфолт.... вот ведь незадача...

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

уже лет 5 не сидел в отладчике и не анализировал крешдампы. ЧЯНТД?

А вообще, местами лучше свалится вкору, чем разгребать последствия логических ошибок, от коих, кстати, раст тоже не застрахован. А это бóльшая часть ошибок есси чо.

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

Я знаю, что такое критическая секция.

Кстати, по какое-то загадочной причине у меня эта программа выдает сегфолт.... вот ведь незадача...

Ты ей N (25000000) не скормил.

anonymous
()

А может кто показать, как на расте будет выглядеть вот такой вот кодец

#include <iostream>
#include <thread>
#include <vector>

using namespace std;

size_t hardware_concurrency( )
{
    auto r = std::thread::hardware_concurrency;
    return r() ? r() : 4;
}

static const size_t max_threads = hardware_concurrency( );

int main( )
{
    std::vector<std::thread> threads;
    std::vector<std::uint32_t> data(1024);

    for( size_t i=0; i<max_threads; ++i ) {
        threads.emplace_back( [&data, i]( ) {
            size_t cnt = (data.size( ) / max_threads);
            size_t pos = cnt * i;
            for( ; cnt; --cnt ) {
                data[pos++] += i;
            }
        } );
    }

    for( auto &t: threads ) {
        if( t.joinable( ) ) t.join( );
    }

    for( auto &v: data ) {
        std::cout << " " << v;
    }

    return 0;
}

то есть тупо запускаются N потоков, которые работают (тут работа заключается в том, чтоб прибавить к каждому значение счетчика) с элементами одного вектора.

anonymous
()

Ёпты, на расте много чего уже написано. А я смотрел ещё версию 0.6

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

Короче у меня получилось так:

блоков 3 потоков 3 среднее время 1,863с
блоков 3 потоков 4 среднее время 2,049с
блоков 4 потоков 4 среднее время 1,856с

Времена плавают... Если кол-во блоков < кол-ва потоков узкое место - блоки, если кол-во блоков == кол-во потоков, узкое место - ГПСЧ.

shkolnick-kun ★★★★★
()
Ответ на: комментарий от kto_tama

я не удивлен

Информативность этого заявления может соперничать только с его важностью.

tailgunner ★★★★★
()

Вот ещё ссылка на анализ производительности двух клиентов, написанных на Go (Geth) и с нуля написанного на Rust (Parity) для сети Ethereum: https://blog.ethcore.io/performance-analysis/

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

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

Надо уточнять, что речь о C++11; а до этого была сплошная боль и слезы: ручное управление памятью или самопальные RAII смарт-поинтеры, отсутствие вывода типов, нет нормальной итерации по контейнерам, нет шаблонов с переменным числом аргументов, нет constexpr и шаблонов с константными аргументами, отсутствие лямбд, ничего вообще нет, даже хеш таблиц в стандартной библиотеке нет. Вот это был ад, а не «язык высокого уровня»...

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

Надо уточнять, что речь о C++11

Я специально уточнил про Си++0x. А вообще...

«Какое, милые, у нас
Тысячелетье на дворе?»

а до этого была сплошная боль и слезы

Даже до этого Си++ выглядел неплохо по сравнению с Си.

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

Я специально уточнил про Си++0x. А вообще...

Это ты потом где-то ниже по треду уточнил.

Даже до этого Си++ выглядел неплохо по сравнению с Си.

Ну да, конечно, сравнивать C++03 с портабельным ассемблером, коим Си и является, это очень хорошее сравнение. Претензия-то была на «высокий уровень»...

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

Надо уточнять, что речь о C++11

Я специально уточнил про Си++0x. А вообще...

Это ты потом где-то ниже по треду уточнил.

Да. Странно, что пришлось это делать - см. про тысячелетие.

Ну да, конечно, сравнивать C++03 с портабельным ассемблером, коим Си и является

Си - устаревшее убожество. Не надо оправдывать его тем, что он якобы является ассемблером.

Претензия-то была на «высокий уровень»...

И Си++ всегда был языком высокого уровня. Корявым, переусложненным, но тем не менее.

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

В архитектуре чего? Алгоритм один и тот же.

В архитектуре программы: В случае Rust там отдельные блокировки на rng и stdout, а в случае C там #pragma omp parallel for schedule(guided), то есть фактически биглок сразу и на ввод/вывод, и на генерацию случайных чисел, такие дела.

shkolnick-kun ★★★★★
()
Ответ на: комментарий от staseg

Тупо собрали варианты Васей Пупкиных и выложили лучший для каждого языка. Ты тоже можешь стать Васей!
staseg ★★★★ (04.03.2016 17:10:49)

Для 2pack-ов типа тебя там написано как писать програмки для бенча. Ржавые предсказуемо зачитились :) Вот смотри требования к бенчу: How should I implement programs?

You will probably come across people saying that the programs are not idiomatic («enough»). So read the description and write your own idiomatic program, without programming tricks.

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

Ржавые предсказуемо зачитились :)

Как будто что-то плохое.

И да, остальным никто не мешал. Лиспер так читил, что его с соревнований сняли.

tailgunner ★★★★★
()
Ответ на: комментарий от shkolnick-kun

В результате, пока один поток делает вывод остальные не могут генерировать случайные числа и наоборот.

А разгадка проста: нужно было использовать две переменных типа omp_lock_t для блокировок stdout и ГПСЧ...

shkolnick-kun ★★★★★
()

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

В 1980-х годы сишники наезжали на Паскаль... У американцев так заведено: продвигаешь свой товар — чмыри другие. Они не изменятся. Ибо сказала Леди Гага: «Американец — это диагноз».

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

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

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

Вот такая программа у меня выполняется уже за 1,703с, а не за 1.863, еще можно допилить работу с буферами...

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

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

$ diff -q fasta-log fasta2-log 
Файлы fasta-log и fasta2-log различаются
anonymous
()
Ответ на: комментарий от anonymous

Например, так.

extern crate num_cpus;
extern crate crossbeam;

fn ceiling_division(dividend: usize, divider: usize) -> usize {
    (dividend + divider - 1) / divider
}

fn main() {
    const SIZE: usize = 1024;
    let mut data = [0u32; SIZE];

    let cores = num_cpus::get();
    
    let per_core = ceiling_division(SIZE, cores);

    crossbeam::scope(|scope| {
        for chunk in data.chunks_mut(per_core) {
            scope.spawn(move || {
                for i in chunk.iter_mut() {
                    *i += 1;
                }
            });
        }
    });
    
    println!("{:?}", &data as &[u32]);
}

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

Не обратил внимания, что у тебя в массив сохраняется номер треда, фикс.

        for (thread_num, chunk) in data.chunks_mut(per_cpu).enumerate() {
            scope.spawn(move || {
                for i in chunk.iter_mut() {
                    *i = thread_num as u32;
                }
            });
        }

anonymous
()

Кто тут шарит в расте? Подскажите, как сложить два вектора. vector1 = vector1 + vector2 не работает.

Хочу переписать одну медленную питонячую процедуру.

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

Подскажите, как сложить два вектора.

Например так:

use std::ops::Add;

fn slice_sum<T:Add+Copy>(a: &[T], b: &[T]) 
                         -> Vec<<T as Add>::Output> {
    a.iter().zip(b).map(|(&x, &y)| x+y).collect()
}

Ссылка на play.rust-lang.org http://is.gd/7fAY6i там можно поиграться с этим кодом.

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

Например так:

Показалось, что он хочет объединить векторы. В таком случае, правильный результат: extend или append.

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

Показалось, что он хочет объединить векторы

Тогда http://is.gd/uLLXUG

    let mut v1 = vec![1., 2., 3.];
    let v2 = vec![2.];
    v1.extend_from_slice(&v2[..]);
red75prim ★★★
()
Ответ на: комментарий от red75prim

Сейчас Vec::extend_from_slice быстрее.

Логично. Не подумал.

Пока специализацию трейтов не доделали.

Что значит «не доделали»? Разве они вообще приступали?

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

уже лет 5 не сидел в отладчике и не анализировал крешдампы. ЧЯНТД?

Проект маленький. Или искали плохо. CVE-2015-8479, CVE-2015-6792, CVE-2015-6789, https://technet.microsoft.com/library/security/MS16-011 и так далее

Чтобы большой плюсовый проект, да без memory corruption... Так бывает только в NASA, и то с С++, обрезанным по самые исключения.

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

И .iter() убрать можно.

Ну если нам не жалко содержимое второго вектора.

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