Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/75: Рейтинг темы: голосов - 75, средняя оценка - 4.91
0 / 0 / 2
Регистрация: 24.06.2012
Сообщений: 112

Что быстрее списки или вектор ?

08.06.2017, 19:36. Показов 14792. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Делаю приложение и очень важна скорость обработки данных, а нужно хранить динамические массивы.
В каком формате будет поэлементный перебор происходить быстрее? В частности нужно хранить комплексные числа.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.06.2017, 19:36
Ответы с готовыми решениями:

Что быстрее: i++ или ++i ?
Только что прочитала в интернете, что префиксный итератор быстрее, чем постфиксный. Так ли это? Если так и если в С++ все есть обьект, то...

Почему матрица на вектор умножается быстрее чем вектор на матрицу?
Почему матрица на вектор умножается быстрее чем вектор на матрицу?

Что быстрее assembler или c++
Вопрос от новичка. Что будет быстрее по скорости выполнения и на сколько: 1) сложить a+b на C++ или на assembler 2) умножить a*b на C++...

36
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
09.06.2017, 14:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
Не я, а теория вероятности может заявить, что в среднем половина этого резерва будет пустовать. Но, разумеется, это в среднем. Так то у вас есть отличный от нуля шанс что вектор всегда будет полностью использовать занятую "про запас" память. Просто этот шанс стремится к нулю.
Где хотябы одно подтверждение ваших слов? Вы лично проводили такое исследование?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.06.2017, 14:39
Цитата Сообщение от Celly Посмотреть сообщение
Где хотябы одно подтверждение ваших слов? Вы лично проводили такое исследование?
В учебнике по теории вероятности. Вместимость вектора - 2^N. Из них 2^(N-1) было хапнуто про запас. Реально использовано от 2^(N-1) до 2^N элементов. Значит, в среднем - (2^(N-1)+2^N)/2. Что и означает что половина хапнутого про запас простаивает. Можете, впрочем, провести численный эксперимент.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<vector>
 
int main()
{
    double res=0;
    const int repeatNumber=1024;
    for(int i=0;i<repeatNumber;++i)
    {
        //случайным образом выбранный размер вектора
        const int size=1+rand()%65536;
        //сколько под него выделено реально
        int capacity=1;
        while(capacity<size)
            capacity*=2;
        //из них было занято в надежде на "вдруг понадобится"
        int reserve=capacity/2;
        //из занятого простаивает
        double empty=double(capacity-size)/reserve;
 
        res+=empty;
    }
    //итого, в среднем простаивает
    std::cout<<res/repeatNumber;
}
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.06.2017, 14:55
Цитата Сообщение от Celly Посмотреть сообщение
Вы пытаетесь присвоить мне суждение о том что память вектора не перераспределяется.
Ничуть. При использовании reserve она не перераспределяется. Но может быть просто много не занятой полезно. Я это к тому, что наличие указателей, не самое слабое место списка. Новичок читает книжки и в них черным по белому пишут, что список экономнее, а вектор быстрее. В этом смысле Ваша аргументация - хороший задел для каши в голове. Я стараюсь создать стерео изображение. Взгляд с другой точки. Пусть думает.
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
09.06.2017, 15:09
Renji, Хороший теоретический пример. В данной задаче std::list всё равно будет использовать больше памяти.

Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
При использовании reserve она не перераспределяется
Вот вам так и хочется присвоить мне свои домыслы.

