forked from Imagelibrary/littlefs
scripts: Adopted crc32c lib when available
Jumping from a simple Python implementation to the fully hardware accelerated crc32c library basically deletes any crc32c related bottlenecks: crc32c.py disk (1MiB) w/ crc32c lib: 0m0.027s crc32c.py disk (1MiB) w/o crc32c lib: 0m0.844s This uses the same try-import trick we use for inotify_simple, so we get the speed improvement without losing portability. --- In dbgbmap.py: dbgbmap.py w/ crc32c lib: 0m0.273s dbgbmap.py w/o crc32c lib: 0m0.697s dbgbmap.py w/ crc32c lib --no-ckdata: 0m0.269s dbgbmap.py w/o crc32c lib --no-ckdata: 0m0.490s dbgbmap.old.py: 0m0.231s The bulk of the runtime is still in Rbyd.fetch, but this is now dominated by leb128 decoding, which makes sense. We do ~twice as many fetches in the new dbgbmap.py in order to calculate the gcksum (which we then ignore...).
This commit is contained in:
@@ -7,6 +7,11 @@ if __name__ == "__main__":
|
||||
import itertools as it
|
||||
import os
|
||||
|
||||
try:
|
||||
import crc32c as crc32c_lib
|
||||
except ModuleNotFoundError:
|
||||
crc32c_lib = None
|
||||
|
||||
|
||||
# some ways of block geometry representations
|
||||
# 512 -> 512
|
||||
@@ -79,12 +84,15 @@ def xxd(data, width=16):
|
||||
for b in map(chr, data[i:i+width])))
|
||||
|
||||
def crc32c(data, crc=0):
|
||||
crc ^= 0xffffffff
|
||||
for b in data:
|
||||
crc ^= b
|
||||
for j in range(8):
|
||||
crc = (crc >> 1) ^ ((crc & 1) * 0x82f63b78)
|
||||
return 0xffffffff ^ crc
|
||||
if crc32c_lib is not None:
|
||||
return crc32c_lib.crc32c(data, crc)
|
||||
else:
|
||||
crc ^= 0xffffffff
|
||||
for b in data:
|
||||
crc ^= b
|
||||
for j in range(8):
|
||||
crc = (crc >> 1) ^ ((crc & 1) * 0x82f63b78)
|
||||
return 0xffffffff ^ crc
|
||||
|
||||
def main(disk, blocks=None, *,
|
||||
block_size=None,
|
||||
|
||||
Reference in New Issue
Block a user