java - without - Déduplication pour la méthode interne String dans ConcurrentHashMap




multikeymap (2)

J'ai regardé un code de JavaDays, l'auteur a dit que cette approche avec la probabilité est très efficace pour stocker des chaînes comme la méthode interne d'analogue à la chaîne

 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;
    }
}

S'il vous plaît, expliquez-moi, quel est l'effet de la probabilité dans cette ligne:

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

Ceci est une présentation originale de Java Days https://shipilev.net/talks/jpoint-April2015-string-catechism.pdf (56ème diapositive)


La valeur double transmise au constructeur est destinée à être une valeur de probabilité comprise entre 0,0 et 1,0. Il est converti en un nombre entier de telle sorte que la proportion de valeurs entières inférieures est égale à la valeur double.

L'expression entière est conçue pour évaluer à true avec une probabilité égale à celle du paramètre constructeur. En utilisant le calcul en nombre entier, il sera légèrement plus rapide que si la valeur double brute était utilisée.

L'intention de l'implémentation est que parfois, il ne mettra pas en cache la chaîne, au lieu de la renvoyer. La raison pour cela est un compromis CPU / performance de la mémoire: si le processus de mise en cache économisant la mémoire provoque un goulot d'étranglement du processeur, vous pouvez augmenter la probabilité de "ne rien faire" jusqu'à ce que vous trouviez un équilibre.


Si vous regardez la diapositive suivante qui a une table avec des données avec des probabilités différentes, ou écoutez la conversation , vous verrez / entendrez la logique: les déduplicateurs probabilistes équilibrent le temps passé à dédupliquer les chaînes, et les économies de mémoire provenant de la déduplication. Cela permet d'affiner le temps passé à traiter les chaînes, ou même de saupoudrer les déduplicateurs à faible probabilité autour du code, amortissant ainsi les coûts de déduplication.

(Source: ce sont mes diapositives)





concurrenthashmap