После наблюдения некоторых проблем с производительностью в моей программе я решил запустить сеанс профилирования. Результаты, похоже, указывают на то, что примерно 87% взятых проб были как-то связаны с моей функцией Update()
.вопросы профилирования и производительности
В этой функции я просматриваю список A*
, где sizeof(A)
равно 72 и удаляет их после обработки.
void Update()
{
//...
for(auto i = myList.begin(); i != myList.end(); i++)
{
A* pA = *i;
//Process item before deleting it.
delete pA;
}
myList.clear();
//...
}
где myList - std::list<A*>
. В среднем, я вызываю эту функцию где угодно от 30 до 60 раз в секунду, в то время как список содержит в среднем 5 элементов. Это означает, что я удаляю от 150 до 300 A
объектов в секунду.
Вызов удаления этого много раз будет достаточным, чтобы вызвать проблему с производительностью в большинстве случаев? Есть ли способ отслеживать, где именно происходит эта проблема? Действительно ли удаление считается дорогостоящей операцией?
Что делает деструктор 'A'? Есть много вещей, которые могут вызвать «проблемы с производительностью». Например, попробуйте использовать 'std :: vector' вместо' std :: list', только местонахождение кеша может оказать огромное влияние на производительность. – Chad
Я не определил деструктор, только конструктор. Я попробую заменить список вектором и посмотреть, поможет ли он. – user987280
Другая проблема заключается в том, что все эти маленькие объекты 'A' лежат вокруг, особенно при использовании в сочетании со списками (и, возможно, с другими распределениями). Ваша память будет разбита и рассеяна. Возможно, вам захочется подумать о создании специализированного распределителя для выделения этих объектов 'A', выделения и восстановления в непрерывный пул неиспользуемых объектов' A'. –