util: use faster zlib's CRC32 implementaion
zlib provides a faster slice-by-4 CRC32 implementation than the traditional single byte lookup one used by mesa. As most supported platforms now link zlib unconditionally, we can easily use it. Improvement for a 1MB buffer (avg MB/s, n=100, zlib 1.2.8): i5-6600K C2D E4500 mesa zlib mesa zlib 443 1443 225% +/- 2.1% 403 1175 191% +/- 0.9% It has been verified the calculation results stay the same after this change. Signed-off-by: Grazvydas Ignotas <notasas@gmail.com> Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -33,6 +33,9 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_ZLIB
|
||||
#include <zlib.h>
|
||||
#endif
|
||||
#include "crc32.h"
|
||||
|
||||
|
||||
@@ -114,6 +117,16 @@ util_hash_crc32(const void *data, size_t size)
|
||||
const uint8_t *p = data;
|
||||
uint32_t crc = 0xffffffff;
|
||||
|
||||
#ifdef HAVE_ZLIB
|
||||
/* Prefer zlib's implementation for better performance.
|
||||
* zlib's uInt is always "unsigned int" while size_t can be 64bit.
|
||||
* Since 1.2.9 there's crc32_z that takes size_t, but use the more
|
||||
* available function to avoid build system complications.
|
||||
*/
|
||||
if ((uInt)size == size)
|
||||
return ~crc32(0, data, size);
|
||||
#endif
|
||||
|
||||
while (size--)
|
||||
crc = util_crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
|
||||
|
||||
|
Reference in New Issue
Block a user