Существуют ли какие-либо издержки производительности, связанные с использованием побитовых операторов? - PullRequest
2 голосов
/ 13 декабря 2010

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

Раньше я не использовал побитовые операторы, и мне было интересно, являются ли они быстрыми / медленными в PHP и JavaScript, то есть как построить двоичное число, а затем сравнить его с другим с помощью побитового оператора по сравнению с простым поиском логическое значение, хранящееся в массиве / объекте?

Ответы [ 4 ]

3 голосов
/ 13 декабря 2010

Битовые операции в целом являются самыми быстрыми операциями на языках более высокого уровня. В случае PHP они отображаются на базовый C, поэтому они не вызывают значительного снижения производительности каким-либо образом.

2 голосов
/ 10 ноября 2012

Согласно документации Mozilla, побитовые операции в JavaScript выполняются очень медленно, поскольку внутренне числа обрабатываются как значения с плавающей запятой, а не как int64. Поэтому я думаю, что вы должны избегать использования этого в вашем JavaScript, когда это возможно.

В PHP я не знаю и не видел никакой официальной документации по этому поводу.

2 голосов
/ 13 декабря 2010

Конечно, есть большие затраты на производительность, а именно те, что связаны с вашей собственной производительностью.

Во-первых, изменение полей bool на биты ничего не оптимизирует.Это не сделает ваше приложение быстрее.Во-вторых, вы сказали, что раньше не использовали побитовые операции, поэтому вы потеряете много времени на изучение новых вещей, которые вряд ли пригодятся в веб-программировании.В-третьих, ваш код становится на порядок менее читабельным, что означает значительные затраты на поддержку и рефакторинг в ближайшем будущем.Итог: не трать свое время.

1 голос
/ 13 декабря 2010

Единственный способ сделать это - это измерить - хотя я сомневаюсь, что выполнение побитовых операций в JavaScript поможет вам намного больше по массиву / объекту.

Я бы попробовал:

var len = 100000;
var bitwise = 0xdeadbeef;
var arrays = [1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1];
var start = new Date().getTime();
for (var i = 0; i < len; i++) {
   arrays[i % 32]; //Uncomment to test this
   //bitwise & (1 << (i % 32)); //Uncomment to test this
}
var end = new Date().getTime();
console.log((end-start)/len +"ms per access");

Я получил (Chrome, Windows 7, Core i7 920, 6 ГБ ОЗУ):

0.0015 ms per access for arrays
0.0016 ms per access for bit shifting.

Вы принимаете решение - оно практически несущественно.Используйте Массивы для немного лучшей скорости, используйте битовую упаковку, если необходимо сохранить пространство (пропускную способность).

...