2015-01-11 2 views
5

я следующая программа Ржавчина (rustc 1.0.0-ночные (44a287e6e 2015-01-08 17:03:40 -0800)):Почему эта ржавчина медленнее, чем мой похожий Python?

use std::io::BufferedReader; 
use std::io::File; 

fn main() { 
    let path = Path::new("nc.txt"); 
    let mut file = BufferedReader::new(File::open(&path)); 
    let lines: Vec<String> = file.lines().map(|x| x.unwrap()).collect(); 
    println!("{}", lines[500]); 
} 

Согласно примеру, на http://doc.rust-lang.org/std/io/ выше путь вытягивать строки файла в вектор строк. Я выбрал вывод 500-й линии.

Чтобы решить ту же задачу в Python Я написал следующее:

#!/usr/local/bin/python3 

def main(): 
    with open('nc.txt', 'r') as nc: 
     lines = nc.read().split('\n') 
    print("{}".format(lines[500])) 

if __name__ == '__main__': 
    main() 

При запуске скомпилированного Ржавчина и время, я получаю это:

[email protected] $ time ./test 
A declaration of independence by Kosovo will likely bring a similar declaration from Georgia's breakaway Abkhazia region, which Russia could well recognize. 

./test 1.09s user 0.02s system 99% cpu 1.120 total 

Запуск Python дает:

[email protected] $ time ./test.py 
A declaration of independence by Kosovo will likely bring a similar declaration from Georgia's breakaway Abkhazia region, which Russia could well recognize. 
./test.py 0.05s user 0.03s system 90% cpu 0.092 total 

Я знаю, что println! является макросом, который расширяется до более сложных

::std::io::stdio::println_args(::std::fmt::Arguments::new({ 
    #[inline] 
    #[allow(dead_code)] 
    static __STATIC_FMTSTR: &'static [&'static str] = &[""]; 
    __STATIC_FMTSTR 
}, 
&match (&lines[500],) { 
    (__arg0,) => [::std::fmt::argument(::std::fmt::String::fmt, __arg0)], 
})); 

Тем не менее, это не похоже на то, что может вызвать больше секунды дополнительного времени выполнения. Действительно ли эти фрагменты кода не похожи? Я неправильно истолковал наиболее эффективный способ читать строки в вектор и выводить один из них?

Для справки nc.txt обладает следующими свойствами:

[email protected] $ du -hs nc.txt 
7.5M nc.txt 
[email protected] $ wc -l nc.txt 
    60219 nc.txt 
+0

Используйте '' strace' или ltrace', чтобы выяснить, что Происходило –

+5

ли вы компилируете с оптимизациями ('rustc -О foo.rs')? – Dogbert

+0

Да, вероятно, вы не используете оптимизации. Если вы используете Cargo, запустите 'load build -release'. –

ответ

9

построить его с флагами оптимизации.

cargo run --release 
Смежные вопросы