2012-05-20 15 views
7

Estoy programando un juego y quiero representar una placa con una matriz. Estoy buscando la eficiencia ya que voy a hacer muchas iteraciones. En este caso, tanto una matriz int o una matriz char parece conveniente para la representación de la placa. ¿Hay alguna diferencia en términos de eficiencia al hacer operaciones en una matriz int y una matriz char?Eficiencia: matriz de caracteres frente a matriz int

Sospecho que dado que cada elemento de la matriz char tiene un tamaño de 1 byte, puede ser más lento debido a una representación diferente en la memoria (considere una computadora moderna que tenga al menos 32 bits para la representación int) ... ¿derecho?

Gracias de antemano.

EDIT: Voy a generar árboles de juego, por eso la eficiencia es tan importante y las pequeñas diferencias en el consumo de tiempo pueden marcar una gran diferencia.

+0

No puedo pensar en ninguna razón 'char' sería más lento. En todo caso, posiblemente dependiendo de las operaciones que estés haciendo, puede ser más rápido. En objetivos integrados con arquitectura de 8 bits, las operaciones 'int' serían más lentas. – jedwards

+0

Tal vez, pero una matriz 'char' ocupa menos memoria, lo que puede hacerla más rápida que una matriz' int', si tiene suficientes elementos. –

Respuesta

5

¿Para qué CPU/s?

Algunas CPU no pueden acceder directamente a nada más pequeño que "algo", y el compilador necesita generar una secuencia de instrucciones de "carga, desplazamiento y máscara" para acceder a bytes individuales. El uso de int debería ganar para este caso.

Algunas CPU pueden acceder a los bytes sin problemas. En este caso (si hay datos suficientes involucrados) es probable que el problema sea el tamaño de la memoria caché y/o el ancho de banda de la memoria; y (al menos para 80x86) esperaría que char ganara simplemente porque se empaqueta más información en cada línea de caché.

¿Para qué algoritmo/s?

Si puede lanzar SIMD, es probable que char gane. Por ejemplo, con SIMD de 128 bits puede procesar 16 bytes por instrucción o 4 (32 bits) enteros por instrucción y char puede ser 4 veces más rápido debido a esto solo.

El mejor consejo sería utilizar algo como:

#ifdef USE_INT 
    typedef int thingy 
#else 
    typedef unsigned char thingy 
#endif 

A continuación, puede perfilar y cambiarlo en cualquier momento.

+0

+1, pero tienes el 'typedef''s al revés. –

+0

Heh - eso es embarazoso - arreglado ahora. Gracias :-) – Brendan

4

char s generalmente alineados en 1 byte y int s generalmente alineados en 4 bytes. Suponiendo que está trabajando con una máquina que sigue este estándar, ambas matrices almacenarán su contenido como bloques contiguos de memoria (la matriz int es 4 veces el tamaño de la matriz char). Por lo tanto, es poco probable que ninguno sea diferente en términos de cómo utilizan un trozo de memoria asignada.

Dicho esto, incluso si la representación de la memoria subyacente fuera diferente, dudo que afecte el rendimiento de su programa.

+0

Estoy de acuerdo con la primera oración, pero ¿no implicaría esto que la representación int (en una máquina de 32 bits) tomaría 4 veces la memoria? Sí, los bloques serán contiguos, pero no del mismo tamaño. – jedwards

+0

Actualicé mi respuesta para aclarar este punto (asumí que el lector se daría cuenta de esto, pero tal vez debería haber sido más explícito). –

+0

Creo que la frase que me consiguió fue "es poco probable que cualquiera de los dos sea diferente en términos de la utilización total de la memoria". - Son términos de utilización total de la memoria, serán diferentes, uno 4x el tamaño del otro. – jedwards

3

Pruébalo y mira. Utilice la opción -S para gcc para obtener el código ensamblador:

gcc -Wall -S code.c -o code.s 

ver si hay diferencias obvias en la longitud del código generado. Esta no es necesariamente toda la historia, ya que necesita comprender al ensamblador para juzgar las diferencias. Pero podría darte una pista, probablemente ese int y char serán más o menos lo mismo.

Tenga en cuenta que si mezcla tipos, es casi seguro que obtendrá un código ligeramente más lento con matrices de caracteres. Por lo tanto, si almacena los datos en la matriz char y luego los "procesa" de alguna manera usando tipos int, probablemente obtendrá una instrucción adicional cada vez que se realice una conversión entre los dos. Pruébalo con -S.

+0

+1! Esa será la prueba definitiva que confirma las afirmaciones. Ambas excelentes respuestas, es una pena que pueda elegir una. – PALEN

Cuestiones relacionadas