我正在寻找性能高效的方法来比较两个 byte[] 是否相等。大小超过 1 MB,因此每个数组元素的开销应最小化。
我的目标是超越SequenceEqual http://msdn.microsoft.com/en-us/library/bb348567.aspx or a 对每个项目进行手工编码的 for 循环 https://stackoverflow.com/questions/1389570/c-byte-array-comparison-issue, by 避免重复的绑定检查 http://blogs.msdn.com/clrcodegeneration/archive/2009/08/13/array-bounds-check-elimination-in-the-clr.aspx对于两个数组。同样的方式Array.Copy
可能会导致快速memcpy
,什么会导致memcmp
?
您可以使用不安全的代码来执行指针操作。您可以一次将四个字节作为整数进行比较:
public static bool ArrayCompare(byte[] a, byte[] b) {
if (a.Length != b.Length) return false;
int len = a.Length;
unsafe {
fixed(byte* ap = a, bp = b) {
int* aip = (int*)ap, bip = (int*)bp;
for (;len >= 4;len-=4) {
if (*aip != *bip) return false;
aip++;
bip++;
}
byte* ap2 = (byte*)aip, bp2 = (byte*)bip;
for (;len>0;len--) {
if (*ap2 != *bp2) return false;
ap2++;
bp2++;
}
}
}
return true;
}
A 针对一个简单的循环对此进行了测试,速度大约是原来的六倍。
正如 Josh Einstein 所建议的,long 可以在 64 位系统上使用。实际上,在 32 位和 64 位系统上,它的速度几乎是两倍:
public static bool ArrayCompare64(byte[] a, byte[] b) {
if (a.Length != b.Length) return false;
int len = a.Length;
unsafe {
fixed (byte* ap = a, bp = b) {
long* alp = (long*)ap, blp = (long*)bp;
for (; len >= 8; len -= 8) {
if (*alp != *blp) return false;
alp++;
blp++;
}
byte* ap2 = (byte*)alp, bp2 = (byte*)blp;
for (; len > 0; len--) {
if (*ap2 != *bp2) return false;
ap2++;
bp2++;
}
}
}
return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)