[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug-patch] [PATCH] Less memory usage on long lines in plan b.
From: |
Tobias Stoeckmann |
Subject: |
[bug-patch] [PATCH] Less memory usage on long lines in plan b. |
Date: |
Sun, 30 Nov 2014 17:42:28 +0100 |
Do not waste memory when maxlen is larger than minimum buffer size.
The variable lines_per_buf would always be 1, so avoid writing unnecessary
garbage into buffer file (also less memory usage).
You can test different values for maxlen with this short example program:
=====
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#define TIBUFSIZE_MINIMUM (8 * 1024)
int
main(int argc, char *argv[])
{
long long int maxlen;
long long int tibufsize;
long long int lines_per_buf;
if (argc != 2) {
fputs("usage: example maxlen\n", stderr);
return 1;
}
maxlen = strtol(argv[1], NULL, 10);
for (tibufsize = TIBUFSIZE_MINIMUM; tibufsize < maxlen; tibufsize <<= 1)
/* do nothing */ ;
lines_per_buf = tibufsize / maxlen;
printf("maxlen = %lld\ntibufsize = %lld\nlines_per_buf = %lld\n",
maxlen, tibufsize, lines_per_buf);
return 0;
}
=====
If we have less than TIBUFSIZE_MINIMUM, we get that and lines_per_buf is
set accordingly:
$ ./example 1
maxlen = 1
tibufsize = 8192
lines_per_buf = 8192
Still true if maxlen is exactly TIBUFSIZE_MINIMUM:
$ ./example 8192
maxlen = 8192
tibufsize = 8192
lines_per_buf = 1
If it's a bit larger, tibufsize gets multiplied by 2. Therefore, it can
hold the max line only once. A lot of memory is wasted.
$ ./example 8193
maxlen = 8193
tibufsize = 16384
lines_per_buf = 1
And this will go on and on and on...
$ ./example 16385
maxlen = 16385
tibufsize = 32768
lines_per_buf = 1
Tobias
---
src/inp.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/inp.c b/src/inp.c
index a7ad070..ba7571a 100644
--- a/src/inp.c
+++ b/src/inp.c
@@ -403,8 +403,7 @@ plan_b (char const *filename)
if (revision)
report_revision (found_revision);
Fseek (ifp, 0, SEEK_SET); /* rewind file */
- for (tibufsize = TIBUFSIZE_MINIMUM; tibufsize < maxlen; tibufsize <<= 1)
- /* do nothing */ ;
+ tibufsize = TIBUFSIZE_MINIMUM < maxlen ? maxlen : TIBUFSIZE_MINIMUM;
lines_per_buf = tibufsize / maxlen;
tireclen = maxlen;
tibuf[0] = xmalloc (2 * tibufsize);
--
2.1.1
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [bug-patch] [PATCH] Less memory usage on long lines in plan b.,
Tobias Stoeckmann <=