为了评估算法,我必须计算读取/访问字节数组项的频率。字节数组填充了文件的内容,我的算法可以跳过数组中的许多字节(例如Boyer-Moore字符串搜索算法)。我必须找出实际读取项目的频率。这个字节数组传递给多个方法和类。
到目前为止我的想法:
在读取字节数组的每个位置递增计数器。这似乎容易出错,因为这些地方很多。此外,我之后必须删除此代码,以免影响我的算法的运行时间。
使用ArrayList而不是字节数组并覆盖其“get”方法。同样,有很多方法需要修改,我怀疑会有性能损失。
我可以以某种方式使用Eclipse调试模式吗?我看到我可以为观察点指定一个命中计数但是输出命中计数似乎不可能?!
也许Reflection API能以某种方式帮助我吗?
有点像2),但是为了减少工作量:我可以让Java方法接受一个ArrayList,它想要一个数组,这样只要一个项被读取它就会透明地调用“get”方法吗? / p>
答案 0 :(得分: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 :(得分:1)
执行此操作的最有效方法是添加一些代码注入。然而,要为你的byte []编写一个包装器并传递它,这可能要复杂得多。 (繁琐,但至少编译器会帮助你)如果你使用一个基本上没有任何东西(不计数)的包装器,它几乎与不使用包装器一样高效,当你想要计数时,你可以使用一个实现它。 / p>
答案 2 :(得分:0)
你可以使用EHCache而不需要太多开销:实现一个内存缓存,由数组索引键入。 EHCache提供了一个API,可让您“开箱即用”查询命中率。
答案 3 :(得分:0)
使用真实的byte[]
无法自动执行此操作。使用JVM TI可能对此有所帮助,但我怀疑它有点矫枉过正。
就个人而言,我会在byte[]
周围编写一个简单的包装器,其中包含read()
和write()
个特定字段的方法。然后,这些方法可以跟踪所有访问(单独为每个字节,或作为总计或两者)。
当然这需要修改实际访问权限,但如果你正在测试一些可能不是那么大的缺点的算法。性能也是如此:它肯定会受到一点影响,但效果可能很小,不用担心。