Java 卡中的内存访问性能

Memory Access Performance in Java Card

假设我在 Java Card 中实例化了一个长度为 30 000 (byte[] array = new byte[(short) 0x7530];) 的持久字节数组,我每次使用我的小程序时都会 运行。 我还实例化了一个索引 i,我每次 运行 通过我的数组设置到 'remember' 下一次单元格开始的位置。

我的问题如下:如果我的数组长度很大(比如 30000在这种情况下)使用 array[i] ? 换句话说,指令 array[(short)0x7500] 可以比 array[(short) 0x0000] 花费更多的时间吗?如果响应是 "yes" 你能解释一下为什么吗?

提前致谢。

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

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

我们在这里讨论的是相当大的数组,一次会映射许多页面,因此每次出现页面错误时,您都必须进行很多很多这样的读取,并带有一个短暂的峰值。不要指望在测试用例中很容易看到它,但是意识到问题是很好的。特别是阅读矩形数组行优先! (也有助于 L1/L2 缓存)