Estoy trabajando en una aplicación de servidor grande escrita usando C++. Este servidor necesita ejecutarse posiblemente durante meses sin reiniciarse. La fragmentación ya es un tema sospechoso, ya que nuestro consumo de memoria aumenta con el tiempo. Hasta ahora, la medida ha sido comparar bytes privados con bytes virtuales y analizar la diferencia en esos dos números.Pensando en la fragmentación de la memoria mientras codifica: Optimización prematura o no?
Mi enfoque general a la fragmentación es dejarlo en el análisis. Tengo la misma forma de pensar sobre otras cosas como el rendimiento general y las optimizaciones de la memoria. Tienes que respaldar los cambios con análisis y pruebas.
Estoy notando mucho durante las revisiones de código o discusiones, que la fragmentación de la memoria es una de las primeras cosas que aparece. Es casi como si ahora tuvieran un gran temor, y hay una gran iniciativa para "prevenir la fragmentación" antes de tiempo. Se solicitan cambios de código que parezcan favorables para reducir o prevenir problemas de fragmentación de memoria. Tiendo a estar en desacuerdo con estos desde el principio, ya que me parecen una optimización prematura. Me gustaría sacrificar la limpieza/legibilidad del código/mantenibilidad/etc. para satisfacer estos cambios
Por ejemplo, tomemos el siguiente código:
std::stringstream s;
s << "This" << "Is" << "a" << "string";
Arriba, el número de asignaciones de la stringstream hace que aquí no está definido, podría ser de 4 o asignaciones, sólo 1 de asignación. Por lo tanto, no podemos optimizar solo en función de eso, pero el consenso general es usar un buffer fijo o modificar el código de alguna manera para utilizar potencialmente menos asignaciones. Realmente no veo que el stringstream se expanda aquí como un gran contribuyente a los problemas de memoria, pero tal vez estoy equivocado.
sugerencias de mejora general en el código anterior son a lo largo de las líneas de:
std::stringstream s;
s << "This is a string"; // Combine it all to 1 line, supposedly less allocations?
También hay un enorme empuje a utilizar la pila sobre el montón siempre que sea posible.
¿Es posible ser preventivo sobre la fragmentación de la memoria de esta manera, o es simplemente una falsa sensación de seguridad?
Creo que una forma simple de juzgar es esta: te preocupan dos cosas en los programas: la corrección de la implementación y la eficiencia de implementación. Todos queremos la más alta en ambas categorías, pero prácticamente hablando es mejor enfocarse en la corrección que en la eficiencia, porque el programa incorrecto más eficiente en el mundo sigue siendo incorrecto, y sigue siendo inútil. Debes enfocarte en ambos de la mejor manera posible; * la optimización prematura simplemente significa enfocarse más en la eficiencia que en la corrección *. Si tiene la capacidad de hacerlo eficiente sin sacrificar la corrección, ¡definitivamente debería hacerlo! – GManNickG
'La fragmentación ya es un problema sospechoso aquí, ya que nuestro consumo de memoria aumenta con el tiempo. Las simples pérdidas de memoria antiguas serían mucho más sospechosas en mi opinión; podría descartarlas primero (y con un corrector de fugas de memoria como valgrind o drmemory también es mucho más fácil que analizar toda la base de códigos para buscar fuentes de fragmentación) – smocking