Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Drumpi on January 09, 2010, 02:40:09 AM

Title: / vs. <<
Post by: Drumpi on January 09, 2010, 02:40:09 AM
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.
Title: Re: / vs. <<
Post by: Windgate on January 09, 2010, 02:38:50 PM
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
Title: Re: / vs. <<
Post by: SplinterGU on January 09, 2010, 02:59:36 PM
<< 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.
Title: Re: / vs. <<
Post by: Futu-block on January 10, 2010, 10:51:21 AM
jorobi, ahora mismo le estaba metiendo un codigo que si fuera par hiciera una cosa...

usaré contadores, ji ji
Title: Re: / vs. <<
Post by: Windgate on January 10, 2010, 01:17:22 PM
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.
Title: Re: / vs. <<
Post by: Drumpi on January 10, 2010, 01:30:36 PM
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.
Title: Re: / vs. <<
Post by: Windgate on January 10, 2010, 04:28:06 PM
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
Title: Re: / vs. <<
Post by: Futu-block on January 11, 2010, 08:17:26 AM
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
Title: Re: / vs. <<
Post by: Windgate on January 11, 2010, 12:43:47 PM
En lugar de poner mod pon % que es el mismo operador.

Quizás tengas que importar mod_math, ahora no recuerdo.
Title: Re: / vs. <<
Post by: Sandman on January 11, 2010, 02:33:41 PM
Just a quick note: << can do "multiplication", >> does the "division".
Title: Re: / vs. <<
Post by: Futu-block on January 11, 2010, 02:48:16 PM
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...
Title: Re: / vs. <<
Post by: Windgate on January 11, 2010, 07:43:44 PM
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.
Title: Re: / vs. <<
Post by: Drumpi on January 14, 2010, 11:05:56 PM
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).
Title: Re: / vs. <<
Post by: Windgate on January 15, 2010, 02:59:37 AM
lol, it is true, multiply has no problems...

With division is integer division, but no more.

Sorry, I was sleepy, drunky or something :P