Estoy intentando escribir una función para determinar si dos mapas de bits de igual tamaño son idénticos o no. La función que tengo ahora simplemente compara un píxel a la vez en cada mapa de bits, devolviendo falso al primer píxel no equitativo.¿Cuál es la forma más rápida de comparar dos mapas de bits de igual tamaño para determinar si son idénticos?
Si bien esto funciona, y funciona bien para pequeños mapas de bits, en la producción voy a utilizar esto en un circuito cerrado y en imágenes más grandes, así que necesito una mejor manera. ¿Alguien tiene alguna recomendación?
El lenguaje que estoy usando es C# por cierto, y sí, ya estoy usando el método .LockBits. =)
Editar: He codificado las implementaciones de algunas de las sugerencias dadas, y aquí están los puntos de referencia. La configuración: dos mapas de bits idénticos (en el peor de los casos), de 100x100, con 10.000 iteraciones cada uno. Aquí están los resultados:
CompareByInts (Marc Gravell) : 1107ms
CompareByMD5 (Skilldrick) : 4222ms
CompareByMask (GrayWizardX) : 949ms
En CompareByInts y CompareByMask que estoy usando punteros para acceder a la memoria directamente; en el método MD5 estoy usando Marshal.Copy para recuperar una matriz de bytes y pasar eso como un argumento a MD5.ComputeHash. CompareByMask es solo un poco más rápido, pero dado el contexto, creo que cualquier mejora es útil.
Gracias a todos. =)
Editar 2: se olvidó de girar optimizaciones en - haciendo que da la respuesta de GrayWizardX aún más de un impulso:
CompareByInts (Marc Gravell) : 944ms
CompareByMD5 (Skilldrick) : 4275ms
CompareByMask (GrayWizardX) : 630ms
CompareByMemCmp (Erik) : 105ms
interesante que el método MD5 no mejoró en absoluto.
Editar 3: Publicada mi respuesta (MemCmp) que hizo saltar los otros métodos fuera del agua. o.O
Tener ¿Has probado esto con los mapas de bits de "tamaño completo" que vas a ejecutar en producción? ¿Ha demostrado ser lento? ¿Ha perfilado su código en sus mapas de bits de producción para determinar dónde se está desacelerando? –
Sí, el problema es que el peor de los casos: escanear ambos mapas de bits y determinar que son idénticos, también es el caso más común. –
Define "idéntico" en el contexto de bitmaps. ¿Quiere decir, binario idéntico, basado en archivos (ambos son archivos .png, y los contenidos son idénticos)? ¿Te refieres a píxeles idénticos (podrían ser formatos de archivo diferentes, pero los píxeles son los mismos)? ¿Quiere decir perceptualmente idénticos (los canales rojos ligeramente diferentes están bien ya que los ojos de los humanos no son tan buenos para discernir las diferencias en el canal rojo de todos modos? –