2016-08-04 65 views
5

Patrzyłem kod z JavaDays, autor stwierdził, że podejście to z prawdopodobieństwem jest bardzo skuteczny do przechowywania ciągów jak analog metody intern Stringdeduplikacji dla String metody intern w 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; 
    } 
} 

Proszę wyjaśnić mi, co jest efekt prawdopodobieństwa w tym wierszu:

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

jest to oryginalna prezentacja z Java dni https://shipilev.net/talks/jpoint-April2015-string-catechism.pdf (56-ty zjeżdżalnia)

+0

Jak dla mnie, wygląda na to 'if (ThreadLocalRandom.current() nextInt()> prob.)' Oświadczenie zaprojektowany tak powrócić ciąg i nie przechowywać wartości wejściowej na mapie zależy od ustawionego prawdopodobieństwa. – pacman

+0

Co się stanie, jeśli 'prob' jest duży? Co się stanie, jeśli będzie mały? –

+0

@Oliver Charlesworth Przypuszczam, że 'prob' jest prawdopodobieństwem w procentach – pacman

Odpowiedz

8

Jeśli spojrzeć na następnego slajd, który ma tabelę z danymi z różnych prawdopodobieństw lub słuchać do talk, widać/słychać uzasadnienie: probabilistyczne deduplicators zrównoważyć czas spędzony deduplikacji strun, a Oszczędności pamięci wynikające z deduplikacji. Pozwala to precyzyjnie dostroić czas spędzony na przetwarzanie Strings, lub nawet posypać deduplikatory o niskich probach wokół kodu, amortyzując w ten sposób koszty deduplikacji.

(Źródło: to są moje slajdy)

+0

Ponadto, jestem zaskoczony, że rozmowa pochodzi z JavaDays. Nigdy nie robiłem JavaDays. –

+0

Dziękuję za wspaniałe wyjaśnienie, to naprawdę wyjaśniło sytuację. Popełniłem błąd - myliłem JavaDays z Jpointem. Dziękuję za twoją pracę na temat katechizmu String, to jest niesamowite. – pacman

0

Podwójna wartość przekazywana do konstruktora ma być wartością prawdopodobieństwa z zakresu od 0.0 do 1.0. Jest konwertowany na liczbę całkowitą w taki sposób, że proporcja wartości całkowitych poniżej jest równa wartości podwójnej.

Całe wyrażenie ma na celu oszacowanie na true z prawdopodobieństwem równym parametrowi konstruktora. Używając matematyki całkowitej będzie ona nieznacznie szybsza niż w przypadku użycia surowej wartości podwójnej.

Intencją implementacji jest to, że czasami nie buforuje Stringa, a jedynie zwraca go. Powodem tego jest wyłączenie wydajności CPU vs pamięci: jeśli proces buforowania oszczędzający pamięć powoduje wąskie gardło procesora, możesz zwiększyć prawdopodobieństwo "nie robić nic", aż znajdziesz równowagę.