Mikhail
И в дебаге лист все равно медленне должен быть
Stanislav
http://melpon.org/wandbox/permlink/I8MYeXPdo8tLvPAb
Stanislav
без всяких оптимизаций видно что лист все равно медленнее
Anonymous
Попробуй свой контейнер написать
Vladislav
Крылатый
Ну вектор быстрей по доступу, это логиншно жеж.
Dmitriy / დიმიტრი
Первый без -O3 второй с O3
Dmitriy / დიმიტრი
Dmitriy / დიმიტრი
Vladislav
wat
А, произвольный доступ - конечно.
Dmitriy / დიმიტრი
В первом случае list быстрее. Чудеса
серёжа
Anonymous
Dmitriy / დიმიტრი
Anonymous
Он сам по себе медленный
Крылатый
Юзай деку вместо листа)
Anonymous
Anonymous
Крылатый
http://melpon.org/wandbox/permlink/I8MYeXPdo8tLvPAb
Крылатый
242445 у deque и 696983 у list
Dmitriy / დიმიტრი
Юзай деку вместо листа)
Надо попробовать. Вообще мне просто на собеседовании спросили что быстрее и почему, а я как-то не смог ответить, теперь вот пытаюсь узнать из-за чего сложение по вектору быстрее
Крылатый
Вектор быстрей при доступе при последовательном доступе потому, что элементы последовательно в памяти расположены...
Крылатый
Но тут ваще непростой вопрос.)
Dmitriy / დიმიტრი
серёжа
Крылатый
Крылатый
Думаю, они хотели узнать, а почему последовательное расположение в памяти быстрей, чем рандомно...
Stanislav
Sum is: 25000426
List: 222145 microseconds.
Sum is: 25000426
Vector: 39549 microseconds.
Sum is: 25000426
List cycle: 205900 microseconds.
Sum is: 25000426
Vector cycle: 171095 microseconds.
если ком уто интересно vs2015
Stanislav
без всяких флагов оптимизаций
Dmitriy / დიმიტრი
Крылатый
Вот что я забыл, это по скорости изменения коллекции (добавление/удаление) быстрей...
Vladislav
list, заполненный в цикле добавлением в конец, тоже будет расположен в памяти относительно последовательно
Крылатый
Dmitriy / დიმიტრი
В общем надо про память читать. Я правильно понял?
Крылатый
И про проц)
Крылатый
Воще, кэш же!
Dmitriy / დიმიტრი
Я это себе туго представляю, но получается что вектор какую-то свою часть хранит прямо в кэше, а список всё хранит в памяти?
Крылатый
Туда ж целыми кусочками копируются данные из памяти)
серёжа
Dmitriy / დიმიტრი
Кэш это тоже по сути память же? Может ли быть такое, что list случайно весь попадет в кэш и тогда операция по нему будет быстрее?
Michael
лист очень маловероятно, вектор да
серёжа
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти
Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору.
Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
серёжа
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти
Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору.
Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
Господи, чем я занимаюсь, лишь бы не работать...
Крылатый
Учишь людей. И это хорошо. Омниссия одобряет!
Aleksei
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти
Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору.
Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
в листе еще есть оверхед на адрес следующего элемента
Крылатый
Да, поэтому кол-во чиселок к кэше будет меньше.
серёжа
А, ну да
Тем более, в случае с std::list это doubly linked list, поэтому там два указателя
Dmitriy / დიმიტრი
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти
Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору.
Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
👍 я все понял, спасибо
🦥Alex Fails
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти
Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору.
Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
#fyi #list #vector #memory
Myawss
Народ, не могли бы вы объяснить, что значит эта запись на Си?
Myawss
Myawss
полный контекст
Myawss
Daniil
Спасибо за скрины вместо пасты
Daniil
Это типо варнинги компилятора так давят
серёжа
IharOK
неиспользуемые переменные вроде
Daniil
Чтобы небыло анъюзед вариаэбл или чото такое
Myawss
хм, спасибо!
IharOK
тогда уже и path так сделать)
Deleted Account
на костыль похоже
Daniil
Daniil
Приведи пример
IharOK
ну входной параметр закомментить
Deleted Account
func(int /* a */, int b)
Daniil
И сломать апи?)
Myawss
> @vecherinsky
сделать)
да код не мой, читаю тутор по fuse
Daniil
А типо так. Прокатывает?
Deleted Account
нет
Deleted Account
просто имени нет