Является ли создание большого Vec, полного последовательного U64, быстрее с помощью loop и push () или через collect ()? - PullRequest
2 голосов
/ 04 мая 2019

Я ищу наиболее эффективный способ сделать это, поскольку мне нужно создать вектор из 600 000 u64 целых чисел.

Вот моя первая попытка:

fn latest_ids(current_id: u64, latest_id: u64) -> Vec<u64> {
    let mut ids: Vec<u64> = vec![];
    let mut start = current_id;
    while !(start >= latest_id) {
        start += 1;
        ids.push(start);
    }
    ids
}

Вторая попытка:

fn latest_ids(current_id: u64, latest_id: u64) -> Vec<u64> {
    let ids: Vec<u64> = (current_id+1..latest_id).collect();
    ids
}

Вторая версия намного короче / чище, но я не уверен, насколько эффективной будет collect()?Или, может быть, есть лучший способ?

1 Ответ

1 голос
/ 04 мая 2019

Если вы когда-либо сомневаетесь в производительности в Rust, не забудьте о тестах .

#![feature(test)]

extern crate test;

#[cfg(test)]
mod tests {
    use test::Bencher;

    const CURRENT_ID: u64 = 1;
    const LATEST_ID: u64 = 60000;

    #[bench]
    fn push(b: &mut Bencher) {
        b.iter(|| {
            let mut ids: Vec<u64> = vec![];
            let mut start = CURRENT_ID;

            while !(start >= LATEST_ID) {
                start += 1;
                ids.push(start);
            }
        });
    }

    #[bench]
    fn collect(b: &mut Bencher) {
        b.iter(|| {
            let _ids: Vec<u64> = (CURRENT_ID + 1..LATEST_ID).collect();
        });
    }
}

Бег cargo bench,

running 2 tests
test tests::collect ... bench:      29,931 ns/iter (+/- 6,842)
test tests::push    ... bench:      85,701 ns/iter (+/- 18,096)

Вы можете видеть, что collect на самом деле быстрее, чем push (намного).Я предполагаю, что это связано с push, иногда с необходимостью клонировать целое Vec и переместить его в другое место в памяти (хотя не цитируйте меня об этом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...