operator inicio fin etiquetas ejemplos php bit-shift multiplying

inicio - Desplazar bits vs multiplicar en PHP



etiquetas php en html (3)

Tengo el siguiente código:

<?php $start = 1; $timestart = microtime(1); for ($i = 0; $i < 1000000; $i++) { $result1 = $start * 4; } echo "/n"; echo microtime(1) - $timestart; echo "/n"; $timestart = microtime(1); for ($i = 0; $i < 1000000; $i++) { $result2 = $start << 2; } echo "/n"; echo microtime(1) - $timestart; echo "/n";

Esto produce:

0.14027094841003 0.12061500549316

Encontré en Internet una pregunta de entrevista de Google (que quería solicitar para un desarrollador, pero me doy cuenta de que no puedo), y una de las preguntas fue cuál era la forma más rápida de multiplicar un número. Mi primer pensamiento fue usar el signo * , así que lo probé.

Mi pregunta es, ¿por qué el desplazamiento de bits es más rápido que la multiplicación?


Debido a que el cambio de bits es algo que la computadora hace todo el tiempo en hardware, es una obviedad para la CPU. Multiplicar números arbitrarios es algo más difícil, porque no necesariamente se puede hacer usando un simple cambio de bits, pero requiere un trabajo real. Multiplicar un número entero pequeño por 4 resulta ser una operación que es idéntica a un desplazamiento a la izquierda por 2. Pero incluso si el compilador / tiempo de ejecución / CPU optimiza esta operación hasta un cambio de bit, primero es necesario que un código reconozca que se puede optimizar. De esta manera, es más trabajo que un simple cambio de bit.

De cualquier manera, es simplemente más trabajo porque las dos operaciones hacen cosas completamente diferentes, incluso si el resultado de ciertas operaciones es el mismo.


Debido a que un cambio de bit es una operación que se puede implementar directamente en el hardware, mientras que el hardware rara vez tiene operaciones de multiplicación implementadas directamente. La multiplicación por una potencia de dos se puede lograr con unas pocas compuertas lógicas simples, mientras que la multiplicación por multiplicandos arbitrarios requiere, como mínimo, varias multiplicaciones por potencias de dos más una operación de adición a uno mismo apiladas una sobre otra (5 = 2 * 2 + 1). No sé si el lenguaje PHP implementa específicamente una operación de cambio mediante el uso de las llamadas de bajo nivel disponibles, pero me sorprendería si no fuera así.

Fuente: años de experiencia + educación informática.


En las CPU Intel sandybrigde, parece un cambio con costos inmediatos de aproximadamente 1 ciclo de reloj, mientras que una multiplicación toma alrededor de 3-4 ciclos. Al parecer, todo el rendimiento del programa se ve afectado por más factores que solo la multiplicación en bruto, pero es suficiente para marcar la diferencia. La mayoría de los compiladores en estos días optimizan la multiplicación por las constantes 2 ^ n a turnos (a los compiladores les encanta optimizar su código :)) pero tal vez el intérprete de PHP no.