var App = App || {};
App = {
getDataFromServer: function(){
var self = this,
deferred = $.Deferred(),
requests = [];
requests.push($.getJSON('request/ajax/url/1'));
requests.push($.getJSON('request/ajax/url/2'));
$.when.apply(jQuery, requests).done(function(xhrResponse) {
return deferred.resolve(xhrResponse.result);
});
return deferred;
},
init: function(){
this.getDataFromServer().done(_.bind(function(resp1, resp2) {
// Do the operations which you wanted to do when you
// get a response from Ajax, for example, log response.
}, this));
}
};
App.init();
Да, modulo x % pow(2, n)
может быть достигнуто с помощью x & ((1 << n) - 1)
Но% -оператор в java может давать разные результаты, если x отрицательный, поэтому слепо подставляя один для другого, может нарушить код ,
Когда бит-адресация, маскировка и т. д. обычно используется & amp; -variant, поскольку его семантически ближе к тому, что используется в ассемблере / C и подписи, обычно не требуется / не заботится в этом случае.
Что касается того, что JIT оптимизирует% до & amp ;, ответ будет: он полностью зависит от JIT - и это движущаяся цель.
В случае x % y
, где y isn ' t константа его довольно трудно определить, если y является степенью 2, поэтому предположительно этот случай не оптимизируется, потому что обнаружение его очень сложно или невозможно. Если y является константой, JIT все еще доказывает, что x не является отрицательным, или вставьте условное выражение, подобное result = x < 0 ? x % y : x & (y-1)
. Он может или не может этого сделать, в зависимости от JIT, о котором идет речь, а также в зависимости от платформы. Как известно, в некоторых случаях Hotspot использует различные оптимизации для разных процессоров (из той же ISA, а именно AMD против Intel).
Я потратил некоторое время на этот самый вопрос, написав это сообщение в блоге со всеми подробностями.
Короче:
irem
(mod int) на ~ 20% медленнее, чем n & (pow2-1)
трюк frem
(mod float) на 3 раза медленнее Таким образом, есть явное преимущество, чтобы не делать mod
в парном разряде, и вы можете получить некоторую выгоду от натуральных дивидендов Integer и мощность 2 дивизоров.
Вот один фрагмент кода кода
public class Test {
public static void main(String[] args) {
int a=103;
int b=5;
int c=a%b;
}
}
Теперь, если вы видите скомпилированный код этого файла, вы увидите
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
0: bipush 103
2: istore_1
3: iconst_5
4: istore_2
5: iload_1
6: iload_2
7: irem
8: istore_3
9: return
bipush - нажмите байт на стек, как целочисленное значение, т. е. 103
istore_1 -Попляет int из стека и сохраняет его в локальной переменной в текущем кадре.
и в 3: iconst_5 постоянное целое нажимается на stack
istore_2 делает то же самое, что и istore_1, только переменная с именем изменена.
Затем 5: iload_1
и 6:iload_2
обе переменные снова помещаются в стек для операций
now at 7:irem the remainder operator works which you are calling as modulo.
Теперь как работают операторы Remainder. Это Pops два ints (значение a и b) из стека операндов, делит a на b, вычисляет остаток и возвращает остатки int обратно в стек. Остаток равен (b - ((a / b) * b)). Это то, что используется оператором% в Java.