]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cut: optimize per character memcpy
authorPádraig Brady <P@draigBrady.com>
Wed, 25 Mar 2026 19:11:35 +0000 (19:11 +0000)
committerPádraig Brady <P@draigBrady.com>
Sun, 5 Apr 2026 12:15:56 +0000 (13:15 +0100)
$ time src/cut-before -f10 -w ll.in >/dev/null
real 0m4.309s

$ time src/cut-after -f10 -w ll.in >/dev/null
real 0m3.136s

* src/cut.c (cut_bytes): Add a new helper that avoids
the memcpy call in the common case of adding characters to a buffer.

src/cut.c

index cb45be360f0e4e696ea1f9d7429f2eac12a76f27..6e81c80dd396642bac71396b9f1f2b7c81b4d592 100644 (file)
--- a/src/cut.c
+++ b/src/cut.c
@@ -430,6 +430,19 @@ write_bytes (char const *buf, size_t n_bytes)
     write_error ();
 }
 
+static inline void
+copy_bytes (char *dst, char const *src, size_t n_bytes)
+{
+  if (n_bytes <= SMALL_BYTE_THRESHOLD)
+    {
+      for (size_t i = 0; i < n_bytes; i++)
+        dst[i] = src[i];
+      return;
+    }
+
+  memcpy (dst, src, n_bytes);
+}
+
 static inline void
 write_line_delim (void)
 {
@@ -476,7 +489,7 @@ append_field_1_chunk (char const *buf, idx_t len, idx_t *n_bytes)
                                 len, -1, sizeof *field_1_buffer);
     }
 
-  memcpy (field_1_buffer + *n_bytes, buf, len);
+  copy_bytes (field_1_buffer + *n_bytes, buf, len);
   *n_bytes += len;
 }
 
@@ -1348,7 +1361,7 @@ main (int argc, char **argv)
               mcel_t g = mcel_scanz (optarg);
               if (optarg[g.len] != '\0')
                 FATAL_ERROR (_("the delimiter must be a single character"));
-              memcpy (delim_bytes, optarg, g.len);
+              copy_bytes (delim_bytes, optarg, g.len);
               delim_length = g.len;
               delim_mcel = g;
               if (g.len == 1)
@@ -1443,7 +1456,7 @@ main (int argc, char **argv)
         }
       else
         {
-          memcpy (output_delimiter_default, delim_bytes, delim_length);
+          copy_bytes (output_delimiter_default, delim_bytes, delim_length);
           output_delimiter_length = delim_length;
         }
     }