Думая о фрагментации памяти во время написания кода: преждевременная оптимизация или нет?

Я работаю над большим серверным приложением, написанным с использованием C++. Этот сервер должен работать, возможно, в течение нескольких месяцев без перезапуска. Фрагментация уже является подозреваемой проблемой, поскольку потребление памяти со временем увеличивается. До сих пор измерение заключалось в сравнении частных байтов с виртуальными байтами и анализе разницы в этих двух числах.

Мой общий подход к фрагментации состоит в том, чтобы предоставить ее анализу. Точно так же я думаю о других вещах, таких как общая производительность и оптимизация памяти. Вы должны подкрепить изменения анализом и доказательством.

Я много раз замечал во время проверки кода или обсуждений, что фрагментация памяти — это одна из первых вещей, которые приходят на ум. Это похоже на то, что сейчас есть огромный страх перед этим, и есть большая инициатива по «предотвращению фрагментации» заранее. Требуются изменения кода, которые кажутся благоприятными для уменьшения или предотвращения проблем с фрагментацией памяти. Я склонен не согласиться с этим сразу, поскольку они кажутся мне преждевременной оптимизацией. Я бы пожертвовал чистотой кода/читабельностью/ремонтопригодностью/и т.д. чтобы удовлетворить эти изменения.

Возьмем, к примеру, следующий код:

std::stringstream s;
s << "This" << "Is" << "a" << "string";

Выше приведено количество выделений, которые делает строковый поток, не определено, это может быть 4 выделения или только 1 выделение. Таким образом, мы не можем оптимизировать, основываясь только на этом, но общий консенсус состоит в том, чтобы либо использовать фиксированный буфер, либо каким-то образом изменить код, чтобы потенциально использовать меньше распределений. Я действительно не вижу, чтобы строковый поток расширялся здесь как огромный источник проблем с памятью, но, возможно, я ошибаюсь.

Общие предложения по улучшению приведенного выше кода выглядят примерно так:

std::stringstream s;
s << "This is a string"; // Combine it all to 1 line, supposedly less allocations?

Существует также огромное стремление использовать стек вместо кучи везде, где это возможно.

Можно ли таким образом предупреждать фрагментацию памяти, или это просто ложное чувство безопасности?

9
задан void.pointer 17 May 2012 в 03:46
поделиться