создание положительного значения переменной

Давайте возьмем пример от бумага Google . Цель MapReduce состоит в том, чтобы быть в состоянии использовать эффективно загрузку блоков обработки, работающих в параллелях на некоторые алгоритмы. exemple следующий: Вы хотите извлечь все слова и их количество в ряде документов.

Типичная реализация:

for each document
    for each word in the document
        get the counter associated to the word for the document
        increment that counter 
    end for
end for

реализация MapReduce:

Map phase (input: document key, document)
for each word in the document
    emit an event with the word as the key and the value "1"
end for

Reduce phase (input: key (a word), an iterator going through the emitted values)
for each value in the iterator
    sum up the value in a counter
end for

, Вокруг которого, у Вас будет основная программа, которая разделит набор документов в "разделениях", которые будут обработаны параллельно для фазы Карты. Испускаемые значения записаны рабочим в буфере, характерном для рабочего. Основная программа тогда делегирует других рабочих для выполнения Уменьшать фазы, как только это уведомляется, что буфер готов быть обработанным.

Каждый рабочий произвел (быть Картой, или Уменьшать рабочий) на самом деле файл, хранивший в распределенной файловой системе (GFS для Google) или в распределенной базе данных для CouchDB.

45
задан Kelly S. French 9 November 2009 в 17:57
поделиться

5 ответов

Используйте Math. abs .

Ниже приведен комментарий об использовании отрицания (спасибо Келли за то, что заставил меня задуматься), и он немного быстрее по сравнению с Math.abs при большом количестве преобразований если вы сделаете локальную ссылку на функцию Math.abs (без локальной ссылки Math. abs намного медленнее).

См. ответ на этот вопрос для получения более подробной информации. Для малых чисел разница незначительна, и я думаю, что Math.abs - гораздо более чистый способ «самодокументирования» кода.

55
ответ дан 26 November 2019 в 21:08
поделиться

Между этими двумя вариантами (спасибо за пример @Kooilnc):

Number.prototype.abs = function(){
    return Math.abs(this);
};

и

var negative = -23, 
    positive = -negative>0 ? -negative : negative;

идут со вторым (отрицание). Это не требует вызова функции, и ЦП может сделать это за очень мало инструкций. Быстро, легко и эффективно.

23
ответ дан 26 November 2019 в 21:08
поделиться
if (myvar < 0) {
  myvar = -myvar;
}

или

myvar = Math.abs(myvar);
14
ответ дан 26 November 2019 в 21:08
поделиться

или, если вы хотите избежать вызова функции (и ветвления), вы можете использовать этот код:

x = (x ^ (x >> 31)) - (x >> 31);

это немного "хакерский" и выглядит неплохо в какой-то странной манере :) но я бы все равно придерживался Math.abs (просто хотел показать еще один способ сделать это)

кстати, это работает только если базовый механизм javascript хранит целые числа как 32-битные, что имеет место в firefox 3.5 на моем компьютере (32-битный, поэтому он может не работать на 64-битном компьютере, не тестировал ...)

2
ответ дан 26 November 2019 в 21:08
поделиться

Это не реализация jQuery, но используется библиотека Math из Javascript

x = Math.abs (x);

1
ответ дан 26 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

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