/ vs. <<

Started by Drumpi, January 09, 2010, 02:40:09 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:

¿Raro el título? No, vereis cómo no.
Símplemente quería saber qué era más eficiente, si hacer una división (/) o un desplazamiento de bits (<<) cuando el divisor es una potencia de 2. Supongo que la respuesta es obvia, pero no se si al compilar se hace alguna optimización al respecto y da igual, por lo que queda más claro usar la división en lugar del desplazamiento.

Gracias.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Windgate

En unas prácticas de arquitectura bastante estúpidas que hice hace un tiempo nos insistieron muchísimo en usar << en lugar de dividir entre 2 por temas de eficiencia, pero me quedé con la misma duda, si el compilador (Era con C en ese caso) era capaz de detectar la mejora y aplicarla :P

Además me hizo mucha gracia que nos hablaran de eficiencia para un programa basado en consola que no hacía más que obtener direcciones de byte, de word, y cosas así a partir de una dirección de memoria en bits :D ni que fuese a saturar un PC xDDD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

<< es mas rapido, pero usando desde bennu, hay otras operaciones que se hacen cuando uno hace un / o un <<, asi que habria que ver que cosas se hacen en cada caso a nivel interprete... igualmente creo que sigue siendo mas rapida la rotacion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

jorobi, ahora mismo le estaba metiendo un codigo que si fuera par hiciera una cosa...

usaré contadores, ji ji

Windgate

Para comprobar si una variable es par:

PRIVATE
   int variable;

BEGIN
   variable = rand ( 0 , 65536 );
   IF ( variable % 2 == 0 )
      say ( "La variable es par" );
   ELSE
      say ( "La variable es impar" );
   END
END


El operador % calcula el resto de la división, si el resto al dividir entre 2 es 0, entonces es par, no sé si ya estabas al corriente de ese operador pero es útil para que ciertas cosas sucedan cada X frames y para detectar divisibilidad entre enteros.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Más fácil:

if ((variable & 1) ==1)
//es impar
else
//es par
end

Esto es añadiendo una máscara para comprobar el bit de menor peso (pone el resto a cero salvo ese, que vale lo que valía. Es más rápido que hacer la división y sacar el resto... a menos que pase algo similar a lo que propongo en el principio.

Muchas gracias por las respuestas, al final sólo sabemos que hay ir al código para mirarlo ^^U que bien. En fin, haremos caso a los profes de programación y usaremos las funciones más rápidas aunque no lo sean, lo mismo araño un par de frames en mi motor de tiles.

Wind, ten en cuenta que si no te explican en ese momento las funciones más eficientes ¿cuándo lo hacen? ;D Es buena costumbre optimizar los programas desde el primer momento, así luego no nos sale algo tan lento como Vist... ejem.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Windgate

Buen aporte Drumpi, nunca he sido amigo de los operadores booleanos y las máscaras de bits, pero la próxima vez que me meta en camisas de 11 varas lo tendré en cuenta, parece muy eficiente, karma++ fíjate tú xD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Futu-block

dentro del gazpacho de lenguajes con los que he ido aprendiendo, estaba el mod o barra invertida \ que servia para que sacara el resto de una división; por consiguiente, si cualquier numero mod 2 == 0 el numero es par...

creo que eso del mod tambien funciona en Bennu...
no lo sé, no lo he probao

Windgate

En lugar de poner mod pon % que es el mismo operador.

Quizás tengas que importar mod_math, ahora no recuerdo.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Sandman

Just a quick note: << can do "multiplication", >> does the "division".
-- Sandman

Futu-block

Quote from: Sandman on January 11, 2010, 02:33:41 PM
Just a quick note: << can do "multiplication", >> does the "division".
segun puedo ''maltraducir'' dices que << es multipicacion y >> es division...

pero mayor o igual que como es => o >= o da igual...
si, ya se que no tiene nada que ver...

Windgate

Usando esos operadores la división ignora el resto (Lógicamente) y ojo porque la multiplicación no es exacta, para los impares multiplica por 2 y resta 1.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Sandman: yes, you're right, maybe i was asleep. << and >> follows the writing order of binary numbers (LSB on the right).

Traducción: si, tienes razón, quizás estaba dormido. << y >> siguen el orden de escritura de los números binarios (BMS (bit menos significativo) a la derecha).

Futublog: mayor o igual es >=, en el mismo orden que lo dices.

Windgate: ¿como que para los impares la multiplicación multiplica por dos y resta uno?
3*2=6
011<<1=110
Lo que si podemos tener es problemas (y gordos) con los números negativos, por aquello de emplear el complemento a uno (o a dos, nunca supe cual es el que se usa en los PC).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Windgate

lol, it is true, multiply has no problems...

With division is integer division, but no more.

Sorry, I was sleepy, drunky or something :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es