gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:23:40 30 4
gpt4 key购买 nike

我正在上一门加密课,主要是作为学术练习,我一直在尝试获得尽可能高的速度。我发现了一些奇怪的事情,即异或字节数组的成本非常低,但在相同大小的字节数组上使用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com