traduccion operadores leviton how bitwise javascript bitwise-operators

leviton - Rendimiento de operadores bitwise en javascript



how to use bitwise operators in javascript (12)

¿Cuándo querrías usarlos? Desearía usarlos cuando desee realizar operaciones a nivel de bits. Al igual que usaría operadores booleanos para realizar operaciones booleanas, y operadores matemáticos para realizar operaciones matemáticas.

Si se siente cómodo con los operadores de bitwise, es muy natural utilizarlos para algunas aplicaciones. Se pueden usar para muchos propósitos distintos de una matriz booleana sobre-optimizada. Por supuesto, estas circunstancias no aparecen muy a menudo en la programación de Javascript, pero esa no es la razón por la que los operadores no deberían estar disponibles.

Una de las ideas principales detrás del uso de operadores bitwise en lenguajes como C ++ / java / C # es que son extremadamente rápidos. Pero he escuchado que en javascript son muy lentos (hay que reconocer que algunos milisegundos probablemente no importen mucho hoy). ¿Por qué esto es tan?

( esta pregunta explica cuándo se utilizan los operadores bitwise, así que estoy cambiando el enfoque de esta pregunta al rendimiento).


¿Ya nadie usa el hex?

function hextoRgb(c) { c = ''0x'' + c.substring(1); return [(c >> 16) & 255, (c >> 8) & 255, c & 255]; } var c1 = hextoRgb(''#191970''); alert(''rgb('' + c1.join('','') + '')'');


Al utilizar JavaScript en su encarnación JScript de Windows Scripting Host, es posible que tenga que usar operadores a nivel de bits para seleccionar indicadores en los valores devueltos por las llamadas de WMI o Active Directory. Por ejemplo, el valor de acceso de usuario del registro de un usuario en AD contiene varios indicadores empaquetados en un entero largo.

ADS_UF_ACCOUNTDISABLE = 0x00000002; if (uac & ADS_UF_ACCOUNTDISABLE == ADS_UF_ACCOUNTDISABLE) { // user account has been disabled }

O la estructura de tabla arbitraria de alguien puede contener un campo de este tipo, accesible a través de ADO con JScript.

O tal vez desee convertir algunos datos recuperados en una representación binaria en cualquier plataforma, solo porque:

BinaryData = "L"; BinaryString = BinToStr(BinaryData, ".", "x"); // BinaryString => ''.x..xx..''

Así que hay muchas razones por las que uno podría querer hacer manipulación de bits en JavaScript. En cuanto al rendimiento, la única forma de saberlo es escribirlo y probarlo. Sospecho que en la mayoría de los casos sería perfectamente aceptable, no significativamente peor que cualquier otra de la multitud de ineficiencias que contienen estos sistemas.


Creo que depende del implementador hacer que un operador sea eficiente o ineficiente. Por ejemplo, no hay nada que impida que un implementador de JavaScript realice una máquina virtual de JIT, lo que convierte una operación a nivel de bits en 1 instrucción de máquina. Así que no hay nada intrínsecamente lento acerca de "los operadores bitwise en JavaScript".


Cuando la velocidad es primordial, puede usarlos para enmascarar bits: http://snook.ca/archives/javascript/storing_values/

Además, si necesita admitir Netscape 4, los usaría para tratar con Document.captureEvents (). No es que cualquier compañía respetable te haga escribir JS para NS4 ...


Dudo que las operaciones a nivel de bits sean particularmente lentas en javascript. Dado que tales operaciones pueden asignarse directamente a las operaciones de la CPU, que son en sí bastante eficientes, no parece haber ninguna característica inherente de las operaciones a nivel de bits que las obligue a ser irremediablemente lentas en JavaScript .
Edición de diciembre de 2015 : ¡Estoy corregido! El impacto de rendimiento que sufre Javascript con respecto a las operaciones bitwise proviene de la necesidad de convertir de float a int y back (ya que todas las variables numéricas en Javascript se almacenan como valores de punto flotante). Gracias a Chad Schouggins por señalarlo.

Sin embargo, como se indica en varias respuestas, existen varias aplicaciones de javascript que se basan en la operación a nivel de bits (por ejemplo, criptografía y gráficos) y que no son particularmente lentas ... (vea sedoso y Snarfblam en esta página). Esto sugiere que, si bien es más lento que C / C ++ y otros lenguajes que traducen directamente las operaciones bitwise a las instrucciones de la CPU nativa única, las operaciones bitwise son todas tan lentas.

De todos modos, no dejemos de considerar la posibilidad de que algunas razones en particular hayan provocado que los distintos implementadores de hosts de javascript implementen operaciones de bitwise de una manera que las haga extremadamente lentas, y veamos si esto es importante ...

Aunque javascript se ha utilizado para otros fines, el uso más común de este lenguaje es en la prestación de servicios de tipo de interfaz de usuario .
Por cierto, no quiero decir esto de ninguna manera peyorativa; realizar estas funciones inteligentes de la interfaz de usuario, y considerar las diversas restricciones impuestas en el idioma y también la falta de adherencia a los estándares, ha requerido, y sigue requiriendo, hackers talentosos de javascript.
El punto es que en el contexto de los requisitos de tipo UI, la necesidad de cualquier cantidad de operaciones bitwise susceptibles de exponer la lentitud de javascript en el manejo de tales operaciones es poco común en el mejor de los casos. En consecuencia, para usos típicos, los programadores deben usar operaciones bitwise donde y si este enfoque parece fluir bien con el programa / datos en general y debe hacerlo con poca preocupación por los problemas de rendimiento. En el improbable caso de que el rendimiento del cuello de botella se derive del uso a nivel de bits, siempre se puede refactorizar las cosas, pero es mejor evitar las primeras optimizaciones.

La notable excepción a lo anterior es con la introducción del lienzo , en los navegadores modernos, podemos esperar que se requieran funciones gráficas más primitivas de los hosts de javascript, y tales operaciones pueden requerir en algunos casos dosis elevadas de operaciones a nivel de bits (además de funciones sanas). hace de funciones matemáticas). Es probable que estos servicios eventualmente sean soportados por medio de bibliotecas de javascript (e incluso terminen como adiciones de idiomas). Para tales bibliotecas, la inteligencia común de la industria se habrá utilizado para descubrir los enfoques más eficientes. Además, y si de hecho hay una debilidad en el rendimiento de javascript con operaciones a nivel de bits, obtendremos algo de ayuda, ya que predigo que las implementaciones de javascript en varios hosts (navegadores) se modificarán para mejorar esta área en particular. (Esto seguiría el patrón típico de evolución de javascript, que hemos visto a lo largo de los años).



Esta es una pregunta bastante antigua, pero nadie pareció responder la versión actualizada.

El impacto de rendimiento que se obtiene con JavaScript que no existe en C / C ++ es la conversión desde la representación de punto flotante (cómo JavaScript marca todos sus números) a un entero de 32 bits para realizar la manipulación de bits y viceversa.


Hay un emulador de NES escrito en JavaScript: parece hacer mucho uso de las operaciones bitwise.


La gente hace cosas interesantes en JavaScript.

Por ejemplo, hay una gran cantidad de algoritmos de criptografía implementados en ella (por varias razones); así que por supuesto se utilizan operadores bitwise.



Uso el cambio de cero a nivel de bits en JS para realizar un truncamiento rápido de enteros:

var i=3.141532; var iTrunc=i>>0; //3