Fossil SCM

Performance optimization on the delta generator.

drh 2015-12-25 14:46 trunk
Commit 2dd25909dab7e1d1f04d9f25672e3e7d519d8b04
1 file changed +21 -5
+21 -5
--- src/delta.c
+++ src/delta.c
@@ -105,13 +105,13 @@
105105
static void hash_init(hash *pHash, const char *z){
106106
u16 a, b, i;
107107
a = b = 0;
108108
for(i=0; i<NHASH; i++){
109109
a += z[i];
110
- b += (NHASH-i)*z[i];
111
- pHash->z[i] = z[i];
110
+ b += a;
112111
}
112
+ memcpy(pHash->z, z, NHASH);
113113
pHash->a = a & 0xffff;
114114
pHash->b = b & 0xffff;
115115
pHash->i = 0;
116116
}
117117
@@ -130,10 +130,28 @@
130130
** Return a 32-bit hash value
131131
*/
132132
static u32 hash_32bit(hash *pHash){
133133
return (pHash->a & 0xffff) | (((u32)(pHash->b & 0xffff))<<16);
134134
}
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
+}
135153
136154
/*
137155
** Write an base-64 integer into the given buffer.
138156
*/
139157
static void putInt(unsigned int v, char **pz){
@@ -330,13 +348,11 @@
330348
collide = fossil_malloc( nHash*2*sizeof(int) );
331349
landmark = &collide[nHash];
332350
memset(landmark, -1, nHash*sizeof(int));
333351
memset(collide, -1, nHash*sizeof(int));
334352
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;
338354
collide[i/NHASH] = landmark[hv];
339355
landmark[hv] = i/NHASH;
340356
}
341357
342358
/* Begin scanning the target file and generating copy commands and
343359
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button