Rolf b: Bit Operatoren

Beitrag lesen

Bit-Operatoren sind sinnvoll, wenn die fachliche Aufgabenstellung eine Bitmanipulation ist. Wenn man sie braucht, und nicht hat, quält man sich mit Division und Modulo ab, um die benötigten Bits zu isolieren. Deshalb schadet es zur Laufzeit nichts, wenn die Sprache sie einfach mal anbietet. Der Parser braucht dann vielleicht einen Wimpernschlag länger. Sonst nichts.

Aber du hast ursprünglich gesagt, Bit-Operationen seien aufwendig bzw. zeitintensiv, und genau das Gegenteil ist der Fall: Das sind so ziemlich die schnellsten und effizientesten Operationen überhaupt.

Prinzipiell gebe ich Dir recht, aber z.B. MDN schreibt:

The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format.

Und da frage ich: Wie speichert JavaScript Zahlen? Ist es nicht so, dass JavaScript nur "Number" kennt und als Fließkommazahl speichert? D.h. bei Anwendung der Bitoperatoren erfolgt implizit eine int/float. Und vorher noch eine Abfrage, ob vielleicht doch ein String in der Variablen steht. Wenn ja, muss der erstmal numerifiziert werden. Und vielleicht bit-kombiniert man Eigenschaftswerte aus Objekten? Das Ausführen der eigentlichen Bit-Operation gelingt dann vielleicht in einer New Yorker Sekunde (wie bitte?), aber während der Zeit für die Vorarbeit kannst Du den Rasen im Central Park mähen.

Natürlich ist es nicht wirklich so schlimm. Man darf aber die Performance von Bit-Operationen in einer ungetypten Umgebung wie JavaScript nicht zu hoch einschätzen. Bei getypten Sprachen (oder Umgebungen wo der Compiler eine Typinferenz durchführen kann) entfällt die Vorarbeit, und nur dann ist es richtig fix.

Ein Beispiel: Vor 15 Jahren hatte ich die Aufgabe, in C# eine Bitmap umzurechnen. Ich habe sie als Array von Punkten betrachtet und darauf hantiert. Die Operation pro Pixel war eine primitive Bitmanipulation, aber die ganze Bitmap durchzuackern dauerte viele Sekunden. Dann habe ich sogenannten unsafe Code benutzt (ein spezieller Modus von .net) und statt Tabellenzugriffen mit Pointern gearbeitet - und die Funktion war in einem Wimpernschlag fertig. Die Bitoperationen waren schnell, der Zeitfresser war der Arrayzugriff, bei dem jedesmal die Koordinaten auf Grenzverletzung geprüft wurden und in Speicheroffsets umzurechnen waren.

Gruß Rolf