Java Card中的内存访问性能

时间:2015-02-16 17:31:59

标签: performance memory smartcard javacard

假设我在Java Card中实例化了一个长度为30 000(byte[] array = new byte[(short) 0x7530];)的持久性字节数组,我每次使用我的applet时都会遇到这种情况。 我还实例化了一个索引i,我每次运行我的数组时都设置为“记住”下一次在哪个单元格开始。

我的问题如下:获取第n个单元格比获取第一个单元格更慢如果我的数组长度很大(在本例中为30000) array[i]? 换句话说,指令array[(short)0x7500]可以比array[(short) 0x0000]花费更多时间,如果回答是“是”,你可以解释一下原因吗?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

当然,内存会逐页加载。如果您的数组最终在两个或多个页面中,并且只有第一个页面被JIT加载(因为原因,一旦JIT和GC触摸它就很难跟踪内存)但最后一个尚未加载,访问最后一个单元格会导致page fault

对L1 / L2缓存等的影响除了(它变得非常复杂),相对于简单的DMA读取,页面错误仍然非常昂贵。最后我听说,在整个读取的持续时间内,它锁定了整个总线用于读取的每个核心,因此多个线程随机访问大型阵列会加剧问题

我们在这里谈论的是相当大的数组,许多页面一次被映射,所以每次页面错误时你都必须有很多很多这样的读取和短峰值。不要指望在测试用例中容易看到它,但是要注意这个问题是很好的。特别是首先读取矩形阵列! (也有助于L1 / L2缓存)