2016-08-04 65 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

謝謝你的好解釋,它真的澄清了情況。我犯了一個錯誤 - 我與Jpoint混淆了JavaDays。謝謝你關於絃樂教理問答的工作,這真是太神奇了。 – pacman

0

傳遞給構造函數的double值旨在成爲0.0到1.0範圍內的概率值。它被轉換爲一個整數,使得它下面的整數值的比例等於double值。

整個表達式被設計爲以true評估,其概率等於構造函數參數的概率。通過使用整數數學,它會比使用原始的double值稍快。

實現的目的是有時它不會緩存String,而只是返回它。這樣做的原因是CPU與內存性能的權衡:如果內存保存緩存過程導致CPU瓶頸,則可以調高「無操作」概率,直到找到平衡點。