De esta manera parece ser ligeramente más rápido que el método de la pregunta original:
private static byte[] _temp = new byte[0];
public static void Swap(byte[] data)
{
if (data.Length > _temp.Length)
{
_temp = new byte[data.Length];
}
Buffer.BlockCopy(data, 1, _temp, 0, data.Length - 1);
for (int i = 0; i < data.Length; i += 2)
{
_temp[i + 1] = data[i];
}
Buffer.BlockCopy(_temp, 0, data, 0, data.Length);
}
Mi evaluación comparativa supone que el método es llamado en varias ocasiones, por lo que el cambio de tamaño de la matriz no es _temp
un factor. Este método se basa en el hecho de que la mitad del intercambio de bytes se puede hacer con la llamada inicial Buffer.BlockCopy(...)
(con la posición de origen compensada por 1).
Por favor comparen esto, en caso de que haya perdido completamente la razón. En mis pruebas, este método toma aproximadamente el 70% del tiempo que el método original (que modifiqué para declarar el byte b
fuera del ciclo).
Su solución parece una muy buena, excepto que SI SUS DATOS TIENEN LÍNEAS EXTRAORDINARIAS, su código arrojará una matriz fuera de la excepción encuadernada. – NawaMan
Si está intercambiando palabras de 16 bits, entonces sus datos nunca tendrán una longitud impar. –
Sí, este será un método privado y se garantizará que tenga palabras de 16 bits. – initialZero