Цитата Сообщение от Celly Посмотреть сообщение
Если вам необходимо хранить динамический массив (из вашего описания, только для добавления), то я бы вам посоветовал посмотреть ещё в сторону std::deque т.к. он в специфику своей реализации позволит избежать перераспределений памяти в долгосрочной перспективе. Память в std::deque выделяется постранично, и в случае нехватки памяти в странице, будет выделена новая и связана как тот же двусвязный список.
Но, опять же, пока ещё никто не отменял std::vector::reserve().
Где здесь шла речь о том что reserve перераспределяет память? Здесь речь идёт о том что reserve позволят избежать лишних перераспределений.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.06.2017, 16:56
Цитата Сообщение от Celly Посмотреть сообщение
Вот вам так и хочется присвоить мне свои домыслы.
Нет. Я говорю о том что помимо служебной информации в векторе может быть полно незанятого (полезно) место и безо всякого перераспределения.
И о том, что список считается более экономным к памяти тоже сказал не для присваивания вам такого домысла. Нет у вас перегруженного оператора присваивания.
Цитата Сообщение от Celly Посмотреть сообщение
Где здесь шла речь о том что reserve перераспределяет память? Здесь речь идёт о том что reserve позволят избежать лишних перераспределений.
Я об этом и сказал. Я сказал буквально, что reserve не приводит к перераспределению. Заметив при этом, что он сразу захватывает память в объёме который на данный момент может и ненужен или может не потребоваться в дальнейшем. В конце концов, когда на стадии компиляции размер железобетонно известен то массив занимает памяти меньше всего.
В общем, вряд ли наш диалог далее полезен.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
09.06.2017, 17:01
https://baptiste-wicht.com/pos... deque.html
Conclusion
To conclude, we can get some facts about each data structure:

std::list is very very slow to iterate through the collection due to its very poor spatial locality.
std::vector and std::deque perform always faster than std::list with very small data
std::list handles very well large elements
std::deque performs better than a std::vector for inserting at random positions (especially at the front, which is constant time)
std::deque and std::vector do not support very well data types with high cost of copy/assignment
This draw simple conclusions on usage of each data structure:

Number crunching: use std::vector or std::deque
Linear search: use std::vector or std::deque
Random Insert/Remove:
...Small data size: use std::vector
...Large element size: use std::list (unless if intended principally for searching)
Non-trivial data type: use std::list unless you need the container especially for searching. But for multiple modifications of the container, it will be very slow.
Push to front: use std::deque or std::list
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.06.2017, 17:08
Croessmah, интересные и вполне ожидаемые результаты. С ростом размера объекта список становится луче везде где превалирует вставка либо обмен. Конечно легче просвопить указатели чем переписать большие объекты.
Но тут игнорируется самое большое преимущество вектора. В сортированном векторе возможен бинарный поиск и в ряде задач список пролетает как фанера. Или я не прав?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
09.06.2017, 17:22
Только в случае последовательного перебора в несортированных данных список хоть как-то приближаться к вектору, за исключением описанного тут - Что быстрее списки или вектор ? . А если нужно данные сортировать, то никакой список тут не подойдёт.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.06.2017, 17:28
Цитата Сообщение от TRam_ Посмотреть сообщение
А если нужно данные сортировать, то никакой список тут не подойдёт.
Он же и показывает, что для объектов очень большого размера, список как минимум не хуже. А вот по сортированным данным искать в списке тяжелее. Главная причина - последовательный доступ, в отличие от вектора/массива. Последовательное размещение массива - его главный козырь. Именно оно позволяет прямой доступ посредством адресной арифметики. И это позволяет очень быстро искать в сортированном массиве. Именно за сохранения этого преимущества вектор и борется путём перераспределения. Иначе можно было бы создавать кучу сцепленных массивов, например.
Ну то есть, они зеркальные близнецы. У одного последовательное размещение и произвольный доступ, а у другого произвольное размещение и последовательный доступ.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
09.06.2017, 18:27
Цитата Сообщение от IGPIGP Посмотреть сообщение
В сортированном векторе возможен бинарный поиск
Причем он быстрее, чем поиск в set/map.
В boost даже есть соответствующие контейнеры - flat_set/flat_map.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.06.2017, 19:22
Цитата Сообщение от Undisputed Посмотреть сообщение
А можно подробнее? Не могу понять, в чем разница. На мой взгляд скорость будет одинаковой т.к в итоге в обоих случаях все сводится к адрес-> данные
если сильно утрировать и совсем вкратце,
то для ускорения работы процессор использует кэш.
при обращении к данным, если данные уже есть в кэше,
то все отлично и быстро. но если данных там нет,
то они загружаются в кэш целой страничкой.

в векторе данные идут друг за дружкой:
1,2,3,4

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

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

эта ситуация известна как "кэш мисс" (кэш промах)
и является причиной значительного снижения быстродействия.


итого:
при последовательном переборе элементов,
лист с треском проигрывает вектору в эффективности.

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

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

