2016-08-04 34 views
5

ich einen Code von JavaDays beobachtete, sagte Autor, dass dieser Ansatz mit der Wahrscheinlichkeit ist sehr effektiv für Streicher wie Analog-String intern MethodeDeduplizierung für String intern Methode in 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; 
    } 
} 

Bitte erklären Sie mir zu speichern, was ist Auswirkungen der Wahrscheinlichkeit in dieser Zeile:

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

Dies ist Original-Präsentation von Java Tagen https://shipilev.net/talks/jpoint-April2015-string-catechism.pdf (56th Folie)

+0

Was mich betrifft, sieht es aus wie 'if (ThreadLocalRandom.current() nextInt()> prob.)' Aussage so Rücksaite und nicht Eingabewert speichern In der Karte hängt es von der eingestellten Wahrscheinlichkeit ab. – pacman

+0

Was passiert, wenn "prob" groß ist? Was passiert, wenn es klein ist? –

+0

@Oliver Charlesworth Ich nehme an, dass "prob" ist Wahrscheinlichkeit in Prozent – pacman

Antwort

8

Wenn Sie an der Dia nächsten, die auf eine Tabelle mit Daten mit verschiedenen Wahrscheinlichkeiten hat, oder hören zum talk, werden Sie sehen/hören die Gründe: probabilistische deduplicators die Zeit balancieren die Saiten verbrachte Deduplizierung und Die Speicherersparnisse stammen von der Deduplizierung. Dies ermöglicht eine Feinabstimmung der Zeit, die für die Verarbeitung von Strings aufgewendet wird, oder streut sogar die Low-Prob-Deduplizierer um den Code und amortisiert so die Deduplizierungskosten.

(Quelle: Das sind meine Dias)

+0

Auch ich bin überrascht zu hören, dass das Gespräch von JavaDays ist. Ich habe nie JavaDays gemacht. –

+0

Vielen Dank für die großartige Erklärung, es hat wirklich die Situation geklärt. Ich habe einen Fehler gemacht - ich habe JavaDays mit Jpoint verwechselt. Vielen Dank für Ihre Arbeit über String Catechism, es ist erstaunlich. – pacman

0

Der doppelte Wert, der an den Konstruktor übergeben wird, soll ein Wahrscheinlichkeitswert im Bereich von 0,0 bis 1,0 sein. Es wird in eine ganze Zahl umgewandelt, so dass der Anteil der darunter liegenden ganzzahligen Werte gleich dem doppelten Wert ist.

Der gesamte Ausdruck soll true mit einer Wahrscheinlichkeit gleich dem Konstruktorparameter auswerten. Durch Verwendung von Ganzzahlmathematik wird es etwas schneller als wenn der rohe Doppelwert verwendet würde.

Die Absicht der Implementierung ist, dass es die Zeichenfolge manchmal nicht zwischenspeichert, sondern nur zurückgibt. Der Grund hierfür ist ein Kompromiss zwischen CPU- und Speicherleistung: Wenn der speichersparende Caching-Prozess einen CPU-Engpass verursacht, können Sie die Wahrscheinlichkeit, nichts zu tun, aufdrehen, bis Sie einen Saldo gefunden haben.