Module Name: src
Committed By: simonb
Date: Sun Jan 12 06:38:21 UTC 2025
Modified Files:
src/usr.bin/cmp: regular.c
Log Message:
Make cmp -s and cmp -l much faster by comparing blocks and skipping any
line number calculations not needed. Approx 3-4x faster for two multi-GB
in-cache files on my Zen 3.
Restores the spirit of a NetII optimisation lost with 4.4lite2 import
in 1995.
To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/usr.bin/cmp/regular.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/cmp/regular.c
diff -u src/usr.bin/cmp/regular.c:1.25 src/usr.bin/cmp/regular.c:1.26
--- src/usr.bin/cmp/regular.c:1.25 Sat Jan 9 15:16:28 2021
+++ src/usr.bin/cmp/regular.c Sun Jan 12 06:38:21 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: regular.c,v 1.25 2021/01/09 15:16:28 christos Exp $ */
+/* $NetBSD: regular.c,v 1.26 2025/01/12 06:38:21 simonb Exp $ */
/*-
* Copyright (c) 1991, 1993, 1994
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)regular.c 8.3 (Berkeley) 4/2/94";
#else
-__RCSID("$NetBSD: regular.c,v 1.25 2021/01/09 15:16:28 christos Exp $");
+__RCSID("$NetBSD: regular.c,v 1.26 2025/01/12 06:38:21 simonb Exp $");
#endif
#endif /* not lint */
@@ -47,6 +47,7 @@ __RCSID("$NetBSD: regular.c,v 1.25 2021/
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
+#include <string.h>
#include "extern.h"
@@ -88,18 +89,30 @@ c_regular(int fd1, const char *file1, of
}
blk_cnt = blk_sz;
- for (; blk_cnt--; ++p1, ++p2, ++byte) {
- if ((ch = *p1) != *p2) {
- if (!lflag) {
- diffmsg(file1, file2, byte, line);
- /* NOTREACHED */
+ if ((lflag || sflag) && (memcmp(p1, p2, blk_sz) == 0)) {
+ /*
+ * If the two blocks are the same and we are
+ * using the -l or -s flags, we don't need to
+ * count lines. There is nothing else to do
+ * except advance the pointers for munmap()
+ * below.
+ */
+ p1 += blk_sz;
+ p2 += blk_sz;
+ } else {
+ for (; blk_cnt--; ++p1, ++p2, ++byte) {
+ if ((ch = *p1) != *p2) {
+ if (!lflag) {
+ diffmsg(file1, file2, byte, line);
+ /* NOTREACHED */
+ }
+ dfound = 1;
+ (void)printf("%6lld %3o %3o\n",
+ (long long)byte, ch, *p2);
}
- dfound = 1;
- (void)printf("%6lld %3o %3o\n",
- (long long)byte, ch, *p2);
+ if (ch == '\n')
+ ++line;
}
- if (ch == '\n')
- ++line;
}
munmap(p1 - blk_sz, blk_sz);
munmap(p2 - blk_sz, blk_sz);