станд.:: вектор:: зарезервируйте потерю производительности

Нет никакого понятия хостов или IP-адресов в библиотеке стандарта JavaScript. Таким образом, необходимо будет получить доступ к некоторому внешнему сервису искать имена узлов для Вас.

я рекомендую разместить cgi-мусорное-ведро, которое ищет IP-адрес имени узла и доступа это с помощью JavaScript.

6
задан pmr 16 November 2009 в 15:23
поделиться

6 ответов

Реализация GCC reserve () выделяет точное количество элементов, а push_back () будет увеличивать внутренний буфер экспоненциально, удваивая его, поэтому вы побеждаете экспоненциальный рост и принудительно перераспределяете / копируете на каждой итерации. Запустите тест под ltrace или valgrind и посмотрите количество вызовов malloc () .

24
ответ дан 8 December 2019 в 02:08
поделиться

Вы используете reserve () , только если заранее знаете количество элементов. В этом случае резерв () пространство для всех элементов сразу.

В противном случае просто используйте push_back () и полагайтесь на стратегию по умолчанию - она ​​перераспределится в геометрической прогрессии и значительно сократит количество перераспределений за счет немного неоптимального потребления памяти.

7
ответ дан 8 December 2019 в 02:08
поделиться

Когда std :: vector необходимо перераспределить, он увеличивает размер выделения на N * 2, где n - его текущий размер. Это приводит к логарифмическому количеству повторных блоков по мере роста вектора.

Если вместо этого std :: vector увеличивает выделенное пространство на постоянную величину, количество повторных блоков будет расти линейно по мере роста вектора.

What you ' ve done, по сути, заставляет вектор расти на постоянную величину 3, что означает линейный рост. Линейный, очевидно, хуже логарифмического, особенно с большими числами.

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

Тем не менее, вы можете принять во внимание комментарии Херба Саттера о предпочтении std :: deque over vector www.gotw.ca/gotw/054.htm

4
ответ дан 8 December 2019 в 02:08
поделиться

Используйте только резерв, если заранее знаете, сколько места он будет использовать.

Резерву нужно будет скопировать весь ваш вектор ...

Если вы выполните push_back и vector слишком мал, тогда он будет делать резерв (vec.size () * 2).

Если вы заранее не знаете, насколько большим будет ваш вектор, и если вам нужен произвольный доступ, рассмотрите возможность использования std: : deque.

6
ответ дан 8 December 2019 в 02:08
поделиться

Если вы профилируете код, держу пари, вы увидите, что + = IS очень быстро, проблема в том, что резерв убивает вас. На самом деле вам следует использовать резерв только тогда, когда вы знаете, до какого размера вырастет вектор. Если вы можете угадать заранее, сделайте ОДИН резерв, иначе просто используйте push_back по умолчанию.

3
ответ дан 8 December 2019 в 02:08
поделиться

Переместить резерв за пределы добавления.

Каждый раз, когда вы вызываете «добавить», вы резервируете как минимум 3 дополнительных элемента. В зависимости от реализации вектора этот может увеличивать размер резервного массива почти каждый раз, когда вы вызываете "добавить". Это определенно вызовет разницу в производительности, которую вы описываете.

Правильный способ использования резерва выглядит примерно так:

vec.reserve(max*3);
for(int i=0; i<max; i++)
   add(i);
3
ответ дан 8 December 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: