static int false_alarms;
static int tag_hits;
static int matches;
-static int data_transfer;
+static int64 data_transfer;
static int total_false_alarms;
static int total_tag_hits;
static int total_matches;
-static int64 total_data_transfer;
+extern struct stats stats;
struct target {
tag t;
rprintf(FINFO,"match at %d last_match=%d j=%d len=%d n=%d\n",
(int)offset,(int)last_match,i,(int)s->sums[i].len,(int)n);
- send_token(f,i,buf,last_match,n,i==-1?0:s->sums[i].len);
+ send_token(f,i,buf,last_match,n,i<0?0:s->sums[i].len);
data_transfer += n;
- if (n > 0)
- write_flush(f);
-
- if (i >= 0)
+ if (i >= 0) {
+ stats.matched_data += s->sums[i].len;
n += s->sums[i].len;
+ }
for (j=0;j<n;j+=CHUNK_SIZE) {
int n1 = MIN(CHUNK_SIZE,n-j);
} else {
--k;
}
-
+
+ /* By matching early we avoid re-reading the
+ data 3 times in the case where a token
+ match comes a long way after last
+ match. The 3 reads are caused by the
+ running match, the checksum update and the
+ literal send. */
+ if (offset-last_match >= CHUNK_SIZE+s->n &&
+ (end-offset > CHUNK_SIZE)) {
+ matched(f,s,buf,offset - s->n, -2);
+ }
} while (++offset < end);
matched(f,s,buf,len,-1);
total_tag_hits += tag_hits;
total_false_alarms += false_alarms;
total_matches += matches;
- total_data_transfer += data_transfer;
+ stats.literal_data += data_transfer;
}
void match_report(void)
return;
rprintf(FINFO,
- "total: matches=%d tag_hits=%d false_alarms=%d data=%ld\n",
+ "total: matches=%d tag_hits=%d false_alarms=%d data=%.0f\n",
total_matches,total_tag_hits,
- total_false_alarms,(long)total_data_transfer);
+ total_false_alarms,
+ (double)stats.literal_data);
}