Best way to concatenate vectors in Rust

前端 未结 3 759
渐次进展
渐次进展 2020-12-01 09:55

Is it even possible to concatenate vectors in Rust? If so, is there an elegant way to do so? I have something like this:

let mut a = vec![1, 2, 3];
let b = v         


        
3条回答
  •  悲&欢浪女
    2020-12-01 10:53

    Regarding the performance, slice::concat, append and extend are about the same. If you don't need the results immediately, making it a chained iterator is the fastest; if you need to collect(), it is the slowest:

    #![feature(test)]
    
    extern crate test;
    
    use test::Bencher;
    
    #[bench]
    fn bench_concat___init__(b: &mut Bencher) {
        b.iter(|| {
            let mut x = vec![1i32; 100000];
            let mut y = vec![2i32; 100000];
        });
    }
    
    #[bench]
    fn bench_concat_append(b: &mut Bencher) {
        b.iter(|| {
            let mut x = vec![1i32; 100000];
            let mut y = vec![2i32; 100000];
            x.append(&mut y)
        });
    }
    
    #[bench]
    fn bench_concat_extend(b: &mut Bencher) {
        b.iter(|| {
            let mut x = vec![1i32; 100000];
            let mut y = vec![2i32; 100000];
            x.extend(y)
        });
    }
    
    #[bench]
    fn bench_concat_concat(b: &mut Bencher) {
        b.iter(|| {
            let mut x = vec![1i32; 100000];
            let mut y = vec![2i32; 100000];
            [x, y].concat()
        });
    }
    
    #[bench]
    fn bench_concat_iter_chain(b: &mut Bencher) {
        b.iter(|| {
            let mut x = vec![1i32; 100000];
            let mut y = vec![2i32; 100000];
            x.into_iter().chain(y.into_iter())
        });
    }
    
    #[bench]
    fn bench_concat_iter_chain_collect(b: &mut Bencher) {
        b.iter(|| {
            let mut x = vec![1i32; 100000];
            let mut y = vec![2i32; 100000];
            x.into_iter().chain(y.into_iter()).collect::>()
        });
    }
    
    running 6 tests
    test bench_concat___init__           ... bench:      27,261 ns/iter (+/- 3,129)
    test bench_concat_append             ... bench:      52,820 ns/iter (+/- 9,243)
    test bench_concat_concat             ... bench:      53,566 ns/iter (+/- 5,748)
    test bench_concat_extend             ... bench:      53,920 ns/iter (+/- 7,329)
    test bench_concat_iter_chain         ... bench:      26,901 ns/iter (+/- 1,306)
    test bench_concat_iter_chain_collect ... bench:     190,334 ns/iter (+/- 16,107)
    

提交回复
热议问题