2010-03-31 16 views
5

¿Alguien tiene un recurso para las pautas de optimización de memoria de C++? Mejores prácticas, afinación, etc.C++ Pautas de optimización de rendimiento/memoria

A modo de ejemplo:

Class xxx { 

    public: 
     xxx(); 
     virtual ~xxx(); 

    protected: 

    private: 

}; 

Habría algún beneficio en el compilador o asignación de memoria para deshacerse de protegido y privado ya que no hay elementos que están protegidas y privadas en esta clase?

ACTUALIZACIÓN: ¿Qué es un programador hace esto:

Class xxx { 

    public: 
     xxx(); 
     virtual ~xxx(); 

    public: 
     more stuff(); 
     more(); 

    ifndef __BUILD_WIN__ 
     public: 
     even more(); 
     envenmore2(); 
    endif 
    protected: 

    private: 

}; 
+0

¿Puede añadir información sobre el problema del dominio en el que está trabajando? – mch

Respuesta

12

¿Alguien tiene un recurso para C++ directrices de optimización de la memoria? Mejores prácticas, afinación, etc.

Depende mucho del compilador y del entorno de destino (RISC, Unix/Linux, Windows). La mayoría de los compiladores tendrán esa información.

Existen utilidades que permiten rastrear las pérdidas de memoria para que pueda repararlas durante la prueba. Si va a asignar dinámicamente muchas cosas (que normalmente es el caso con C/C++), intente asegurarse de desasignar todo antes de destruir un objeto. Para hacer esto:

  • Si valora la memoria sobre el procesador, use smart pointers.
  • Si su clase tiene variables miembro que son punteros, asegúrese de que su destructor libere cada uno de los. Agrupe las variables de sus miembros juntas en su código fuente para que sea fácil comparar esas variables con el destructor.
  • Evite la asignación de memoria dinámica siempre que sea posible para evitar fugas. Prefiero std::string más dinámico asignado char*, etc.

Habría algún beneficio en el compilador o la asignación de memoria para conseguir librarse de protegida y privada desde allí no hay elementos que son protegida y privada ¿en esta clase?

No, si no me equivoco, protected/private solo se comprueban durante la compilación, por lo que no afectan el rendimiento incluso si hubiera elementos debajo de las palabras clave.

Además, es importante comprender que el compilador es muy inteligente (generalmente más que el programador) por lo que optimizará todo lo que pueda; Por ejemplo, declaremos una variable, int a, dentro de su constructor. Y digamos que no lo usas para nada, simplemente lo olvidaste allí. La mayoría de los compiladores ni siquiera ahorrarán espacio de pila para esas variables. Otros necesitarán que el usuario active la Optimización para que esto suceda, pero como regla general, su versión de producción de cualquier programa debe compilarse con la optimización habilitada, incluso si no está llena.

Sobre la actualización, que lo mirabas son pre-procesadores de directivas y se están usando para hacer lo que se llama recopilación selectiva. Eche un vistazo here.

+0

@bruno - gracias, servicial. el compilador es más inteligente que los programadores, pero los programadores escriben compiladores, ¡así que al menos un * pocos * programadores tienen que ser lo suficientemente inteligentes como para hacer que el compilador haga todo esto! ¡Ahora para ver cómo XCode me dirá de los artículos no utilizados porque sería bueno saber! –

+2

@ML: nunca usé XCode (es un IDE con destino a Apple, ¿no?) Pero probablemente haya formas de hacerlo. Los compiladores tienen el conocimiento de muchos de los mejores programadores, esa es la razón por la cual son más inteligentes que el programador promedio. Kasparov es el mejor jugador de ajedrez que existe, ¡pero fue derrotado por un software creado por personas! (y eso es lo que amo de las computadoras, aunque desearía que Kasparov pudiera ser más astuto que DeepBlue). –

+0

Los compiladores son solo "más inteligentes" que los programadores porque pueden considerar múltiples optimizaciones a la vez mucho más fácilmente que un humano. Las optimizaciones individuales pueden no ser tan difíciles, pero aplicarlas consistentemente todas al mismo tiempo sí lo es. – mskfisher

2

Bueno, el compilador no tendría que analizarlos, por lo que hay un beneficio para el compilador. Por lo que eso vale (no mucho).

No debe haber diferencia de uso de memoria.

Aparte de eso, el único beneficio que se me ocurre es que hay menos irregularidad para que alguien que lea el código tenga que lidiar (no es que sea particularmente oneroso en su ejemplo).

+0

También estoy de acuerdo en que la lectura de códigos es más fácil si omite las palabras clave innecesarias. –

1

palabras clave públicas, protegidas y privadas, no se convierten en archivos objeto en absoluto, por lo que no hay ningún beneficio en absoluto.

En general

  • tratar de evitar asignar y liberar memoria, vuelva a utilizar siempre que sea posible. Caminar por el montón es especialmente lento.
  • Memoria gratis cuando haya terminado con ella. No te vayas dando vueltas a menos que haya buenas razones para hacerlo.

La verdad es que, a diferencia de Java, cuando se programa en C++, siempre hay que pensar en la administración de la memoria para evitar fugas. Por lo tanto, la optimización es más natural que Java

+3

@deus Casi nunca pienso en la gestión de la memoria cuando programo en C++. –

+2

