carl-daniel wrote:
Reduce realloc syscall overhead for FT2232 and bitbang.
FT2232 ran realloc() for every executed command. Start with a big enough buffer and don't touch buffer size unless it needs to grow. Bitbang was slightly better: It only ran realloc() if buffer size changed. Still, the solution above improves performance and reliability.
this is fine, but i'm curious -- did you measure a performance change, or is this "by inspection"? it's never been my impression that historically realloc would be slow, unless the buffer is growing -- in which case there's no choice. and my perhaps mistaken assumption was that realloc() would usually not shrink a buffer.
paul
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-realloc_overhead/bitbang_spi.c
--- flashrom-realloc_overhead/bitbang_spi.c (Revision 777) +++ flashrom-realloc_overhead/bitbang_spi.c (Arbeitskopie) @@ -87,14 +87,16 @@ static unsigned char *bufout = NULL; static unsigned char *bufin = NULL; static int oldbufsize = 0;
- int bufsize = max(writecnt + readcnt, 260);
int bufsize; int i;
/* Arbitrary size limitation here. We're only constrained by memory. */ if (writecnt > 65536 || readcnt > 65536) return SPI_INVALID_LENGTH;
- if (bufsize != oldbufsize) {
- bufsize = max(writecnt + readcnt, 260);
- /* Never shrink. realloc() calls are expensive. */
- if (bufsize > oldbufsize) { bufout = realloc(bufout, bufsize); if (!bufout) { fprintf(stderr, "Out of memory!\n");
@@ -109,6 +111,7 @@ free(bufout); exit(1); }
} memcpy(bufout, writearr, writecnt);oldbufsize = bufsize;
Index: flashrom-realloc_overhead/ft2232_spi.c
--- flashrom-realloc_overhead/ft2232_spi.c (Revision 777) +++ flashrom-realloc_overhead/ft2232_spi.c (Arbeitskopie) @@ -200,14 +200,22 @@ static unsigned char *buf = NULL; /* failed is special. We use bitwise ops, but it is essentially bool. */ int i = 0, ret = 0, failed = 0;
int bufsize;
static int oldbufsize = 0;
if (writecnt > 65536 || readcnt > 65536) return SPI_INVALID_LENGTH;
- buf = realloc(buf, writecnt + readcnt + 100);
- if (!buf) {
fprintf(stderr, "Out of memory!\n");
exit(1); // -1
/* buf is not used for the response from the chip. */
bufsize = max(writecnt + 9, 260);
/* Never shrink. realloc() calls are expensive. */
if (bufsize > oldbufsize) {
buf = realloc(buf, bufsize);
if (!buf) {
fprintf(stderr, "Out of memory!\n");
exit(1);
}
oldbufsize = bufsize;
}
/*
-- Developer quote of the month: "We are juggling too many chainsaws and flaming arrows and tigers."
=--------------------- paul fox, pgf@foxharp.boston.ma.us (arlington, ma, where it's 47.1 degrees)