gnuplot output: Optimize by only storing changes.

Only output new lines in gnuplot output if there have been changes in
the samples (similar to what VCD does). As long as the first and last
sample are output, the resulting plot looks OK.

This reduces the size of the output file from roughly 200MB to just 60KB
in one specific test setup (depends on the number of probes and on the
signal, of course). The time and CPU load required to generate the gnuplot
output and the resulting plot (PNG or other) is also drastically reduced
from multiple minutes to roughly 30 seconds (again, depends on various
things).

Thanks Ken Mobley of ChronoVu for the report.
This commit is contained in:
Uwe Hermann 2011-04-15 21:49:22 +02:00
parent 15f2d0c0f2
commit 50959ddcdc
1 changed files with 12 additions and 1 deletions

View File

@ -195,7 +195,7 @@ static int data(struct sr_output *o, const char *data_in, uint64_t length_in,
struct context *ctx;
unsigned int max_linelen, outsize, p, curbit, i;
uint64_t sample;
static uint64_t samplecount = 0;
static uint64_t samplecount = 0, old_sample = 0;
char *outbuf, *c;
if (!o) {
@ -243,8 +243,19 @@ static int data(struct sr_output *o, const char *data_in, uint64_t length_in,
}
for (i = 0; i <= length_in - ctx->unitsize; i += ctx->unitsize) {
memcpy(&sample, data_in + i, ctx->unitsize);
/*
* Don't output the same samples multiple times. However, make
* sure to output at least the first and last sample.
*/
if (samplecount++ != 0 && sample == old_sample) {
if (i != (length_in - ctx->unitsize))
continue;
}
old_sample = sample;
/* The first column is a counter (needed for gnuplot). */
c = outbuf + strlen(outbuf);
sprintf(c, "%" PRIu64 "\t", samplecount++);