STL - самый быстрый контейнер
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 20.08.03 13:46
Оценка:
Доброго времени суток всем нам!

Требуется контейнер, максимально быстрый по совокупности двух операций:
1) поэлементное добавление в конец;
2) единовременный убой всех элементов.
Число элементов может достигать десятков тысяч, но заранее оно неизвестно.

Что посоветуете? Программа на MFC, но CArray и CList производят плачевное впечатление.
- Искренне ваш, Поросенок Пафнутий
Re: STL - самый быстрый контейнер
От: Анатолий Широков СССР  
Дата: 20.08.03 13:50
Оценка: +1
std::vector
Re[2]: STL - самый быстрый контейнер
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 20.08.03 13:57
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>std::vector


Спасибо за оперативный ответ. Завтра я, конечно, и сам это потрогаю, но насколько он быстрее CArray Вы не навскидку сказать не можете?
- Искренне ваш, Поросенок Пафнутий
Re[3]: STL - самый быстрый контейнер
От: Анатолий Широков СССР  
Дата: 20.08.03 14:02
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>std::vector


SDB>Спасибо за оперативный ответ. Завтра я, конечно, и сам это потрогаю, но насколько он быстрее CArray Вы не навскидку сказать не можете?


Не проводил замеры, но точно могу сказать, что при правильном прогнозе (std::vector::reserve) вы получаете оптимильное быстродействие.
Re[4]: STL - самый быстрый контейнер
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 20.08.03 14:05
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>>std::vector


SDB>>Спасибо за оперативный ответ. Завтра я, конечно, и сам это потрогаю, но насколько он быстрее CArray Вы не навскидку сказать не можете?


АШ>Не проводил замеры, но точно могу сказать, что при правильном прогнозе (std::vector::reserve) вы получаете оптимильное быстродействие.


Эх, если бы я знал, сколько надо reserv'нуть, я бы и с CArray'ем это сделал...
- Искренне ваш, Поросенок Пафнутий
Re[5]: STL - самый быстрый контейнер
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 20.08.03 14:08
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:


SDB>Эх, если бы я знал, сколько надо reserv'нуть, я бы и с CArray'ем это сделал...


тогда queue Class лучше всего.
Re: STL - самый быстрый контейнер
От: dkon  
Дата: 20.08.03 14:11
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Доброго времени суток всем нам!


SDB>Требуется контейнер, максимально быстрый по совокупности двух операций:

SDB>1) поэлементное добавление в конец;
SDB>2) единовременный убой всех элементов.
SDB>Число элементов может достигать десятков тысяч, но заранее оно неизвестно.

SDB>Что посоветуете? Программа на MFC, но CArray и CList производят плачевное впечатление.


std::deque или std::vector.
Re: STL - самый быстрый контейнер
От: Павел Кузнецов  
Дата: 20.08.03 14:11
Оценка: 17 (2)
Здравствуйте, SchweinDeBurg, Вы писали:

S> Требуется контейнер, максимально быстрый по совокупности двух операций:


S> 1) поэлементное добавление в конец;


std::deque
std::vector

S> 2) единовременный убой всех элементов.


std::vector

http://www.rsdn.ru/forum/Message.aspx?mid=107247
Автор: Павел Кузнецов
Дата: 28.09.02
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: STL - самый быстрый контейнер
От: Анатолий Широков СССР  
Дата: 20.08.03 14:12
Оценка:
SDB>Эх, если бы я знал, сколько надо reserv'нуть, я бы и с CArray'ем это сделал...

Ну, хорошо, можно и без прогноза, только важно понимать, что для последовательного размещения худшее из зол наличие нетривиального конструктора копирования. А так, врядли быстродействие одного будет значительно отличаться от другого.
Re[2]: STL - самый быстрый контейнер
От: Павел Кузнецов  
Дата: 20.08.03 14:22
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

S>> 1) поэлементное добавление в конец;

S>> 2) единовременный убой всех элементов.

ПК> http://www.rsdn.ru/forum/Message.aspx?mid=107247
Автор: Павел Кузнецов
Дата: 28.09.02


По этой ссылке: (1) — add_same, add_other; (2) — clear.
Так же следует принимать в рассчет скорость итерации (iterate).
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: STL - самый быстрый контейнер
От: WolfHound  
Дата: 20.08.03 16:15
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Требуется контейнер, максимально быстрый по совокупности двух операций:

SDB>1) поэлементное добавление в конец;
SDB>2) единовременный убой всех элементов.
SDB>Число элементов может достигать десятков тысяч, но заранее оно неизвестно.

Если требуется быстрое добавление/удаление с конца/начала то std::deque.
Но если в цикле происходит заполнение, очистка или есть возможность отправить контейнер на долговременное хранение то лучше std::vector ибо после того как он раздуется перестанет переалоцировать память.
Также в случае использования вектора можно слелать reserve на некое магическое число я бы поставил примерно в 1.5 раза больше среднего. Если не хватит то вектор удвоит размер буфера.
... << RSDN@Home 1.1 alpha 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: От модератора форума C/C++
От: Павел Кузнецов  
Дата: 20.08.03 17:07
Оценка:
Подветка с обсуждением системы оценок перенесена в форум "Обсуждение сайта"
http://rsdn.ru/forum/?mid=359251
Автор: Анатолий Широков
Дата: 20.08.03
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: STL - самый быстрый контейнер
От: Mechanicus Беларусь  
Дата: 21.08.03 10:16
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Требуется контейнер, максимально быстрый по совокупности двух операций:

