Mikhail
И в дебаге лист все равно медленне должен быть
Stanislav
http://melpon.org/wandbox/permlink/I8MYeXPdo8tLvPAb
Anonymous
мне кажется это зависит от того как ты достаёш элементы из коллекций.
Скорость доступа в листе - динамическая, больше список - дольше доступ. В векторе - статическая
Stanislav
без всяких оптимизаций видно что лист все равно медленнее
Anonymous
Попробуй свой контейнер написать
Крылатый
Ну вектор быстрей по доступу, это логиншно жеж.
Dmitriy / დიმიტრი
Первый без -O3 второй с O3
Dmitriy / დიმიტრი
Dmitriy / დიმიტრი
Vladislav
wat
А, произвольный доступ - конечно.
Dmitriy / დიმიტრი
В первом случае list быстрее. Чудеса
серёжа
Anonymous
https://gist.github.com/shelomentsevd/9b5764bacd2698056097d7c683dbf2c0
Ты с вектором юзаешь хуевый способ нахождения суммы элементов
Anonymous
Он сам по себе медленный
Крылатый
Юзай деку вместо листа)
Anonymous
Dmitriy / დიმიტრი
accumulate?
А без accumulate?
Anonymous
А без accumulate?
Поищи, их много
Крылатый
http://melpon.org/wandbox/permlink/I8MYeXPdo8tLvPAb
Крылатый
242445 у deque и 696983 у list
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
без всяких флагов оптимизаций
Крылатый
Думаю, они хотели узнать, а почему последовательное расположение в памяти быстрей, чем рандомно...
Вот это, думаю, немного просветит ситуацию https://courses.engr.illinois.edu/ece390/books/artofasm/CH03/CH03-2.html
серёжа
Вот такой ответ почему-то не прокатил
Возможно, интервьюер ожидал услышать, что при работе с листом за каждым элементом приходится отдельно ходить (скорее всего) в память
Крылатый
Вот что я забыл, это по скорости изменения коллекции (добавление/удаление) быстрей...
Vladislav
list, заполненный в цикле добавлением в конец, тоже будет расположен в памяти относительно последовательно
серёжа
Вот это, думаю, немного просветит ситуацию https://courses.engr.illinois.edu/ece390/books/artofasm/CH03/CH03-2.html
До кучи ещё вот Дреппера могу предложить почитать, но это если тема реально интересует https://www.akkadia.org/drepper/cpumemory.pdf
Dmitriy / დიმიტრი
В общем надо про память читать. Я правильно понял?
Крылатый
И про проц)
Крылатый
Воще, кэш же!
Dmitriy / დიმიტრი
Я это себе туго представляю, но получается что вектор какую-то свою часть хранит прямо в кэше, а список всё хранит в памяти?
Крылатый
Туда ж целыми кусочками копируются данные из памяти)
Sasha
В кэше никто ничего не хранит кроме процессора
Но процессор не знает, что у него есть кэш(минутка ЭВМ)
серёжа
Но процессор не знает, что у него есть кэш(минутка ЭВМ)
Ну для того чтобы объяснить почему вектор быстрее этой абстракции вполне достаточно
Dmitriy / დიმიტრი
Кэш это тоже по сути память же? Может ли быть такое, что list случайно весь попадет в кэш и тогда операция по нему будет быстрее?
Michael
лист очень маловероятно, вектор да
серёжа
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору. Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
серёжа
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору. Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
Господи, чем я занимаюсь, лишь бы не работать...
Крылатый
Учишь людей. И это хорошо. Омниссия одобряет!
Aleksei
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору. Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
в листе еще есть оверхед на адрес следующего элемента
Крылатый
Да, поэтому кол-во чиселок к кэше будет меньше.
серёжа
А, ну да Тем более, в случае с std::list это doubly linked list, поэтому там два указателя
Dmitriy / დიმიტრი
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору. Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
👍 я все понял, спасибо
🦥Alex Fails
В общем. И вектор, и список лежат в памяти. Вектор — последовательно, а лист — не всегда, у каждой вершинки есть указатель на следующую и он может указывать на другой участок памяти Просто когда процессор хочет посчитать, например, ту же сумму чисел в кеш отправляется целый кешлайн, например, 64 байта. Он берет первую чиселку, кладет в аккумулятор. Идет за второй, а она такая — оп, тоже есть в кешлайне, за ней не надо идти в оперативную память по медленной шине. Таким образом в кешлайне лежит, например, сразу восемь чиселок, которые надо добавить к аккумулятору. Если лист лежит в памяти последовательно, то процесс, по идее, должен быть таким же. А если элементы как-то неоднородно в памяти лежат, за ними приходится ходить в память (опять-таки, шина в оперативную память очень медленная и читать оттуда очень дорого по сравнению с чтением из кэша)
#fyi #list #vector #memory
cyber
Надо попробовать. Вообще мне просто на собеседовании спросили что быстрее и почему, а я как-то не смог ответить, теперь вот пытаюсь узнать из-за чего сложение по вектору быстрее
такие вопросы на собеседованиях часто задают с незнанием обстановки. и на них, часто, невозможно ответить правильно без использования профайлера. как раз из-за кэшей процессора, brunch prediction, и еще кучи разных оптимизаций
Myawss
Народ, не могли бы вы объяснить, что значит эта запись на Си?
Myawss
Myawss
полный контекст
Myawss
Daniil
Спасибо за скрины вместо пасты
Daniil
Это типо варнинги компилятора так давят
IharOK
неиспользуемые переменные вроде
Daniil
Чтобы небыло анъюзед вариаэбл или чото такое
Myawss
хм, спасибо!
IharOK
тогда уже и path так сделать)
Deleted Account
Чтобы небыло анъюзед вариаэбл или чото такое
хах для этого можно просто имя закоментить при объявлении,
Deleted Account
на костыль похоже
Daniil
Приведи пример
IharOK
ну входной параметр закомментить
Deleted Account
func(int /* a */, int b)
Daniil
И сломать апи?)
Myawss
> @vecherinsky сделать) да код не мой, читаю тутор по fuse
Daniil
А типо так. Прокатывает?
Stanislav
И сломать апи?)
это ничего не сломает
Deleted Account
нет
Deleted Account
просто имени нет