Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 切片数组或使用Iterator::skip更有效吗?_Arrays_Vector_Rust_Monads_Slice - Fatal编程技术网

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()
    
  • 取一个子切片,将偏移量添加到“enumerate”的索引中

    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次运行中的平均时间如下:

  • 153.6ms
  • 160.1ms
  • 因此,与我的直觉相反,第一个版本更快。我的基准测试完全可能是错误的,但这就是为什么您应该在实际代码上进行基准测试的原因


    另外,请注意,这两种方式都非常快。每件物品大约需要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());
    }