2016-08-04 3 views
5

Я смотрел код из JavaDays, автор говорит, что такой подход с вероятностью является очень эффективным для хранения строк, как аналог методы стажера Струнногодедупликация для метода стажера Струнного в ConcurrentHashMap

public class CHMDeduplicator<T> { 
    private final int prob; 
    private final Map<T, T> map; 

    public CHMDeduplicator(double prob) { 
     this.prob = (int) (Integer.MIN_VALUE + prob * (1L << 32)); 
     this.map = new ConcurrentHashMap<>(); 
    } 

    public T dedup(T t) { 
     if (ThreadLocalRandom.current().nextInt() > prob) { 
      return t; 
     } 
     T exist = map.putIfAbsent(t, t); 
     return (exist == null) ? t : exist; 
    } 
} 

Пожалуйста, объясни мне, что такое эффект вероятности в этой строке:

if (ThreadLocalRandom.current().nextInt() > prob) return t; 

Это оригинальная презентация от Java дней https://shipilev.net/talks/jpoint-April2015-string-catechism.pdf (56 слайд)

+0

Что касается меня, это выглядит как 'если (ThreadLocalRandom.current() nextInt()> вероят.)' Заявления разработана таким образом вернуть строку и не сохранять значение входного в карте, это зависит от установленной вероятности. – pacman

+0

Что произойдет, если 'prob' большой? Что произойдет, если оно мало? –

+0

@Oliver Charlesworth Я полагаю, что 'prob' является вероятностью в процентах – pacman

ответ

8

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

(Источник: это мои слайды)

+0

Кроме того, я удивлен, услышав, что речь идет о JavaDays. Я никогда не делал JavaDays. –

+0

Благодарим вас за отличное объяснение, оно действительно прояснило ситуацию. Я сделал ошибку - я запутал JavaDays с Jpoint. Спасибо за вашу работу о катехизисе String, это потрясающе. – pacman

0

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

Все выражение предназначено для оценки до true с вероятностью, равной вероятности параметра конструктора. Используя целочисленную математику, она будет немного быстрее, чем если бы использовалось необработанное двойное значение.

Цель внедрения заключается в том, что иногда он не кэширует строку, а просто возвращает ее. Причиной для этого является компрометация процессора и памяти: если процесс кэширования с сохранением памяти вызывает узкое место в процессоре, вы можете увеличить вероятность «ничего не делать» до тех пор, пока не найдете баланс.