• Miércoles 20 de Noviembre de 2024, 06:24

Autor Tema:  Efiencia con punteros  (Leído 2842 veces)

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Efiencia con punteros
« en: Miércoles 13 de Abril de 2011, 22:18 »
0
Hola, quizás el titulo no es muy descriptivo. Intentare explicarme:

Supongamos un array como este:

Código: C
  1. int enteros[2] = {4 ,5 };
  2.  

Para acceder a su contenido puede hacerse:

Código: C
  1. enteros[1]
  2.  

o

Código: C
  1. *(enteros + 1)
  2.  

La segunda forma, por lo que he podido comprobar, toma la dirección en la que empieza la variable enteros, y dado que un entero ocupa 4 bytes, le suma 4 a la direccion base para así obtener el contenido del segundo indice.

Sería algo como: 0x7fff00a49620(dirección del primer indice de enteros) + 4. Creo que no me equivoco, es así, no?

Ahora bien, leyendo por ahí vi que decían que la segunda forma es más rápida y eficiente que la primera.  Y mi pregunta es, de que forma esta accediendo con enteros[1] para que sea menos rápido ?

Gracias de antemano

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Efiencia con punteros
« Respuesta #1 en: Jueves 14 de Abril de 2011, 09:25 »
0
Cita de: "Leber"
leyendo por ahí vi que decían que la segunda forma es más rápida y eficiente que la primera
No sé dónde viste eso, pero es mentira. Creo que ya te comenté anteriormente en otro hilo que un puntero y un array en C es lo mismo (salvo que el array ya tiene reservada la memoria automáticamente).

En un array se puede usar direccionamiento indexado si la arquitectura objetivo soporta dicho modo de direccionamiento de memoria (que son casi todas). Por ejemplo en arquitectura MIPS (que es la más reciente que tengo en mente) para enteros[1] podrías direccionarlo como 4($t0) siendo el registro $t0 la dirección del puntero enteros. Por tanto estás accediendo directamente al elemento con una única instrucción:

Código: Text
  1. lw $t1, 4($t0)
  2.  
con esto cargo directamente enteros[1] en un registro. En caso de hacerlo con un puntero como dices, serían 2 instrucciones:

Código: Text
  1. add $t0, $t0, 4
  2. lw $t1, 0($t0)
  3.  
Por tanto en el caso que tú planteas el array es el más rápido y no el puntero.

De todas formas todo esto depende del compilador, de sus opciones de optimización y de la arquitectura para la que se compila, ya que ambos escenarios son posibles. En cualquier caso la diferencia de velocidad es mínima.

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Efiencia con punteros
« Respuesta #2 en: Jueves 14 de Abril de 2011, 09:39 »
0
Si, se que es lo mismo, y no, no fue a mi pero vi que se lo comentabas a alguien, pero no me refería a esto como si fueran dos tipos distintos, si no la manera de acceder a ellos, aunque ya lo has explicado.

Esto lo vi en una web donde explicaban un poco sobre punteros.

"Sin embargo, hay que tener en cuenta que la forma *(x+i) es mucho más eficiente que x, por lo que suele preferirse cuando la velocidad del ejecución es un factor determinante."

Quizá soy yo que lo he malinterpretado, pero creo que se refiere a lo que he dicho.

gracias  ^_^

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Efiencia con punteros
« Respuesta #3 en: Jueves 14 de Abril de 2011, 09:41 »
0
Sí, yo no he dicho que lo hayas malinterpretado, sino que es mentira.

Saludos!

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Efiencia con punteros
« Respuesta #4 en: Jueves 14 de Abril de 2011, 09:47 »
0
Supongo que este tipo de dudas solo pueden verse a bajo nivel, viendo el código ensamblador que genera.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Efiencia con punteros
« Respuesta #5 en: Jueves 14 de Abril de 2011, 11:40 »
0
Sip, y eso es lo que te he mostrado. De todas formas como te digo diferentes compiladores con diferentes opciones de optimización te generarán diferentes ensambladores.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Efiencia con punteros
« Respuesta #6 en: Jueves 14 de Abril de 2011, 18:46 »
0
El problema de esas pequeñas optimizaciones es que su velocidad depende mucho del contexto (las instrucciones que le preceden y suceden, el estado de la memoria, el estado del caché, etc, etc.). También depende del compilador que uses (que instrucciones genera y si está optimizado para cierto tipo de procesadores), de la arquitectura del procesador y hasta del modelo del procesador. Al final no tienes la certeza si el código será una nada más rápido o una nada más lento, a menos que midas el rendimiento varias veces con una muestra representativa del tipo de datos que serán procesados y saques un promedio para compararlos objetivamente.

Lo que si da resultados, independientes de otros factores, es reducir la complejidad matemática del algoritmo.