git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[RFC/PATCH 3/3] xdiff/xprepare: use a smaller sample size for histogram diff

From
Tay Ray Chuan <rctay89@gmail.com>
Date
Jul 12, 2011, 06:10 UTC
Message-ID
<1310451027-15148-4-git-send-email-rctay89@gmail.com>
In-Reply-To
<1310451027-15148-3-git-send-email-rctay89@gmail.com>

For histogram diff, we can afford a smaller sample size and thus a poorer estimate of the number of lines, as the hash table (rhash) won't be filled up/grown. This is safe as the final count of lines (xdf.nrecs) will be updated correctly anyway by xdl_prepare_ctx().

This gives us a small boost in performance.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
---
 xdiff/xprepare.c |   17 ++++++++++++++---
 xdiff/xutils.c   |    8 ++------
 xdiff/xutils.h   |    2 +-
 3 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/xdiff/xprepare.c b/xdiff/xprepare.c
index 7556538..dfbb0de 100644
--- a/xdiff/xprepare.c
+++ b/xdiff/xprepare.c
@@ -26,6 +26,8 @@
 #define XDL_KPDIS_RUN 4
 #define XDL_MAX_EQLIMIT 1024
 #define XDL_SIMSCAN_WINDOW 100
+#define XDL_GUESS_NLINES1 256
+#define XDL_GUESS_NLINES2 20
 
 
 typedef struct s_xdlclass {
@@ -239,11 +241,20 @@ static void xdl_free_ctx(xdfile_t *xdf) {
 
 int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
 		    xdfenv_t *xe) {
-	long enl1, enl2;
+	long enl1, enl2, sample;
 	xdlclassifier_t cf;
 
-	enl1 = xdl_guess_lines(mf1) + 1;
-	enl2 = xdl_guess_lines(mf2) + 1;
+	/*
+	 * For histogram diff, we can afford a smaller sample size and
+	 * thus a poorer estimate of the number of lines, as the hash
+	 * table (rhash) won't be filled up/grown. The number of lines
+	 * (nrecs) will be updated correctly anyway by
+	 * xdl_prepare_ctx().
+	 */
+	sample = xpp->flags & XDF_HISTOGRAM_DIFF ? XDL_GUESS_NLINES2 : XDL_GUESS_NLINES1;
+
+	enl1 = xdl_guess_lines(mf1, sample) + 1;
+	enl2 = xdl_guess_lines(mf2, sample) + 1;
 
 	if (!(xpp->flags & XDF_HISTOGRAM_DIFF) &&
 		xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0) {
diff --git a/xdiff/xutils.c b/xdiff/xutils.c
index ded7c32..a45e89b 100644
--- a/xdiff/xutils.c
+++ b/xdiff/xutils.c
@@ -24,10 +24,6 @@
 
 
 
-#define XDL_GUESS_NLINES 256
-
-
-
 
 long xdl_bogosqrt(long n) {
 	long i;
@@ -159,12 +155,12 @@ void *xdl_cha_next(chastore_t *cha) {
 }
 
 
-long xdl_guess_lines(mmfile_t *mf) {
+long xdl_guess_lines(mmfile_t *mf, long sample) {
 	long nl = 0, size, tsize = 0;
 	char const *data, *cur, *top;
 
 	if ((cur = data = xdl_mmfile_first(mf, &size)) != NULL) {
-		for (top = data + size; nl < XDL_GUESS_NLINES;) {
+		for (top = data + size; nl < sample;) {
 			if (cur >= top) {
 				tsize += (long) (cur - data);
 				if (!(cur = data = xdl_mmfile_next(mf, &size)))
diff --git a/xdiff/xutils.h b/xdiff/xutils.h
index 674a657..714719a 100644
--- a/xdiff/xutils.h
+++ b/xdiff/xutils.h
@@ -33,7 +33,7 @@ void xdl_cha_free(chastore_t *cha);
 void *xdl_cha_alloc(chastore_t *cha);
 void *xdl_cha_first(chastore_t *cha);
 void *xdl_cha_next(chastore_t *cha);
-long xdl_guess_lines(mmfile_t *mf);
+long xdl_guess_lines(mmfile_t *mf, long sample);
 int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags);
 unsigned long xdl_hash_record(char const **data, char const *top, long flags);
 unsigned int xdl_hashbits(unsigned int size);
-- 
1.7.3.4.681.gb718e
Previous: Tay Ray ChuanNext: Junio C Hamano
Message 4 of 24 in “teach --histogram to diff”
  1. 0/3 teach --histogram to diffTay Ray Chuan, Jul 12, 2011
  2. 1/3 teach --histogram to diffTay Ray Chuan, Jul 12, 2011
  3. 2/3 xdiff/xprepare: skip classificationTay Ray Chuan, Jul 12, 2011
  4. 3/3 xdiff/xprepare: use a smaller sample size for histogram diffTay Ray Chuan, Jul 12, 2011
  5. Junio C HamanoJul 12, 2011
  6. Tay Ray ChuanJul 13, 2011
  7. Shawn PearceJul 12, 2011
  8. Junio C HamanoJul 12, 2011
  9. Tay Ray ChuanJul 13, 2011
  10. Tay Ray ChuanJul 13, 2011
  11. 0/8 teach --histogram to diffTay Ray Chuan, Aug 1, 2011
  12. 1/8 xdiff/xprepare: use memset()Tay Ray Chuan, Aug 1, 2011
  13. 2/8 do away with xdl_mmfile_next()Tay Ray Chuan, Aug 1, 2011
  14. 3/8 xdiff/xprepare: refactor abort cleanupsTay Ray Chuan, Aug 1, 2011
  15. 4/8 xdiff/xpatience: factor out fall-back-diff functionTay Ray Chuan, Aug 1, 2011
  16. 5/8 t4033-diff-patience: factor out testsTay Ray Chuan, Aug 1, 2011
  17. 6/8 teach --histogram to diffTay Ray Chuan, Aug 1, 2011
  18. 7/8 xdiff/xprepare: skip classificationTay Ray Chuan, Aug 1, 2011
  19. 8/8 xdiff/xprepare: use a smaller sample size for histogram diffTay Ray Chuan, Aug 1, 2011
  20. 0/4 changes for rc/histogram-diff in 'next'Tay Ray Chuan, Aug 1, 2011
  21. 1/4 xdiff: do away with xdl_mmfile_next()Tay Ray Chuan, Aug 1, 2011
  22. 2/4 xdiff/xhistogram: rework handling of recursed resultsTay Ray Chuan, Aug 1, 2011
  23. 3/4 xdiff/xhistogram: rely on xdl_trim_ends()Tay Ray Chuan, Aug 1, 2011
  24. 4/4 xdiff/xhistogram: drop need for additional variableTay Ray Chuan, Aug 1, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.