Как реализовано% java? [Дубликат]

Вот некоторые подходы к работе с асинхронными запросами:
  1. Объект обезьяны браузера
  2. Q - A
  3. A + Promises.js
  4. jQuery отложен
  5. API XMLHttpRequest
  6. Использование концепции обратного вызова - как реализация в первом ответе

Пример: jQuery отложенная реализация для работы с несколькими запросами

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();
2
задан E Cheung 24 April 2015 в 09:53
поделиться

3 ответа

Да, 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).

3
ответ дан Durandal 25 August 2018 в 08:37
поделиться

Я потратил некоторое время на этот самый вопрос, написав это сообщение в блоге со всеми подробностями.

Короче:

  • HotSpot JDK 1.8 irem (mod int) на ~ 20% медленнее, чем n & (pow2-1) трюк
  • The HotSpot JDK 1.8 frem (mod float) на 3 раза медленнее
  • Вы пробегаете варьируется в зависимости от пропусков JIT, поэтому преимущество для Int минимально

Таким образом, есть явное преимущество, чтобы не делать mod в парном разряде, и вы можете получить некоторую выгоду от натуральных дивидендов Integer и мощность 2 дивизоров.

2
ответ дан Joseph Lust 25 August 2018 в 08:37
поделиться

Вот один фрагмент кода кода

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.

-1
ответ дан user207421 25 August 2018 в 08:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: