From: Uwe Hermann Date: Fri, 15 Apr 2011 19:49:22 +0000 (+0200) Subject: gnuplot output: Optimize by only storing changes. X-Git-Tag: libsigrok-0.1.0~286 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=50959ddcdc455c930397fbc9f85c3a745ff45fda 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. --- diff --git a/output/output_gnuplot.c b/output/output_gnuplot.c index c3417c45..dfa91eb7 100644 --- a/output/output_gnuplot.c +++ b/output/output_gnuplot.c @@ -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++);