Arrays 切片数组或使用Iterator::skip更有效吗?
我想为片Arrays 切片数组或使用Iterator::skip更有效吗?,arrays,vector,rust,monads,slice,Arrays,Vector,Rust,Monads,Slice,我想为片[0+k..n]中的每个元素调用一个函数,其中k是偏移量,n是向量中的元素数。重要的是,我需要原始切片中元素的索引 我找到了两种方法: 使用枚举和跳过开始项 vec.iter().enumerate().skip(k).map(|(i, v)| (f(v), i)).min() 取一个子切片,将偏移量添加到“enumerate”的索引中 vec[k..].iter().enumerate().map(|(i, v)| (f(v), i + k)).min() 在这两种情况下,ve
[0+k..n]
中的每个元素调用一个函数,其中k
是偏移量,n
是向量中的元素数。重要的是,我需要原始切片中元素的索引
我找到了两种方法:
枚举
和跳过
开始项
vec.iter().enumerate().skip(k).map(|(i, v)| (f(v), i)).min()
vec[k..].iter().enumerate().map(|(i, v)| (f(v), i + k)).min()
在这两种情况下,
vec
都是字符串向量,f
返回字符串中的特定字符(v.chars().nth(偏移量)
)。以下哪种解决方案最有效?让我们以这段代码为例。这与您的示例类似,但更简单:
fn main() {
let items = ["a", "bb", "ccc", "dddd", "eeeee"];
let k = 3;
let one = items.iter().enumerate().skip(k).map(|(i, v)| (v.len(), i));
let two = items[k..].iter().enumerate().map(|(i, v)| (v.len(), i + k));
// Sanity check that the results are the same
let items1: Vec<_> = one.collect();
let items2: Vec<_> = two.collect();
println!("{}", items1 == items2);
}
运行经过优化编译的代码在10次运行中的平均时间如下:
另外,请注意,这两种方式都非常快。每件物品大约需要15或16纳秒。朋友之间的一纳秒是多少?我总是更喜欢切片而不是跳过
skip
,即使使用了skip的专门化(通过nth)。分析将告诉您答案。FWIW,货台
第二个货台的选择级别为3(k=371_223和10 mil项目):货台_跳过。。。实验台:67159746纳秒/国际热核实验堆(+/-4175973)实验台。。。工作台:67355711 ns/iter(+/-3690489)源文件供参考
fn main() {
let items = ["a", "bb", "ccc", "dddd", "eeeee"];
let items: Vec<_> = items.iter().cycle().take(10_000_000).collect();
let k = 371_223;
// let one = items.iter().enumerate().skip(k).map(|(i, v)| (v.len(), i));
let two = items[k..].iter().enumerate().map(|(i, v)| (v.len(), i + k));
// let items1: Vec<_> = one.collect();
let items2: Vec<_> = two.collect();
// println!("{}", items1.len());
println!("{}", items2.len());
}