Puede usar un código no seguro para realizar operaciones de puntero. Puede comparar los bytes cuatro a la vez como enteros:
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;
}
Un probado esto en contra de un bucle simple, y es aproximadamente seis veces más rápido.
Según lo sugerido por Josh Einstein, long podría usarse en un sistema de 64 bits. En realidad, parece ser casi dos veces más rápido tanto en 32 y 64 bits sistemas:
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;
}
¿Necesita comparar dos bloques solamente, o un bloque contra varios? Quizás si nos contara más sobre el escenario en el que está haciendo esto, se podrían encontrar soluciones aún mejores. Por ejemplo, si necesita comparar una secuencia de bloques con muchos otros bloques, un hash simple al menos le daría muchas diferencias garantizadas con un trabajo mínimo, y luego podría centrarse en los posibles falsos positivos. –