Значение побитовых операций в javascript

Возможный дубликат:
Где я бы использовал побитовый оператор в JavaScript?

В c/c++ побитовые операции быстрее, чем обычные (арифметические) операции (значимые, по крайней мере, в процессорах с низкой производительностью). То же самое применимо к js? Я не думаю, что причина того, что он быстрее в c, заключается в том, что побитовые операции жестко запрограммированы и обычно выполняются за 1 цикл процессора. Но js работает в браузере, у которого нет такого аппаратного доступа (я имею в виду регистры). Не уверен (уверен примерно на 70% :)). Каковы типичные (или более разумные) варианты использования побитовых операторов (особенно в js, но я хотел бы знать и другие). Пожалуйста, поправьте меня, если я где-то ошибаюсь.


person 0xc0de    schedule 31.01.2012    source источник


Ответы (2)


Побитовые операторы в JS медленные. Действительно медленнее по сравнению с C. Причина в том, что в JS все числа представлены как числа с плавающей запятой двойной точности, поэтому для выполнения побитовой операции среда выполнения должна преобразовать их в 32-битные целые числа и обратно.

Это не значит, что они бесполезны. например, Node # compareDocumentPosition возвращает битовую маску, а something.length >>> 0 является общий способ получения свойства длины something или нуля, если length не является числом или равно NaN. Кроме того, a / b | 0 - это быстрый способ сделать Math.floor(a / b), если a и b> = 0.

person Peter C    schedule 31.01.2012
comment
something.length || 0 тоже не будет работать? - person Matthew; 13.03.2012
comment
В случае undefined, null и NaN да, но >>> 0 также работает в случае чего-либо, кроме числа. Хорошая мысль, я отредактирую это. - person Peter C; 14.03.2012
comment
@ josh3736 Это менее читабельно, но не нечитабельно. Если вы видели это раньше и знаете, что это значит, это совсем не плохо. И, к сожалению, это действительно быстрее. - person Peter C; 13.06.2012
comment
семантика JavaScript гарантирует диапазон чисел и работу побитовых операторов. Однако оптимизированные реализации / JIT JS будут использовать вывод типа int32 и теги типа (чтобы избежать двойного бокса), что приведет к значительно более быстрому выполнению. В этом контексте (в 2014 году) абзац первый является необоснованным. - person user2864740; 10.10.2014

Некоторые побитовые операторы в некоторых случаях быстрее, чем арифметические. Трудно оптимизировать Javascript, потому что производительность сильно зависит от браузеров, платформ и моделей компьютеров.

Современные браузеры компилируют код Javascript в собственный код, поэтому некоторые вещи, которые говорится о скомпилированных языках, также актуальны для Javascript. Однако некоторые вещи, которые говорят о компилируемых языках, становятся все более и более неточными с новыми процессорами. Например, больше не актуально смотреть на производительность одной операции процессора, поскольку операции выполняются параллельно. Вы смотрите не на то, сколько циклов занимает операция, а на то, сколько операций вы можете выполнить за цикл.

Чтобы определить, является ли конкретная операция в Javascript быстрее или медленнее, чем другая, вам придется протестировать ее на самых разных компьютерах и браузерах и посмотреть на среднее, лучшее и худшее. Даже в этом случае любой конкретный результат, который вы получите, будет все больше и больше устаревать с каждой выпускаемой новой версией браузера.

person Guffa    schedule 31.01.2012
comment
спасибо, +1 за красивое объяснение. - person 0xc0de; 21.02.2012