From 74e439baeebe4ea17de729bb5cb8a9e815949e7e Mon Sep 17 00:00:00 2001 From: lizhihong Date: Wed, 21 May 2025 19:21:50 +0800 Subject: [PATCH] Optimize checksum compute Signed-off-by: lizhihong --- patch/0007-Optimize-checksum-compute.patch | 118 ++++++++++++++++++ ...on.patch => 0008-BugFix-CurrVersion.patch} | 0 2 files changed, 118 insertions(+) create mode 100644 patch/0007-Optimize-checksum-compute.patch rename patch/{0007-BugFix-CurrVersion.patch => 0008-BugFix-CurrVersion.patch} (100%) diff --git a/patch/0007-Optimize-checksum-compute.patch b/patch/0007-Optimize-checksum-compute.patch new file mode 100644 index 0000000..5859d52 --- /dev/null +++ b/patch/0007-Optimize-checksum-compute.patch @@ -0,0 +1,118 @@ +From 495dc4bf6cfb38379214023cad93c138d9753432 Mon Sep 17 00:00:00 2001 +From: lizhihong +Date: Wed, 21 May 2025 19:16:28 +0800 +Subject: [PATCH] Optimize checksum compute + +Signed-off-by: lizhihong +--- + ext/misc/cksumvfs.c | 80 ++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 76 insertions(+), 4 deletions(-) + +diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c +index 6f4c55c..51cd006 100644 +--- a/ext/misc/cksumvfs.c ++++ b/ext/misc/cksumvfs.c +@@ -193,6 +193,7 @@ typedef struct CksmFile CksmFile; + typedef unsigned char u8; + typedef unsigned int u32; + #endif ++typedef sqlite3_uint64 u64; + + /* Access to a lower-level VFS that (might) implement dynamic loading, + ** access to randomness, etc. +@@ -307,6 +308,79 @@ static const sqlite3_io_methods cksm_io_methods = { + + (((x)&0x00FF0000)>>8) + (((x)&0xFF000000)>>24) \ + ) + ++uint64_t cksmComputeDeepFastLE(void *src, int srcLen){ ++ u32 s1 = 0, s2 = 0; ++ u32 s3 = 0, s4 = 0; ++ u32 s5 = 0, s6 = 0; ++ u32 s7 = 0, s8 = 0; ++ u32 *aData = (u32*)src; ++ u32 *aEnd = aData + srcLen/4; ++ u64 aOut; ++ u8 *u8p_aOut = (u8*)&aOut; ++ while( aData + 32 <= aEnd ){ ++ s1 += *aData++ + s2; ++ s2 += *aData++ + s1; ++ s1 += *aData++ + s2; ++ s2 += *aData++ + s1; ++ s1 += *aData++ + s2; ++ s2 += *aData++ + s1; ++ s1 += *aData++ + s2; ++ s2 += *aData++ + s1; ++ ++ s3 += *aData++ + s4; ++ s4 += *aData++ + s3; ++ s3 += *aData++ + s4; ++ s4 += *aData++ + s3; ++ s3 += *aData++ + s4; ++ s4 += *aData++ + s3; ++ s3 += *aData++ + s4; ++ s4 += *aData++ + s3; ++ ++ s5 += *aData++ + s6; ++ s6 += *aData++ + s5; ++ s5 += *aData++ + s6; ++ s6 += *aData++ + s5; ++ s5 += *aData++ + s6; ++ s6 += *aData++ + s5; ++ s5 += *aData++ + s6; ++ s6 += *aData++ + s5; ++ ++ s7 += *aData++ + s8; ++ s8 += *aData++ + s7; ++ s7 += *aData++ + s8; ++ s8 += *aData++ + s7; ++ s7 += *aData++ + s8; ++ s8 += *aData++ + s7; ++ s7 += *aData++ + s8; ++ s8 += *aData++ + s7; ++ ++ s3 += 13*s1 + 21*s2; ++ s4 += 21*s1 + 34*s2; ++ ++ s5 += 13*s3 + 21*s4; ++ s6 += 21*s3 + 34*s4; ++ ++ s7 += 13*s5 + 21*s6; ++ s8 += 21*s5 + 34*s6; ++ ++ s1 = s7; ++ s2 = s8; ++ s3 = 0; ++ s4 = 0; ++ s5 = 0; ++ s6 = 0; ++ s7 = 0; ++ s8 = 0; ++ } ++ while( aData < aEnd ){ ++ s1 = *aData++ + s1 + s2; ++ s2 = *aData++ + s1 + s2; ++ } ++ memcpy(u8p_aOut, &s1, 4); ++ memcpy(u8p_aOut + 4, &s2, 4); ++ return aOut; ++} ++ + /* Compute a checksum on a buffer */ + static void cksmCompute( + u8 *a, /* Content to be checksummed */ +@@ -324,10 +398,8 @@ static void cksmCompute( + + if( 1 == *(u8*)&x ){ + /* Little-endian */ +- do { +- s1 += *aData++ + s2; +- s2 += *aData++ + s1; +- }while( aData