SDB>1) поэлементное добавление в конец;
SDB>2) единовременный убой всех элементов.
SDB>Число элементов может достигать десятков тысяч, но заранее оно неизвестно.
SDB>Что посоветуете? Программа на MFC, но CArray и CList производят плачевное впечатление.
Если не известно сколько надо зарезервировать, то оптимальным вариантом, наверное, будет std::deque.Он всё таки "быстрее" растёт чем std::vector
... << RSDN@Home 1.1 beta 1 >>
Re[2]: STL - самый быстрый контейнер
От: Павел Кузнецов  
Дата: 21.08.03 10:32
Оценка:
Здравствуйте, Mechanicus, Вы писали:

M> Если не известно сколько надо зарезервировать, то оптимальным

M> вариантом, наверное, будет std::deque.Он всё таки "быстрее" растёт
M> чем std::vector

Очень сильно зависит от характеристик и количества элементов.
Зачастую std::vector оказывается быстрее, чем std::deque.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: STL - самый быстрый контейнер
От: plads_project  
Дата: 21.08.03 11:37
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Требуется контейнер, максимально быстрый по совокупности двух операций:

SDB>1) поэлементное добавление в конец;
SDB>2) единовременный убой всех элементов.
SDB>Число элементов может достигать десятков тысяч, но заранее оно неизвестно.

Слова про то, что количество заранее не известно, тут выжны. Если не принимать в расчет возможность "застолбить" террабайт памяти, чтобы уж наверняка хватило , то выходит вот что:
Если конструктор копирования у элемента тормозной (например требует выделения относительно больших кусков памяти, соединения с БД, форматирования диска ), то std::list, иначе std::vector.
Re[2]: STL - самый быстрый контейнер
От: plads_project  
Дата: 21.08.03 11:46
Оценка:
Здравствуйте, plads_project, Вы писали:

_>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>Требуется контейнер, максимально быстрый по совокупности двух операций:

SDB>>1) поэлементное добавление в конец;
SDB>>2) единовременный убой всех элементов.
SDB>>Число элементов может достигать десятков тысяч, но заранее оно неизвестно.

_>Слова про то, что количество заранее не известно, тут выжны. Если не принимать в расчет возможность "застолбить" террабайт памяти, чтобы уж наверняка хватило , то выходит вот что:

_>Если конструктор копирования у элемента тормозной (например требует выделения относительно больших кусков памяти, соединения с БД, форматирования диска ), то std::list, иначе std::vector.

Дополнение:
Еще есть std::deque, но в данном случае он должен быть близок по показателям к std::list (по крайней мере его реализация в VS 7.1).
Re[3]: STL - самый быстрый контейнер
От: qube  
Дата: 21.08.03 11:51
Оценка:
Здравствуйте, plads_project, Вы писали:

std::list не проходит из-за требования быстрого удаления всех эелементов сразу. А скорость конструктора копирования тут не при чем, он вызывается при вставке в любой контейнер.
Re[3]: STL - самый быстрый контейнер
От: Павел Кузнецов  
Дата: 21.08.03 11:54
Оценка:
Здравствуйте, plads_project, Вы писали:

pp> Еще есть std::deque, но в данном случае он должен быть близок по

pp> показателям к std::list (по крайней мере его реализация в VS 7.1).

У Dinkumware (то, что используется в VS 7.1) std::deque на подобных задачах обычно дает
показатели раза в два получше, чем std::list, и раза в четыре побыстрее на итерации.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: STL - самый быстрый контейнер
От: skyline Россия  
Дата: 22.08.03 10:58
Оценка:
Здравствуйте, Павел Кузнецов
ПК>Зачастую std::vector оказывается быстрее, чем std::deque.
А где это наблюдается?
Вроде бы deque шустрее на больших объёмах данных, чем vector, так как память ему не обязательно выделять единым блоком, что опять таки ведёт к увеличению скорости.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Re[4]: STL - самый быстрый контейнер
От: Павел Кузнецов  
Дата: 22.08.03 11:45
Оценка:
Здравствуйте, skyline, Вы писали:

ПК>> Зачастую std::vector оказывается быстрее, чем std::deque.


s> А где это наблюдается?


Простой тест по добавлению элементов в конец последовательности.

s> Вроде бы deque шустрее на больших объёмах данных, чем vector, так как

s> память ему не обязательно выделять единым блоком, что опять таки
s> ведёт к увеличению скорости.

Зато "обслуга" у std::deque тяжелее... Т.е., конечно, в пределе, на достаточно больших объемах,
std::deque таки обгонит std::vector. Вопрос в том, что является "достаточно большими объемами".
Например, у Dinkumware на простых структурах (два int) на моих тестах std::vector оказывался
быстрее вплоть до 10 000 элементов.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.