2011-02-09 86 views
4

爲了評估算法,我必須計算讀取/訪問字節數組項的頻率。字節數組填充了文件的內容,我的算法可以跳過數組中的許多字節(例如Boyer-Moore字符串搜索算法)。我必須找出一件物品實際上被讀取的頻率。這個字節數組傳遞給多個方法和類。Java中的數組的命中次數(讀取)

我的想法而已:

  1. 增量在每個點一個櫃檯裏的字節數組被讀取。這似乎很容易出錯,因爲這些地方有很多。此外,我將不得不刪除此代碼,以便它不影響我的算法的運行時間。

  2. 使用ArrayList,而不是一個字節數組,並覆蓋它的「get」方法。同樣,還有很多方法需要修改,我懷疑會有性能損失。

  3. 我可以以某種方式使用Eclipse調試模式?我看到我可以爲觀察點指定一個點擊數,但它似乎不可能以輸出的點擊數?!

  4. 也許Reflection API可以幫助我嗎?

  5. 有點像2),但爲了減少工作量:我可以讓一個Java方法接受一個ArrayList,它需要一個數組,以便它在每次讀取項目時透明地調用「get」方法?

回答

2

可能有一個開箱即用的解決方案,但我可能只是將字節數組包裝在一個簡單的類中。

public class ByteArrayWrapper { 
    private byte [] bytes; 
    private long readCount = 0; 

    public ByteArrayWrapper(byte [] bytes) { 
    this.bytes = bytes; 
    } 

    public int getSize() { return bytes.length; } 

    public byte getByte(int index) { readCount++; return bytes[ index ]; } 

    public long getReadCount() { return readCount; } 
} 

沿着這些線條的東西。當然這會影響運行時間,但不會太多。你可以嘗試一下,找出差異,如果你發現它很重要,我們必須找到另一種方式。

1

最有效的方法是添加一些代碼注入。然而,這比爲你的byte []寫一個包裝並且傳遞這個更復雜。 (乏味的,但至少編譯器會幫助你)如果你使用一個基本上什麼都不做的包裝器(不計算),它將幾乎和不使用包裝器一樣高效,當你想要計數時,你可以使用一個實現它的實現。

0

你可以使用的EHCache沒有太多的開銷:實現一個內存緩存,通過數組索引鍵。 EHCache提供了一個API,它可以讓您「開箱即用」查詢命中率。

+0

這聽起來對我來說太過於矯枉過正:爲外部庫引入一個可以輕鬆寫入小包裝的東西。 – 2011-02-09 12:52:12

+0

公平點;另一方面它避免了重新發明輪子。也許這取決於一個人寫作的信心/熟練程度。 – Brian 2011-02-09 13:10:27

0

有沒有辦法用一個真實的byte[]自動執行此操作。在這裏使用JVM TI可能會有所幫助,但我懷疑這是過度的。

個人我會寫一個簡單的包裝byte[]周圍read()write()特定領域的方法。然後這些方法可以跟蹤所有訪問(單獨爲每個字節,或作爲總數或兩者)。

當然這需要實際訪問進行修改,但是如果你想要測試一些算法可能並不是一個很大的缺點。性能也是如此:它肯定會受到一些影響,但效果可能足夠小而不必擔心。