2012-10-10 13 views
3

我目前正在研究我的論文項目,設計一個與最短路徑圖算法一起使用的緩存實現。圖算法與運行時相當不一致,因此對整個算法進行基準測試太麻煩。我必須專注於僅對緩存進行基準測試。使用大數據進行微博標記

我需要基準的緩存是關於Map接口的十幾實現。這些緩存被設計爲與給定的訪問模式(從上面的算法查詢密鑰的順序)一起工作良好。但是,在一個「小」問題的運行中,有幾千億個查詢。我需要運行幾乎所有人對基準測試結果充滿信心。

我有關於將數據加載到內存的概念性問題。可以創建一個查詢日誌,該日誌只是在算法的一次運行中查詢的所有密鑰(它們是10個字符的字符串標識符)的磁盤有序列表。這個文件是巨大的。其他的想法我會打破記錄成1-5萬次查詢塊,並在基準以下方式:

  1. 裝載1-5萬人鍵
  2. 設置起始時間到當前時間
  3. 查詢他們爲了
  4. 記錄經過的時間(當前時間 - 開始時間)

我不確定什麼效果,這將與緩存有。我怎麼能進行一個熱身期?加載文件可能會清除L1或L2高速緩存中最後一個塊的所有數據。另外,維護一個1-5百萬個元素的字符串數組有什麼作用(甚至可以迭代它的結果偏斜)?

請記住,訪問模式很重要!例如,有一些哈希表,其中包含move-to-front啓發式,它重新排序表的內部結構。這將是不正確的多次運行單個塊,或運行塊不按順序。這使得CPU緩存和HotSpot升溫變得更加困難(我還可以保留用於升溫但不是定時的輔助虛擬緩存)。

什麼是具有巨大數據集的microbenchmarks的良好做法?

+2

這不是一個「微基準」。這是一個「macrobenchmark」。 –

+1

但它是單一操作的基準測試 - 散列表查找。 – efritz

+0

如果你測量的是毫秒,不要使用'System.currentTimeMillis',使用'System.nanoTime()':[System.currentTimeMillis vs System.nanoTime](http://stackoverflow.com/q/351565/1065197 ) –

回答

1

如果我正確地理解了這個問題,那麼如何在一臺機器上加載查詢日誌,如果沒有足夠的內存,可能會以塊的形式加載,然後通過專用網絡將流式傳輸到運行基準測試的機器上(交叉電纜,可能),所以您在被測系統和測試代碼/數據之間的干擾最小...?

無論您使用的解決方案,你應該儘量多的運行,所以你可以評估的可重複性 - 如果你沒有得到合理的可重複性,那麼你至少可以檢測到您的解決方案是不合適的!

更新:回覆:配料和時間 - 在實踐中,你可能會結束了某種形式的精細配料的,至少,在網絡上有效地獲取數據。如果你的數據屬於自然大型「羣體」或階段,那麼我會單獨檢查這些異常情況,但最依賴整體時間。我沒有看到從小批量時間(假設您運行數百萬次)時間的很多好處。

即使您在一臺擁有大量RAM的機器上運行所有內容,也可能需要將數據加載到一個JVM中,並將代碼加載到另一個JVM上,以便緩存JVM上的垃圾收集不會(直接)受到影響由保存查詢日誌所需的大堆組成。

+0

如果使用網絡,您是否在進入時逐個執行密鑰查找,或者它們是否應該以10,000或1,000,000個查找組進行批處理?無論哪種情況,你會計時多少錢(一切或一組查詢)? – efritz

+0

作爲參考,讀取文件需要大約80-90%的時間來運行測試(讀取文件,創建測試數組,執行所有查找)。 – efritz

+0

在這種情況下,它似乎值得投入足夠的RAM來加載一次數據集,然後將其提供給多個候選人。 – DNA