java - XOR 字节数组的成本似乎非常低,低于 arraycopy

标签 java append jit xor arrays

我正在上一门加密课,主要是作为学术练习,我一直在尝试获得尽可能高的速度。我发现了一些奇怪的事情,即异或字节数组的成本非常低,但在相同大小的字节数组上使用 arraycopy 的成本更高。我想这一定是一些 JIT 巫术,想知道是否有人可以解释一下。

相关代码:

private byte[] cryptBlock(){
    byte[] iv = Arrays.copyOf(IV, IV.length);
    iv[blocNo % BLOCKSIZE] += blockNo + 1;
    iv = Misc.cleanXOR(key, iv); //A
    iv = Arrays.copyOf(iv, BLOCKSIZE + iv.length); //B
    System.arraycopy(key, 0, iv, BLOCKSIZE, BLOCKSIZE); //C
    return Misc.cleanXOR(buffer, mD.digest(iv));
}
public static byte[] cleanXOR(byte[] a, byte[] b){
    byte[] c = new byte[a.length];
    int i=0;
    for (byte d : a)
        c[i] = (byte) (d ^ b[i++]);
    return c;
}

cryptBlock 每 32 个字节被调用一次,我对一个 1MB 字节的数组进行了几次加密,并对时间进行平均以获得速度。

尽管对大约 3125000 个 32 字节的 block 进行异或运算,但注释掉 A 行而不是 B 行或 C 行的运行时间与注释掉任何行所花费的时间相同 (20MB/s)。

注释掉行 B 和 C 而不是 A 以 35MB/s 的速度运行

注释掉所有行(A、B 和 C)以 37MB/s 的速度运行

谁能解释一下?

编辑:我写了一个小数组复制实现来比较速度,它在我的代码中运行速度与 System.arraycopy 差不多。

public static void arraycopy(byte[] source, int srcPos, byte[] dest, int destPos, int length){
        for(int i = 0; i < length; i++){
            dest[i + destPos] = source[i + srcPos];
        }
    }

最佳答案

I'm encrypting a 1MB byte array a couple times...

由于 Java 执行环境的复杂性,对 Java 代码进行基准测试存在很多缺陷。

简单地运行代码几次并计时,这听起来不像是一种合适的基准测试技术。

在您从实验中得出任何结论之前,请务必阅读 How do I write a correct micro-benchmark in Java?并遵循其中的建议。

关于java - XOR 字节数组的成本似乎非常低,低于 arraycopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072745/

相关文章:

javascript - 将 html append 到 Bootstrap 模式不起作用

r - [R} 使用 for 循环对元素进行排序时追加的问题

c# - 如何查看通过编译表达式树创建的委托(delegate)的反汇编?

java - 如何将空值作为参数从java传递给python

java - 无法返回数据

java - 如何在 MouseEnter 上为 JLabel 添加下划线

Javascript InfoVis 工具包 : How to specify source/sink for arcs?

Angular 2 引导选项——AOT 与 JIT

java - 在 JSP 页面上访问 JSTL 中的嵌套对象

java - Java中通过对象变量值获取对象