我正在尝试使用以下代码衡量Vec
的{{1}}索引与[]
的速度:
.get(index)
但这会返回以下错误:
extern crate time;
fn main() {
let v = vec![1; 1_000_000];
let before_rec1 = time::precise_time_ns();
for (i, v) in (0..v.len()).enumerate() {
v[i]
}
let after_rec1 = time::precise_time_ns();
println!("Total time: {}", after_rec1 - before_rec1);
let before_rec2 = time::precise_time_ns();
for (i, v) in (0..v.len()).enumerate() {
v.get(i)
}
let after_rec2 = time::precise_time_ns();
println!("Total time: {}", after_rec2 - before_rec2);
}
我很困惑,为什么这不起作用,因为error: cannot index a value of type `usize`
--> src/main.rs:8:9
|
8 | v[i]
| ^^^^
error: no method named `get` found for type `usize` in the current scope
--> src/main.rs:17:11
|
17 | v.get(i)
| ^^^
应该给我一个索引,按其名称,我应该能够用来索引矢量。
答案 0 :(得分:6)
你,朋友,在这里非常困惑。
fn main() {
let v = vec![1; 1_000_000];
此v
的类型为Vec<i32>
。
for (i, v) in (0..v.len()).enumerate() {
v[i]
}
您正在迭代一系列索引,从0
到v.len()
,并使用enumerate
生成索引:
v
的类型为usize
v == i
,始终所以......的确,编译器是正确的,你不能在[]
上使用usize
。
程序“已修复”:
extern crate time;
fn main() {
let v = vec![1; 1_000_000];
let before_rec1 = time::precise_time_ns();
for i in 0..v.len() {
v[i]
}
let after_rec1 = time::precise_time_ns();
println!("Total time: {}", after_rec1 - before_rec1);
let before_rec2 = time::precise_time_ns();
for i in 0..v.len() {
v.get(i)
}
let after_rec2 = time::precise_time_ns();
println!("Total time: {}", after_rec2 - before_rec2);
}
但是,我会添加免责声明,如果我是编译器,这个无用的循环将被优化为noop。如果在使用--release
进行编译后,您的计划报告0
,则会发生这种情况。
Rust已内置benchmarking support,我建议您使用它而不是采用天真的方式。并且......你还需要检查发出的组件,这是确保你测量你的想法的唯一方法(优化编译器就像那样棘手)。