]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Add DNA data type to benchmark data generators
authorNathan Moinvaziri <nathan@nathanm.com>
Sat, 27 Jun 2026 20:29:47 +0000 (13:29 -0700)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Wed, 15 Jul 2026 10:53:24 +0000 (12:53 +0200)
Add a 4-symbol (DNA base) alphabet generator. With only four symbols
nearly every 3-byte prefix collides, producing very long hash chains
while matches stay short, which stresses the longest_match short-match
path that the existing generators do not isolate. Register it for the
deflate and inflate benchmark variants.

Assisted-By: Claude Opus 4.8 <noreply@anthropic.com>
test/benchmarks/benchmark_deflate.cc
test/benchmarks/benchmark_inflate.cc
test/test_data_p.h

index ead6b07647f67814ffaa8063e9230598bf1314bf..408ed101fcbdee6f5f43a67fc34ddf28269839ac 100644 (file)
@@ -133,6 +133,7 @@ public:
 #define DEFLATE_ALL_DATA(variant, wbits, strategy, args_macro) \
     DEFLATE_VARIANT(variant, text,          wbits, strategy, TEST_DATA_TEXT,          args_macro); \
     DEFLATE_VARIANT(variant, short_match,   wbits, strategy, TEST_DATA_SHORT_MATCH,   args_macro); \
+    DEFLATE_VARIANT(variant, dna,           wbits, strategy, TEST_DATA_DNA,           args_macro); \
     DEFLATE_VARIANT(variant, random,        wbits, strategy, TEST_DATA_RANDOM,        args_macro); \
     DEFLATE_VARIANT(variant, realistic_rgb, wbits, strategy, TEST_DATA_REALISTIC_RGB, args_macro); \
     DEFLATE_VARIANT(variant, striped_rgb,   wbits, strategy, TEST_DATA_STRIPED_RGB,   args_macro)
index e254e507f70ab7b4199f2d3c24ffa6a191d8f179..98bc394a10db195e4b1e15b6b12749f9ff180b23 100644 (file)
@@ -165,6 +165,7 @@ public:
 
 INFLATE_VARIANT(text,           TEST_DATA_TEXT);
 INFLATE_VARIANT(short_match,    TEST_DATA_SHORT_MATCH);
+INFLATE_VARIANT(dna,            TEST_DATA_DNA);
 INFLATE_VARIANT(random,         TEST_DATA_RANDOM);
 INFLATE_VARIANT(realistic_rgb,  TEST_DATA_REALISTIC_RGB);
 INFLATE_VARIANT(striped_rgb,    TEST_DATA_STRIPED_RGB);
index f63e3139f0bf5fc88e77326d77bb2cf0f42e268a..17691c5a4108314dec1309f98a47f61f7981f90f 100644 (file)
@@ -131,6 +131,22 @@ static inline uint8_t *gen_short_match_data(size_t bufsize) {
     return buf;
 }
 
+/* Random bytes over a 4-symbol (DNA base) alphabet. Nearly every 3-byte prefix
+   collides, so hash chains grow very long while matches stay short. Stresses the
+   longest_match short-match path with deep chain walks. */
+static inline uint8_t *gen_dna_data(size_t bufsize) {
+    static const uint8_t bases[4] = { 'A', 'C', 'G', 'T' };
+    uint8_t *buf = (uint8_t *)malloc(bufsize);
+    if (buf == NULL)
+        return NULL;
+    uint32_t rng = 0x01234567;
+    for (size_t i = 0; i < bufsize; i++) {
+        rng = rng * 1103515245u + 12345u;
+        buf[i] = bases[(rng >> 24) & 3];
+    }
+    return buf;
+}
+
 static inline uint8_t clamp_uint8_t(int v) {
     return (uint8_t)(v < 0 ? 0 : (v > 0xFF ? 0xFF : v));
 }
@@ -218,6 +234,7 @@ static inline uint8_t *gen_striped_rgb_data(size_t bufsize) {
 enum test_data_type {
     TEST_DATA_TEXT = 0,         /* mixed literals + short/medium matches */
     TEST_DATA_SHORT_MATCH,      /* many short back-references */
+    TEST_DATA_DNA,              /* 4-symbol alphabet, dense chains + short matches */
     TEST_DATA_RANDOM,           /* incompressible, deflate uses stored blocks */
     TEST_DATA_REALISTIC_RGB,    /* RGB photo, short matches at dist=3 */
     TEST_DATA_STRIPED_RGB,      /* solid R/G/B stripes, long dist=3 matches */
@@ -227,6 +244,7 @@ static inline uint8_t *gen_test_data(enum test_data_type data_type, size_t bufsi
     switch (data_type) {
         case TEST_DATA_TEXT:           return gen_text_data(bufsize);
         case TEST_DATA_SHORT_MATCH:    return gen_short_match_data(bufsize);
+        case TEST_DATA_DNA:            return gen_dna_data(bufsize);
         case TEST_DATA_RANDOM:         return gen_random_data(bufsize);
         case TEST_DATA_REALISTIC_RGB:  return gen_realistic_rgb_data(bufsize);
         case TEST_DATA_STRIPED_RGB:    return gen_striped_rgb_data(bufsize);