ещё про выстрелы в ногу используя STL

http://sim0nsays.livejournal.com/38116.html

У меня был недавно похожий случай — сохранение уровня в редакторе стало занимать невыносимо много времени (почти две секунды), когда итемов в проекте больше 10'000.

Виновником был как раз realloc в массиве. Т.е.  кровень это по сути большая DOM'оподобная штука (сотни тысяч нодов/аттрибутов), вот создание её и тормозило на аллокации новых нодов/аттрибутов. Массив по счастью собственный и параметры реаллокаций можно было настроить для этого конкретного случая.

Submitted by BLK Dragon on

Комментарии

я все-таки не до конца понял суть проблемый там описаной. ну понятно, что получается постоянный realloc, - в чем мораль?

Submitted by MaxImuS on
MaxImuS wrote:

я все-таки не до конца понял суть проблемый там описаной. ну понятно, что получается постоянный realloc, - в чем мораль?

мораль в том чтобы понимать, что ты делаешь и не думать что "оно само магическим образом как то сделается" Smile

 

Submitted by BLK Dragon on

типа, выглядит все как хорошо, а на самом деле полный бред? Smile

получалось, что в цикле вызывался reserve(size + 24), а push_back'ов было больше и он наращивал в нутри себя вектор в 1.5, то бишь запись - reserve(size + 24) и есть тот самый бред?

Submitted by MaxImuS on

 

Quote:

 

Чтобы не делать много reallocations (типа, один кубик - это от 24 вершин, 24 push_back = несколько reallocs), кто-то поставил туда reserve, выглядящий вот так:
vector.reserve(vector.size() + 24);

 

Что за бред, это же очевидно что идет перераспределение памяти каждый раз. Если он надеялся, что вектор вдруг выделит больше чем надо, то зачем задавать строгий размер? Это что-то на уровне "о, смотрите, я стл сломал, лол". C бевел тоже очевидно, после 24 пушбэков вызывается пушбэк, на который нехватает вместимости, и вызывается стандартный ресерв на 1.5 размера массива+ресайз на 1 элемент.

Submitted by Nort on
Nort wrote:

Что за бред, это же очевидно что идет перераспределение памяти каждый раз. Если он надеялся, что вектор вдруг выделит больше чем надо, то зачем задавать строгий размер? Это что-то на уровне "о, смотрите, я стл сломал, лол". C бевел тоже очевидно, после 24 пушбэков вызывается пушбэк, на который нехватает вместимости, и вызывается стандартный ресерв на 1.5 размера массива+ресайз на 1 элемент.

Это не лол, ты бы внимательно почитал оригинальный пост в жж; случай совершенно жизненный и очень показательный. Zeux не школьник какой-нибудь троллить и лолить по ерунде.

Submitted by BLK Dragon on

Пример очень познавателен и спасибо за ссылку. Ребята, кстати, из обсуждения, достаточно опытные профи, не стоит сразу так говорить - "о, ..., лол".

Submitted by MaxImuS on

да, я слишком резко отозвался, но ошибка энивей из разряда дурацких

Submitted by Nort on

про это давным давно писалось на IT-Happens. Там у ребят валился сервер раз в 3 дня и всегда как-то странно. Долго дебагали и выискивали. И тут одного из них осенило. У них в недрах программулины лежал вектор наполняемый какими-то там айтемами. При n итемов вектор разростался до 2n и тут-то падал. Решением им стал вектор векторов.

Submitted by AlexB.hpp on
AlexB.hpp wrote:

про это давным давно писалось на IT-Happens. Там у ребят валился сервер раз в 3 дня и всегда как-то странно. Долго дебагали и выискивали. И тут одного из них осенило. У них в недрах программулины лежал вектор наполняемый какими-то там айтемами. При n итемов вектор разростался до 2n и тут-то падал. Решением им стал вектор векторов.

(facepalm)

"Решением" является понимание того, как работает контейнер и аллокации памяти; ну и настройка того и другого под задачу.

Ну т.е. сервер падает не "странно", а с out-of-memory (ассерт с колл-стеком, ага); если это долго искали и дебагали, то ребята, извини, идиоты.

 

Submitted by BLK Dragon on

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

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

Submitted by AlexB.hpp on
AlexB.hpp wrote:

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

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

Submitted by BLK Dragon on

GameDev.by