svn commit: r1930929 - subversion/trunk/subversion/tests/libsvn_subr

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <[email protected]>
Author: rinrab
Date: Sun Dec 28 16:25:53 2025
New Revision: 1930929

Log:
Add test to benchmark performance of checksum computation.

* subversion/tests/libsvn_subr/checksum-test.c
  (do_bench_test): New function that runs benchmarking test for a specific
   configuration of checksum algorithm and blocksize.
  (test_checksum_performance): New test.
  (test_funcs): Run new test.

Modified:
   subversion/trunk/subversion/tests/libsvn_subr/checksum-test.c

Modified: subversion/trunk/subversion/tests/libsvn_subr/checksum-test.c
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/checksum-test.c	Sun Dec 28 15:58:07 2025	(r1930928)
+++ subversion/trunk/subversion/tests/libsvn_subr/checksum-test.c	Sun Dec 28 16:25:53 2025	(r1930929)
@@ -364,6 +364,71 @@ test_checksummed_stream_reset(apr_pool_t
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+do_bench_test(apr_size_t blocksize, svn_checksum_kind_t kind, apr_pool_t *pool)
+{
+  svn_checksum_ctx_t *ctx = svn_checksum_ctx_create(kind, pool);
+  svn_checksum_t *checksum;
+  char *buf = apr_palloc(pool, blocksize);
+  apr_time_t start;
+  apr_size_t count = 0;
+  apr_uint32_t seed = 67;
+  apr_size_t i;
+
+  for (i = 0; i < blocksize; i++)
+    buf[i] = (char)svn_test_rand(&seed);
+
+  start = apr_time_now();
+
+  while (apr_time_now() < start + apr_time_from_sec(1))
+    {
+      SVN_ERR(svn_checksum_update(ctx, buf, blocksize));
+      count++;
+    }
+
+  SVN_ERR(svn_checksum_final(&checksum, ctx, pool));
+
+  {
+    apr_size_t bytes_in_gb = 1024 * 1024 * 1024;
+    apr_size_t bytes = count * blocksize;
+
+    /* Calling svn_checksum_serialize() is the simplest way to stringify
+     * checksum kind yet, althrough it also includes extra information such as
+     * the digest itself. */
+    const char *checksum_str = svn_checksum_serialize(checksum, pool, pool);
+
+    fprintf(stderr,
+            "%s: processed %ld blocks of %ld bytes (%.2f GB) in 1 second\n",
+            checksum_str, count, blocksize, (double)bytes / bytes_in_gb);
+  }
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_checksum_performance(apr_pool_t *pool)
+{
+  SVN_ERR(do_bench_test(/* 16 KB */ 16 * (1 << 10),
+                        svn_checksum_sha1, pool));
+  SVN_ERR(do_bench_test(/* 1 MB  */  1 * (1 << 20),
+                        svn_checksum_sha1, pool));
+  SVN_ERR(do_bench_test(/* 64 MB */ 64 * (1 << 20),
+                        svn_checksum_sha1, pool));
+  SVN_ERR(do_bench_test(/* 16 B  */ 16,
+                        svn_checksum_sha1, pool));
+
+  SVN_ERR(do_bench_test(/* 16 KB */ 16 * (1 << 10),
+                        svn_checksum_md5, pool));
+  SVN_ERR(do_bench_test(/* 1 MB  */  1 * (1 << 20),
+                        svn_checksum_md5, pool));
+  SVN_ERR(do_bench_test(/* 64 MB */ 64 * (1 << 20),
+                        svn_checksum_md5, pool));
+  SVN_ERR(do_bench_test(/* 16 B  */ 16,
+                        svn_checksum_md5, pool));
+
+  return SVN_NO_ERROR;
+}
+
 /* An array of all test functions */
 
 static int max_threads = 1;
@@ -389,6 +454,8 @@ static struct svn_test_descriptor_t test
                    "read from checksummed stream"),
     SVN_TEST_PASS2(test_checksummed_stream_reset,
                    "reset checksummed stream"),
+    SVN_TEST_PASS2(test_checksum_performance,
+                   "test checksum performance"),
     SVN_TEST_NULL
   };
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.