【问题标题】:Memory Access Performance in Java CardJava Card 中的内存访问性能
【发布时间】:2015-02-16 17:31:59
【问题描述】:

假设我在 Java Card 中实例化了一个长度为 30 000 (byte[] array = new byte[(short) 0x7530];) 的持久字节数组,我每次使用我的小程序时都会运行它。 我还实例化了一个索引i,每次我遍历我的数组时都会设置它以“记住”下次从哪个单元开始。

我的问题如下:如果我的数组长度很大(在这种情况下为 30000),那么获取第 n 个 单元格是否比获取第一个单元格要慢强>array[i] ? 换句话说,指令array[(short)0x7500] 可以比array[(short) 0x0000] 花费更多的时间吗?如果回答是“是”,你能解释一下为什么吗?

提前谢谢你。

【问题讨论】:

    标签: performance memory smartcard javacard


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-15
      • 2015-12-19
      • 2015-01-06
      • 2022-08-18
      • 1970-01-01
      • 2018-12-27
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多