Skip to content

Vec::extend generates suboptimal code with .map #37232

Closed
@arielb1

Description

@arielb1

Meta

$ rustc -V
rustc 1.14.0-nightly (a3bc191b5 2016-10-10)

STR

#![crate_type="rlib"]
#![feature(test)]

extern crate test;

pub fn example_slow(l: &[(u32, u32)]) -> Vec<u32> {
    let mut result = Vec::with_capacity(l.len());
    result.extend(l.iter().map(|x| x.0));
    result
}

pub fn example_fast(l: &[(u32, u32)]) -> Vec<u32> {
    let mut result = Vec::with_capacity(l.len());
    for i in 0..l.len() {
        unsafe {
            *result.get_unchecked_mut(i) = l[i].0;
            result.set_len(i);
        }
    }
    result
}

#[bench]
fn bench_slow(b: &mut test::Bencher) {
    let data = [(0, 0); 16384];
    b.iter(|| {
        test::black_box(example_slow(test::black_box(&data)));
    });
}

#[bench]
fn bench_fast(b: &mut test::Bencher) {
    let data = [(0, 0); 16384];
    b.iter(|| {
        test::black_box(example_fast(test::black_box(&data)));
    });
}

Expected result

Both cases take the same amount of time

Actual result

$ ./slo-and-fast --bench

running 2 tests
test bench_fast ... bench:       7,490 ns/iter (+/- 271)
test bench_slow ... bench:      11,247 ns/iter (+/- 1,735)

test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured

Metadata

Metadata

Assignees

No one assigned

    Labels

    I-slowIssue: Problems and improvements with respect to performance of generated code.T-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions