aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Johannes Schindelin <johannes.schindelin@gmx.de> 2021-11-02 15:46:05 +0000
committerGravatar Junio C Hamano <gitster@pobox.com> 2021-11-03 11:22:26 -0700
commitdf7000cd910a5f6991f73991b87d838a5d75e2fc (patch)
treec86f0b59fd5f40fdbb7fdecf80ce4058b6cf9767
parentcbc985a1f403a09dd22511aca3e6699d3f3c1c7c (diff)
downloadgit-df7000cd910a5f6991f73991b87d838a5d75e2fc.tar.gz
git-df7000cd910a5f6991f73991b87d838a5d75e2fc.zip
test-tool genzeros: generate large amounts of data more efficiently
In this developer's tests, producing one gigabyte worth of NULs in a busy loop that writes out individual bytes, unbuffered, took ~27sec. Writing chunked 256kB buffers instead only took ~0.6sec This matters because we are about to introduce a pair of test cases that want to be able to produce 5GB of NULs, and we cannot use `/dev/zero` because of the HP NonStop platform's lack of support for that device. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--t/helper/test-genzeros.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/t/helper/test-genzeros.c b/t/helper/test-genzeros.c
index b1197e91a8..8ca988d621 100644
--- a/t/helper/test-genzeros.c
+++ b/t/helper/test-genzeros.c
@@ -3,7 +3,10 @@
int cmd__genzeros(int argc, const char **argv)
{
+ /* static, so that it is NUL-initialized */
+ static const char zeros[256 * 1024];
intmax_t count;
+ ssize_t n;
if (argc > 2) {
fprintf(stderr, "usage: %s [<count>]\n", argv[0]);
@@ -12,9 +15,19 @@ int cmd__genzeros(int argc, const char **argv)
count = argc > 1 ? strtoimax(argv[1], NULL, 0) : -1;
- while (count < 0 || count--) {
- if (putchar(0) == EOF)
+ /* Writing out individual NUL bytes is slow... */
+ while (count < 0)
+ if (write(1, zeros, ARRAY_SIZE(zeros)) < 0)
return -1;
+
+ while (count > 0) {
+ n = write(1, zeros, count < ARRAY_SIZE(zeros) ?
+ count : ARRAY_SIZE(zeros));
+
+ if (n < 0)
+ return -1;
+
+ count -= n;
}
return 0;