I następujący program rdzy (rustc 1.0.0-nocnej (44a287e6e 08.01.2015 17:03:40 -0800))Dlaczego ta rdza wolniej niż mój podobny 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]);
}
Według przykładu na http://doc.rust-lang.org/std/io/ powyżej jest droga przeciągnąć linie pliku do wektora ciągów znaków. Wrzuciłem wyjście z 500. linii.
W celu rozwiązania tego samego zadania w Pythonie Pisałem następujące:
#!/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()
Kiedy uruchomić skompilowany razem rdzy i to uzyskać to:
[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
Uruchamianie Pythona daje:
[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
wiem, że println!
jest makro, które rozszerza się bardziej złożone
::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)],
}));
Mimo, że nie wydaje się takie rzeczy, które powodują więcej niż sekundę dodatkowego czasu realizacji. Czy te fragmenty kodu nie są w rzeczywistości podobne? Czy źle zinterpretowałem najbardziej efektywny sposób czytania linii do wektora i wyprowadzania jednego z nich?
Dla porównania nc.txt
ma następujące właściwości:
[email protected] $ du -hs nc.txt
7.5M nc.txt
[email protected] $ wc -l nc.txt
60219 nc.txt
Zastosowanie '' ltrace' strace' lub dowiedzieć się, co jest happenning –
Czy skompilować z optymalizacje ON ('rustc -O foo.rs')? – Dogbert
Tak, prawdopodobnie nie korzystasz z optymalizacji. Jeśli używasz Cargo, uruchom 'kompilację ładunków - uwolnij". –