Можно ли определить коэффициент приращения для перераспределений в std :: vec :: Vec? - PullRequest
0 голосов
/ 29 мая 2019

У меня медленно растет std::vec::Vec. Для каждого перераспределения вектора, когда он превышает его емкость, я хочу, чтобы перераспределение выполнялось статическим числом элементов.

Например, я изначально выделил вектор с 1024 элементами. Когда он достигнет своей емкости, я хочу, чтобы он был перераспределен еще на 32 элемента, и я хочу, чтобы этот параметр был настраиваемым.

Я ищу такую ​​функцию:

Vec::new(initial_capacity, capacity_increment);

Где:

initial_capacity = 1024;
capacity_increment = 32;

Доступна ли эта функция в Rust (ночью или стабильно)?

В документах говорится, что вы можете указать только начальную емкость, но неясно, как увеличивается размер при каждом перераспределении или можно ли изменить этот параметр. Фактически, в документах говорится, что Vec будет триплетом (pointer, capacity, length) не больше и не меньше .

Можно ли настроить конфигурацию приращения емкости?

Мне нужна эта функция, потому что у меня может быть большое количество элементов в векторе, и каждое перераспределение с помощью небольшого количества дополнительной емкости будет вызывать значительные задержки в процессах, которые я выполняю.

1 Ответ

3 голосов
/ 29 мая 2019

Нет, Vec (по состоянию на Rust 1.35) не предоставляет никакого механизма для управления стратегией перераспределения.

При вызове таких методов, как Vec::push, текущая реализация Vec удвоит емкость при заполнении вектора.Когда вы вызываете методы типа reserve_exact, текущая реализация Vec напрямую использует вашу емкость.

документы говорят, что Vec будет (pointer, capacity, length) триплет не больше и не меньше .

Это не исключает возможности очень осторожного расширения Vec.Например, Vec строится из RawVec, который параметризуется распределителем .Пока вы используете распределитель нулевого размера (например, Global), размер все равно будет истинным.

Это будет концептуально прямоиметь другой параметр типа для управления поведением изменения размера.Это, как говорится, вряд ли произойдет в ближайшее время.

Обходные пути

Если вам действительно нужно что-то подобное, вы можете создать новый тип вокруг Vec и вызвать reserve_exact на всехсоответствующие пункты.

struct MyVec<T> {
    v: Vec<T>,
    increment: usize,
}

impl<T> MyVec<T> {
    fn new(capacity: usize, increment: usize) -> MyVec<T> {
        MyVec {
            v: Vec::with_capacity(capacity),
            increment,
        }
    }

    fn push(&mut self, val: T) {
        if self.v.len() == self.v.capacity() {
            self.v.reserve_exact(self.increment);
        }
        self.v.push(val);
    }
}

Бесплатный совет

Не пытайтесь оптимизировать это, пока у вас нет эталонов, которые:

  1. Покажите, что это узкое место
  2. Может использоваться, чтобы доказать, что ваши "оптимизации" действительно ускоряют процесс

У меня может быть большое количество элементов в векторе и каждое перераспределение на некоторое небольшое количествоиз-за дополнительной мощности это приведет к значительным задержкам в процессах, которые я запускаю.

Я согласен с этим как с чувством интуиции, поэтому ваша идея так смущает меня:

Я хочу, чтобы он был перераспределен с 32 элементами больше

32 элемента - это небольшое количество дополнительной емкости;при этом создается впечатление, что вы снижаете производительность.

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