【发布时间】:2015-07-28 03:50:38
【问题描述】:
我想对 Rust 中的某些操作进行基准测试,但我似乎遇到了一些麻烦:
fn main(){
let needle = (0..100).map(|_| "b").collect::<String>();
let haystack = (0..100_000).map(|_| "a").collect::<String>();
println!("Data ready.");
for _ in 0..1_000_000 {
if haystack.contains( &needle ) {
// Stuff...
}
}
}
上述操作需要很长时间才能完成,而 Ruby 中的相同操作大约需要 4.5 秒:
needle = 'b' * 100
haystack = 'a' * 100_000
puts 'Data ready.'
1_000_000.times do
haystack.include? needle
end
我不禁认为我在做一些根本错误的事情。 在 Rust 中执行此操作的正确方法是什么?
rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
【问题讨论】:
-
对于那些想知道的人:在这种情况下,这不是优化问题。即使开启了优化,rust 版本的运行时间仍然很长。
-
我认为可能是
containsfor strings 采取了额外的措施来正确处理 UTF-8,但是,当我去检查containsfor 的速度时常规切片我发现 Rust 甚至没有一个 o_O。我幼稚的实现仍然非常缓慢。 -
自己试过了; Ruby 用了 5 秒,Rust 用了 7 分钟。快速了解一下 Rust 的实现(请参阅
libcore/str/pattern.rs)让 Rust 的搜索器看起来完全天真。如果 Ruby 实现在做任何事情,甚至有点聪明,那么 Rust 慢得多也就不足为奇了。无论哪种方式,看起来都值得提出性能问题。 -
顺便说一句,python 版本也和 Ruby 一样快。