Как я могу улучшить производительность моего кода Rust по сравнению с кодом Python? - PullRequest
0 голосов
/ 21 октября 2019

Как я могу улучшить производительность моего кода Rust, поскольку Python занимает около 5 секунд, а Rust - 7 секунд.

Я использую build --release

Код Rust

fn main() {
    let mut n = 0;

    loop {
        n += 1;
        println!("The value of n is {}", &n);
        if n == 100000 {
            break;
        }
    }
}

Код Python3

n = 0
while True:
   n+=1
   print("The value of n is ",n)
   if n == 100000:
       break

1 Ответ

4 голосов
/ 21 октября 2019

Если я правильно помню, println блокирует стандартный вывод. Взятые из ошибок производительности Rust :

[...] макросы по умолчанию print! блокируют STDOUT для каждой операции записи . Поэтому, если у вас текстовый вывод большего размера (или ввод из STDIN), вы должны заблокировать вручную.

This:

let mut out = File::new("test.out");
println!("{}", header);
for line in lines {
    println!("{}", line);
    writeln!(out, "{}", line);
}
println!("{}", footer);

многократно блокирует и разблокирует io :: stdout и выполняетлинейное число (потенциально небольшое) записывает как в стандартный вывод, так и в файл. Ускорьте его с помощью:

{
    let mut out = File::new("test.out");
    let mut buf = BufWriter::new(out);
    let mut lock = io::stdout().lock();
    writeln!(lock, "{}", header);
    for line in lines {
        writeln!(lock, "{}", line);
        writeln!(buf, "{}", line);
    }
    writeln!(lock, "{}", footer);
}   // end scope to unlock stdout and flush/close buf> 

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...