лист же выгодно использовать,
только если нужно часто вставлять/удалять
на больших объемах данных.
2
0 / 0 / 2
Регистрация: 24.06.2012
Сообщений: 112
09.06.2017, 19:27  [ТС]
Воу-воу-воу, ребята! Что тут происходит?)
Память меня вроде пока не интересует, пусть ест сколько надо, главное время! Задачка для обработки кадров с веб-камеры.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.06.2017, 19:33
Цитата Сообщение от hoggy Посмотреть сообщение
лист же свои данные раскидывает по всей памяти.
Это самый большой ужас для любого контейнера. Но во многих задачах это не так. Вот простой пример. Есть поток данных. Сортируем и сохраняем на ходу. Почему менеджер памяти должен выделять откуда попало? Конечно, при сильной фрагментации может быть всё, но тогда и вектору придётся искать кусище за счёт свопинга на винчестер. А это уже не мимо кеша. Это реально очень долго.
В целом, сравнивать вектор и список вне контекста задачи - холивар.

Добавлено через 2 минуты
Цитата Сообщение от Leffken Посмотреть сообщение
Задачка для обработки кадров с веб-камеры.
Что значит обработки?
Может глобальный массив это оно?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.06.2017, 20:07
Цитата Сообщение от hoggy Посмотреть сообщение
первое же обращение к этой страничке, и 32кб (на самом деле на разных камнях по разному)
Не пугайте людей на пустом месте, данные подгружаются кеш-рядами по 32/64 байта. Причем, кеша того мегабайты. Во времена старого-доброго Доса оперативки столько не было, сколько сейчас кеш делают и ничего, 640 килобайт как известно хватало всем.
Цитата Сообщение от hoggy Посмотреть сообщение
даже более того: тесты показывают,
что при относительно малом количестве элементов,
вектор эффективнее даже в условиях,
когда нужно часто вставлять/удалять элементы.
Только, что-то мне подсказывает что виной этому не кеш-промахи, а стандартный аллокатор не оптимизированный под выделение нужных листу блоков фиксированного размера.
2
0 / 0 / 2
Регистрация: 24.06.2012
Сообщений: 112
09.06.2017, 20:22  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что значит обработки?
Может глобальный массив это оно?
Ну каждый кадр надо обработать попиксельно.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
09.06.2017, 20:34
Leffken, возьми вектор. А точнее вектор с данными + вектор указателей на начала каждой из строк. Или можно вектор векторов (но в него данные чуть сложнее вставлять/забирать). Потому что разрешение на камере в процессе приёма не меняется (или меняется при переключении режимов, т.е. оочень редко), лишние пиксели при обработке добавлять не нужно .

А так можно было бы даже обычным динамическим массивом обойтись, но если в программе используются исключения, безопаснее применять именно вектор.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.06.2017, 20:39
Цитата Сообщение от Leffken Посмотреть сообщение
Ну каждый кадр надо обработать попиксельно.
А потом? Архивировать и на винчестер?
Не могу найти кто предложил очередь. То есть, если нужно буферизовать, то дек можно. А если алгоритм обработки медленный, то с файлом можно работать. Это вопрос уже предметного обсуждения и не в новичковском разделе. имхо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2017, 20:39

Что быстрее: умножение или присваивание
Привет чтобы поменять знак у числа есть два способа. подскажите, который из них будет быстрее работать double var = 6.0; var *=...

Что быстрее массив или файл
Привет! Я тут занялся обработкой содержимого текстовых файлов для этого пишу класс отслеживающий положение курсора в файле (типа номер...

If или switch().case. Что быстрее
Есть два кода. Первый: if(a == 2) a += 2; if(a == 3) a+= 3; if(a == 4) a+=4; Второй:

Что быстрее - двоичный или текстовый файл?
Встал вопрос о времени чтения данных с диска, посему нужно выбрать быстрейший из этих двух способов хранения данных на внешнем носителе. ...

Что быстрее, операция присваивания или сравнения?
Всем доброго времени суток, такой вод у меня дурацкий вопрос сидит в голове, &quot;Что быстрее, операция присваивания или сравнения?&quot;. Вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru