【问题标题】:Why is this Rust slower than my similar Python? [duplicate]为什么这个 Rust 比我类似的 Python 慢? [复制]
【发布时间】:2015-01-11 09:55:56
【问题描述】:

我有以下 Rust 程序(rustc 1.0.0-nightly (44a287e6e 2015-01-08 17:03:40 -0800)):

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()

当我运行编译后的 Rust 并计时,我得到了这个:

rts@testbed $ 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 给出:

rts@testbed $ 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)],
}));

不过,这似乎不会导致超过一秒的额外执行时间。这些sn-ps的代码实际上不相似吗?我是否误解了将行读入向量并输出其中一个的最有效方法?

供参考nc.txt具有以下属性:

rts@testbed $ du -hs nc.txt 
7.5M    nc.txt
rts@testbed $ wc -l nc.txt
   60219 nc.txt

【问题讨论】:

  • 使用straceltrace 找出正在发生的事情
  • 您是否在 (rustc -O foo.rs) 上进行了优化?
  • 是的,您可能没有使用优化。如果您使用 Cargo,请运行 cargo build --release
  • 用优化编译绝对是答案。谢谢大家。 ./test 0.03s user 0.02s system 88% cpu 0.054 total
  • 你应该回答你自己的问题,这样其他用户就不必通过 cmets 寻找了。

标签: rust


【解决方案1】:

使用优化标志构建它。

cargo run --release

【讨论】:

    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多