|
аллокация вектора
|
|||
---|---|---|---|
#18+
потестировал простой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
тут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024 через delete + new... где оно?? компилировал так: g++ -ggdb3 main.cpp gdb a.out (gdb) start (gdb) disas у варианта 3 asm такой: Код: plaintext 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
у двух других они длиннее... зы: я правильно угадал, что <+138> это такты? зыы: gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 22:16 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудухзы: я правильно угадал, что <+138> это такты? Нет, адресное смещение. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 22:25 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
Путаешь слова, в листинге же д.б. длина команды в байтах. А такты - я нынче не знаю, насколько это пропорционально байтам команды. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 22:25 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
ну тогда, я так понимаю, эффективность надо высчитывать по инструкциям? по ним там вроде как тоже не особо разницу видно... вот вар1 (.reserve()): Код: plaintext 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
какой эффективнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 23:07 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудухпотестировал простой код: тут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024 через delete + new... где оно?? оно здесь прячется. Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 23:57 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудухя так понимаю, эффективность надо высчитывать по инструкциям? Это бесполезно. Современные процессора могут много странных гитик и "идеальный ассемблер" на них тормозит. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 00:08 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудухну тогда, я так понимаю, эффективность надо высчитывать по инструкциям? Забавная методика. А как быть с циклами и ветвлениями? Код может многократно выполняться или вообще не выполняться. Перевыделение памяти происходит внутри push_back() как уже выше заметили 21983365 . При этом выполняется копирование текущего массива, т.е. в первый раз 2 элемента, во второй 4, затем 8, 16, ... В твоем случае при 1000 элементов будут скопированы 2+4+8+...512=1022 элемента. Для int это относительно быстро, но замени int на какой-нибудь объект, у которого еще надо конструктор копирования и деструктор вызвать, и получишь более ощутимые тормоза. Для замера надо время засекать и элементов побольше взять, например, миллион. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 06:17 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
Dima TДля замера надо время засекать и элементов побольше взять, например, миллион. Или написать класс с журналированием конструирования и разрушения, поместить его в вектор заместо инта и посмотреть что именно происходит ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 09:34 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
Надо смотреть что под капотом ::push_back. Там не обязательно удвоение. Может быть умножение на полтора. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 10:16 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
blonduserполудухпотестировал простой код: тут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024 через delete + new... где оно?? оно здесь прячется. Код: plaintext 1.
хмм, так оно и в варианте с .reserve() есть... почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 11:42 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудух, попробуй в код вставить Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 12:03 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудух тут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024 через delete + new... где оно?? Так ты же сделал reserve, как раз это и обошёл. Убери reserve, и поменяй 1000 на 100000 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 12:07 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудуххмм, так оно и в варианте с .reserve() есть... почему? Потому что ты ее вызываешь Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 12:10 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудух, Ну и да, ёмкость увеличивается не на 1 элемент за каждый push_back(), а скачками, в два раза или что-то такое. Как именно -- не специфицированно. Ты можешь совсем ухудшить ситуацию, вызывая каждый раз после push_back() метод shrink_to_fit(), который уменьшает ёмкость до минимально необходимой, правда, не гарантировано. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 12:12 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
1000 довольно слабенький объем, чтобы в отладчике увидеть разницу в потреблении памяти приложения. Попробуйте миллионов сто хотя бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 13:05 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
Во времена пентиумов, когда оперативная память уже достигла гигабайта, был забавный пример. Аллоцировать двумерный массив 1000_000х3 элемента было невозможно, не хватало памяти. Память аллоцировалась нелинейно, а блоками по 512 байт (по крайней мере на моей машине), поэтому не дойдя до конца вываливалась с нехваткой памяти. Это больше имеет отношение к ленивой аллокации виртуальной памяти чем к пентиумам. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 13:09 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
maytonНадо смотреть что под капотом ::push_back. Там не обязательно удвоение. Может быть умножение на полтора. :) В MSVS 2017 - увеличивается экспоненциально, всякий раз на половину предыдущей емкости. Но только если есть такая возможность! Иначе - увеличивается на столько, сколько запрошено. У GCC - вроде бы все еще в 2 раза. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 14:00 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
MasterZivполудухтут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024 через delete + new... где оно?? Так ты же сделал reserve, как раз это и обошёл. Убери reserve, и поменяй 1000 на 100000 .reserve() только в 1м варианте. В 3м как раз без ничего: vector<int> v; MasterZivполудух, Ну и да, ёмкость увеличивается не на 1 элемент за каждый push_back(), а скачками, в два раза или что-то такое. и про это я написал тоже. Dima Tполудуххмм, так оно и в варианте с .reserve() есть... почему? Потому что ты ее вызываешь Код: plaintext 1. 2.
значит та строчка в асме не про то что я спрашивал я не про .push_back() спрашивал, а "где именно происходит расширение вектора *2/*4/*8 итд, когда вектор изначально инициализирован БЕЗ размера" ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 15:22 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
и это расширение ведь должно быть видно и на 1000, зачем 1000000... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 15:23 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудухзначит та строчка в асме не про то что я спрашивал я не про .push_back() спрашивал, а "где именно происходит расширение вектора *2/*4/*8 итд, когда вектор изначально инициализирован БЕЗ размера" Та строчка асма за кадром осталась, ты ее код не привел. Команда call - это вызов подпрограммы. Конкретно именно в той подпрограмме (push_back()) происходит реаллокация (при необходимости). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 15:26 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
какой код не привёл? сырцы же там в начале так страшилка в том, что БЕЗ инициализации с размером этот .push_back() должен в цикле расширять вектор постепенно в 2 раза (*2 *4 *8 *16 ... *1024), чем сильно тормозит процесс вот его я и не вижу в асме вы говорите "вот он" а потом "это не он", а push_back() ну инструкции то по самому расширению где?? Где delete + new и прочие телодвижения? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 15:31 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
может gdb не всё показал... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 15:32 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
"objdump -d" показывает очень сильно больше асма... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 15:33 |
|
аллокация вектора
|
|||
---|---|---|---|
#18+
полудухкакой код не привёл? сырцы же там в начале Это только main(), а остальное? Код push_back() начинается с адреса 0x555555554ccc PS Фигней занимаешься. Код там есть, и в нем все вызовы new/delete есть. От вызова reserve() зависит как часто будет тот код вызываться. Тот код как минимум один раз отрабатывает внутри reserve() ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2019, 15:41 |
|
|
start [/forum/topic.php?fid=57&msg=39869843&tid=2017561]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 271ms |
total: | 410ms |
0 / 0 |