Performance des opérateurs bit à bit en javascript

L'une des principales idées derrière l'utilisation d'opérateurs bit à bit dans des langages comme C ++ / java / C # est qu'ils sont extrêmement rapides. Mais j'ai entendu dire que javascript, ils sont très lents (certes, quelques millisecondes ont probablement peu d'importance aujourd'hui). Pourquoi cela est-il ainsi?

( Cette question discute lorsque les opérateurs bit à bit sont utilisés, donc je change l'orientation de cette question en performance).

Quand souhaitez-vous les utiliser? Vous souhaitez les utiliser lorsque vous souhaitez effectuer des opérations bit à bit. Tout comme vous utilisiez des opérateurs booléens pour effectuer des opérations booléennes et des opérateurs mathématiques pour effectuer des opérations mathématiques.

Si vous êtes à l'aise avec les opérateurs bit à bit, il est très naturel de les utiliser pour certaines applications. Ils peuvent être utilisés à d'autres fins que d'un tableau booléen sur optimisé. Bien sûr, ces circonstances ne se présentent pas très souvent dans la programmation Javascript, mais ce n'est pas une raison pour laquelle les opérateurs ne devraient pas être disponibles.

C'est une ancienne question, mais personne ne semble répondre à la version mise à jour.

La performance frappée que vous obtenez avec le JavaScript qui n'existe pas en C / C ++ est la diffusion de la représentation en virgule flottante (comment JavaScript contourne tous ses nombres) à un nombre entier de 32 bits pour effectuer la manipulation des bits et revenir.

Personne ne utilise plus d'hexagone?

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(',') + ')'); 

J'utilise un décalage de zéro dans JS pour effectuer une troncature entière rapide:

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

J'ai trouvé de bonnes informations @ http://dreaminginjavascript.wordpress.com/2009/02/09/bitwise-byte-foolish/

Apparemment, ils fonctionnent très bien ces jours-ci. Pourquoi les utiliseriez-vous? La même raison que vous voudriez ailleurs.

Il y a un émulateur NES écrit en JavaScript – il semble faire beaucoup d'utilisation des opérations bit-bit.

Je pense que c'est à l'implémenteur de rendre un opérateur efficace ou inefficace. Par exemple, il n'y a rien qui empêche un implémentant JavaScript de créer une machine virtuelle JITting, qui transforme une opération bit par bit en 1 instruction machine. Donc, il n'y a rien de très lent sur «les opérateurs binaires en JavaScript».

Les gens font des choses intéressantes en JavaScript.

Par exemple, il existe beaucoup d'algorithmes de cryptographie mis en œuvre (pour diverses raisons); Bien sûr, les opérateurs bit à bit sont utilisés.

En utilisant JavaScript dans son incarnation JScript de Windows Scripting Host, vous pourriez avoir des raisons d'utiliser les opérateurs bit à bit pour choisir des indicateurs dans les valeurs renvoyées par les appels WMI ou Active Directory. Par exemple, la valeur d'accès de l'utilisateur d'un enregistrement d'utilisateur dans AD contient plusieurs indicateurs emballés dans un entier long.

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

Ou la structure de table arbitraire de quelqu'un peut contenir un tel champ, accessible par ADO avec JScript.

Ou vous voudrez peut-être convertir certaines données récupérées en une représentation binaire sur n'importe quelle plate-forme, simplement parce que:

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

Il y a donc de nombreuses raisons pour lesquelles on pourrait vouloir manipuler des bits en JavaScript. En ce qui concerne la performance, la seule façon de savoir est de l'écrire et de l'examiner. Je soupçonne que dans la plupart des cas, il serait parfaitement acceptable, pas nettement pire que n'importe quelle autre de la multitude d'inefficiences que ces systèmes contiennent.

Je doute que l'opération au bit est particulièrement lente dans javascript. Étant donné que de telles opérations peuvent se mapper directement aux opérations CPU, qui sont elles-mêmes assez efficaces, il ne semble pas y avoir de caractéristique inhérente aux opérations bit à bit qui les obligeraient à être irrémédiablement lentes dans javascript .
Edit December 2015 : Je suis corrigé! La performance frappée par Javascript souffre en ce qui concerne les opérations par bit provient du besoin de convertir de flotteur à int et en arrière (comme toutes les variables numériques dans Javascript sont stockées en tant que valeurs en virgule flottante). Merci à Chad Schouggins de l'indiquer.

Néanmoins, comme indiqué dans plusieurs réponses, il existe diverses applications de javascript qui reposent sur une opération bit à bit (ex: cryotgraphie et graphiques) et qui ne sont pas particulièrement lentes … (voir soyeux et Snarfblam sur cette page). Cela suggère que si plus lent que C / C ++ et d'autres langues qui traduisent directement des applications bit à des instructions de CPU natives uniques, les opérations par bit sont tout ce qui est lent.

N'oublions jamais la possibilité que certaines raisons particulières ont amené les différents implémenteurs des serveurs javascript à implémenter des opérations bitwise d'une manière qui les rend extrêmement lentes, et voir si cela importe même

Bien que javascript ait été utilisé à d'autres fins, l'utilisation la plus courante de cette langue dans la fourniture de type d'interface utilisateur type de services .
D'accord, je ne veux pas dire cela de manière péjorative du tout; L'exécution de ces fonctions intelligentes d'interface utilisateur, et compte tenu de diverses contraintes imposées à la langue et aussi de l'adhérence lâche aux normes, a nécessité et continue à exiger des hackers javascript talentueux.
Le fait est que, dans le contexte des exigences de type UI, la nécessité d'une quantité quelconque d'opérations bit à bit susceptibles d'exposer la lenteur de javascript dans la gestion de ces opérations est rare au mieux. Par conséquent, pour les utilisations typiques, les programmeurs devraient utiliser des opérations par bit où et si cette approche semble bien fonctionner avec les programmes / données globaux et ils devraient le faire sans se soucier des problèmes de performance. Dans le cas improbable de goulot d'étranglement de performance résultant de l'utilisation par bit, on peut toujours refactoriser les choses, mais on est mieux de rester clair grâce à l'optimisation anticipée.

L'exception notable à ce qui précède est l'introduction de la toile , sur les navigateurs modernes, nous pouvons nous attendre à ce que des fonctions graphiques plus primitifs seront nécessaires pour les hôtes javascript, et de telles opérations peuvent nécessiter, dans certains cas, de fortes doses d'opérations bit-bit (aussi bien que santé Des fonctions mathématiques). Il est probable que ces services seront éventuellement soutenus par des bibliothèques javascript (et même finissent par être des ajouts de langues). Pour ces bibliothèques, les intelligences communes de l'industrie auront été utilisées pour trouver les approches les plus efficaces. En outre, et en cas de faiblesse de la performance javascript avec les opérations bitwise, nous allons obtenir de l'aide, car je prédis que les implémentations javascript sur différents hôtes (navigateurs) seront modifiées pour améliorer cette zone particulière. (Cela suivrait le modèle typique d'évolution de javascript, que nous avons vu au fil des ans.)

Lorsque la vitesse est primordiale, vous pouvez les utiliser pour le masquage des bits: http://snook.ca/archives/javascript/storing_values/

En outre, si vous devez prendre en charge Netscape 4, vous les utiliserez pour traiter Document.captureEvents (). Pas que toute entreprise respectable vous ait écrit JS pour NS4 …

Beaucoup d'opérations bitwise sont évaluées ici: http://jsperf.com/rounding-numbers-down/3

Cependant, n'hésitez pas à créer votre propre testcase testcase sur jsPerf!