Debería leer: "La verdad es que, a diferencia de Java, C++ le permite escribir y utilizar envoltorios para ofrecerle una administración determinística de la memoria automática, por lo que nunca tendrá que pensar en la gestión de la memoria para evitar fugas". – GManNickG

0

En cuanto a las guías generales, está What Every Programmer Should Know About Memory, pero no estoy seguro de que sea lo que está buscando.

Una guía general para optimizar la memoria dentro de una estructura o clase es ordenar los miembros de sus datos de mayor a menor. Esto evita que el exceso de relleno pierda espacio en su estructura o clase.

En cuanto a su pregunta, creo que ha sido respondida de forma adecuada, pero se puede comparar utilizando sizeof().

0

¿Habrá CUALQUIER beneficio en el compilador o la asignación de memoria para deshacerse de protegido y privado ya que no hay elementos que están protegidos y privados en esta clase?

No. Los métodos no virtuales de AFAIK no aumentan el tamaño de la instancia de clase.

¿Alguien tiene un recurso para las pautas de optimización de la memoria C++?

1) Si le preocupa el rendimiento, use Profiler (AQtime, por ejemplo). No adivine, use herramientas.
2) En general, no es una buena idea de forma frecuente (varios _millions_ veces por segundo) asignar y desasignar memoria (usando new/delete), especialmente bloques grandes. Según mi experiencia, dicho uso da como resultado una pérdida de rendimiento. Si con frecuencia necesita asignar un gran bloque de memoria usando la misma rutina (usando new o std :: vector), considere reutilizar el mismo bloque en la próxima llamada (esto será complicado en la aplicación multiproceso). Es decir.en lugar de

void doStuff(int memSize){ 
    std::vector<char> buf(memSize); 
    //..some code here 
} 

uso algo como esto:

void doStuff(int memSize){ 
    static std::vector<char> buf; 
    if (buf.size() < memSize) 
     buf.resize(memSize); 
    //..some code here 
} 

Pero sólo cuando sea necesario y sólo si está absolutamente seguro de que esta rutina no puede ser llamado desde varios hilos separados al mismo tiempo. (Para hacerlo compatible con multihilo, necesitará algunos trucos, ya sea mutexes, o el "pool" de varios buffers)
3) Asignando más de 1 megabyte (para Windows) u 8 megabytes (para Linux) en la pila haga que su programa falle (desbordamiento de pila para win, segfault en Linux) a menos que haya especificado el tamaño de la pila durante el tiempo de compilación. Ejemplo:

void doStuff(){ 
    char buf[1024*1024*12];//use new[] or std::vector instead of this. 
    //some code here 
} 

Eso es todo lo que puedo pensar.

0

Realmente depende de su aplicación. Si está haciendo simulaciones o algún tipo de computación científica en la que realice cálculos de punto flotante en grandes matrices de memoria, entonces hay muchas cosas que puede hacer.

  • Optimizar para su reutilización caché (bloqueo caché, relleno, etc.)
  • Optimizar para minimizar TLB golpea (los errores de página)
  • organizar los datos como estructuras de matrices, no como matrices de estructuras
  • Evita innecesario de memoria borra
  • impedir la asignación de memoria, en lugar reutilización

Si es necesario tener muchos objetos pequeños, mirar las cosas como el patrón de diseño flyweight o los pools de objetos.

En cuanto a las declaraciones de private y protected, no. Solo son relevantes para la compilación para aplicar la encapsulación y el ocultamiento de datos, y no afectan al binario generado.

0

técnicas para la optimización Hay tres tipos de técnicas para la optimización de código en C:

técnicas Calcular con destino a técnicas relacionados con la memoria/técnicas de salida determinada entrada

técnicas con destino a Compute implican la computación el tiempo necesario para ejecutar operadores y funciones. técnicas en términos de computación incluyen:

de perfiles Inlining Loop desenrollar Loop jamming invariantes de bucle cálculo Loop inversión cola eliminación recursividad tabla de consulta

En los cálculos relacionados con la memoria, es necesario tener en cuenta la memoria que usa el programa El uso de la memoria de las partes inferiores de la jerarquía de memoria aumenta el tiempo de ejecución. Debe usar memoria desde el nivel apropiado mientras ejecuta programas.técnicas de memoria unida incluyen:

localidad de referencia Fila-Major abordar Padding reducción pérdidas de memoria

En entrada/salida (I/O) de optimización de encuadernado, los métodos de acceso secuencial y de acceso aleatorio se usan para reducir el tiempo requerido para recuperar información.

Una E/S con búfer es más rápida que una E/S sin búfer. Puede usar las funciones de lectura() y escritura() con buffers grandes. Puede usar mmap() para reducir el tiempo requerido para recuperar información. Mmap() mapea el espacio de direcciones del proceso con memoria o archivo compartido.

algunas técnicas de optimización más son:

minimizar el uso de variables globales en el programa.

Declara todas las funciones que no sean variables globales como estáticas dentro del archivo.

Utilice variables de tamaño de palabra como int y float en lugar de char, short y double.

Evite el uso de recursion.

Evite utilizar la función sqrt() ya que consume mucha CPU.

Utilice matrices unidimensionales.

No separe las funciones estrechamente relacionadas en archivos separados.

Use la función puts() en lugar de la función printf.

Utilice el acceso al archivo no formateado/binario en lugar del acceso al archivo formateado.

Utilice mallopt() si el compilador admite esta función para controlar la función malloc.

Utilice macros en lugar de funciones pequeñas para ahorrar tiempo de CPU.