Fossil SCM
Performance optimization on the delta generator.
Commit
2dd25909dab7e1d1f04d9f25672e3e7d519d8b04
Parent
063779a14cb7c4a…
1 file changed
+21
-5
+21
-5
| --- src/delta.c | ||
| +++ src/delta.c | ||
| @@ -105,13 +105,13 @@ | ||
| 105 | 105 | static void hash_init(hash *pHash, const char *z){ |
| 106 | 106 | u16 a, b, i; |
| 107 | 107 | a = b = 0; |
| 108 | 108 | for(i=0; i<NHASH; i++){ |
| 109 | 109 | a += z[i]; |
| 110 | - b += (NHASH-i)*z[i]; | |
| 111 | - pHash->z[i] = z[i]; | |
| 110 | + b += a; | |
| 112 | 111 | } |
| 112 | + memcpy(pHash->z, z, NHASH); | |
| 113 | 113 | pHash->a = a & 0xffff; |
| 114 | 114 | pHash->b = b & 0xffff; |
| 115 | 115 | pHash->i = 0; |
| 116 | 116 | } |
| 117 | 117 | |
| @@ -130,10 +130,28 @@ | ||
| 130 | 130 | ** Return a 32-bit hash value |
| 131 | 131 | */ |
| 132 | 132 | static u32 hash_32bit(hash *pHash){ |
| 133 | 133 | return (pHash->a & 0xffff) | (((u32)(pHash->b & 0xffff))<<16); |
| 134 | 134 | } |
| 135 | + | |
| 136 | +/* | |
| 137 | +** Compute a hash on NHASH bytes. | |
| 138 | +** | |
| 139 | +** This routine is intended to be equivalent to: | |
| 140 | +** hash h; | |
| 141 | +** hash_init(&h, zInput); | |
| 142 | +** return hash_32bit(&h); | |
| 143 | +*/ | |
| 144 | +static u32 hash_once(const char *z){ | |
| 145 | + u16 a, b, i; | |
| 146 | + a = b = 0; | |
| 147 | + for(i=0; i<NHASH; i++){ | |
| 148 | + a += z[i]; | |
| 149 | + b += a; | |
| 150 | + } | |
| 151 | + return a | (((u32)b)<<16); | |
| 152 | +} | |
| 135 | 153 | |
| 136 | 154 | /* |
| 137 | 155 | ** Write an base-64 integer into the given buffer. |
| 138 | 156 | */ |
| 139 | 157 | static void putInt(unsigned int v, char **pz){ |
| @@ -330,13 +348,11 @@ | ||
| 330 | 348 | collide = fossil_malloc( nHash*2*sizeof(int) ); |
| 331 | 349 | landmark = &collide[nHash]; |
| 332 | 350 | memset(landmark, -1, nHash*sizeof(int)); |
| 333 | 351 | memset(collide, -1, nHash*sizeof(int)); |
| 334 | 352 | for(i=0; i<lenSrc-NHASH; i+=NHASH){ |
| 335 | - int hv; | |
| 336 | - hash_init(&h, &zSrc[i]); | |
| 337 | - hv = hash_32bit(&h) % nHash; | |
| 353 | + int hv = hash_once(&zSrc[i]) % nHash; | |
| 338 | 354 | collide[i/NHASH] = landmark[hv]; |
| 339 | 355 | landmark[hv] = i/NHASH; |
| 340 | 356 | } |
| 341 | 357 | |
| 342 | 358 | /* Begin scanning the target file and generating copy commands and |
| 343 | 359 |
| --- src/delta.c | |
| +++ src/delta.c | |
| @@ -105,13 +105,13 @@ | |
| 105 | static void hash_init(hash *pHash, const char *z){ |
| 106 | u16 a, b, i; |
| 107 | a = b = 0; |
| 108 | for(i=0; i<NHASH; i++){ |
| 109 | a += z[i]; |
| 110 | b += (NHASH-i)*z[i]; |
| 111 | pHash->z[i] = z[i]; |
| 112 | } |
| 113 | pHash->a = a & 0xffff; |
| 114 | pHash->b = b & 0xffff; |
| 115 | pHash->i = 0; |
| 116 | } |
| 117 | |
| @@ -130,10 +130,28 @@ | |
| 130 | ** Return a 32-bit hash value |
| 131 | */ |
| 132 | static u32 hash_32bit(hash *pHash){ |
| 133 | return (pHash->a & 0xffff) | (((u32)(pHash->b & 0xffff))<<16); |
| 134 | } |
| 135 | |
| 136 | /* |
| 137 | ** Write an base-64 integer into the given buffer. |
| 138 | */ |
| 139 | static void putInt(unsigned int v, char **pz){ |
| @@ -330,13 +348,11 @@ | |
| 330 | collide = fossil_malloc( nHash*2*sizeof(int) ); |
| 331 | landmark = &collide[nHash]; |
| 332 | memset(landmark, -1, nHash*sizeof(int)); |
| 333 | memset(collide, -1, nHash*sizeof(int)); |
| 334 | for(i=0; i<lenSrc-NHASH; i+=NHASH){ |
| 335 | int hv; |
| 336 | hash_init(&h, &zSrc[i]); |
| 337 | hv = hash_32bit(&h) % nHash; |
| 338 | collide[i/NHASH] = landmark[hv]; |
| 339 | landmark[hv] = i/NHASH; |
| 340 | } |
| 341 | |
| 342 | /* Begin scanning the target file and generating copy commands and |
| 343 |
| --- src/delta.c | |
| +++ src/delta.c | |
| @@ -105,13 +105,13 @@ | |
| 105 | static void hash_init(hash *pHash, const char *z){ |
| 106 | u16 a, b, i; |
| 107 | a = b = 0; |
| 108 | for(i=0; i<NHASH; i++){ |
| 109 | a += z[i]; |
| 110 | b += a; |
| 111 | } |
| 112 | memcpy(pHash->z, z, NHASH); |
| 113 | pHash->a = a & 0xffff; |
| 114 | pHash->b = b & 0xffff; |
| 115 | pHash->i = 0; |
| 116 | } |
| 117 | |
| @@ -130,10 +130,28 @@ | |
| 130 | ** Return a 32-bit hash value |
| 131 | */ |
| 132 | static u32 hash_32bit(hash *pHash){ |
| 133 | return (pHash->a & 0xffff) | (((u32)(pHash->b & 0xffff))<<16); |
| 134 | } |
| 135 | |
| 136 | /* |
| 137 | ** Compute a hash on NHASH bytes. |
| 138 | ** |
| 139 | ** This routine is intended to be equivalent to: |
| 140 | ** hash h; |
| 141 | ** hash_init(&h, zInput); |
| 142 | ** return hash_32bit(&h); |
| 143 | */ |
| 144 | static u32 hash_once(const char *z){ |
| 145 | u16 a, b, i; |
| 146 | a = b = 0; |
| 147 | for(i=0; i<NHASH; i++){ |
| 148 | a += z[i]; |
| 149 | b += a; |
| 150 | } |
| 151 | return a | (((u32)b)<<16); |
| 152 | } |
| 153 | |
| 154 | /* |
| 155 | ** Write an base-64 integer into the given buffer. |
| 156 | */ |
| 157 | static void putInt(unsigned int v, char **pz){ |
| @@ -330,13 +348,11 @@ | |
| 348 | collide = fossil_malloc( nHash*2*sizeof(int) ); |
| 349 | landmark = &collide[nHash]; |
| 350 | memset(landmark, -1, nHash*sizeof(int)); |
| 351 | memset(collide, -1, nHash*sizeof(int)); |
| 352 | for(i=0; i<lenSrc-NHASH; i+=NHASH){ |
| 353 | int hv = hash_once(&zSrc[i]) % nHash; |
| 354 | collide[i/NHASH] = landmark[hv]; |
| 355 | landmark[hv] = i/NHASH; |
| 356 | } |
| 357 | |
| 358 | /* Begin scanning the target file and generating copy commands and |
| 359 |