From e0cf0261d0f81eb1c54c4d4a7636c27de4b00d36 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 25 Apr 2021 12:16:40 +0200 Subject: resample: improve performance (thanks José Miguel Sánchez García) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resample is well known for taking a long time to resize an image. This patch brings an important performance boost (in my test image, time was reduced from ~2850ms to ~500ms). It does that by extracting FP multiplication and division out of the innermost loop of resamplex/resampley. The results differ slightly from the current implementation: in my test: ~0.3% of the bytes had a ±2 difference in their value, which I attribute to rounding errors. I'm personally not concerned with that deviation, given the performance gains. However, I recommend testing it just to be sure I didn't overlook anything. José Miguel Sánchez García --- sys/src/cmd/resample.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/sys/src/cmd/resample.c b/sys/src/cmd/resample.c index d11e29960..3e4c20f46 100644 --- a/sys/src/cmd/resample.c +++ b/sys/src/cmd/resample.c @@ -67,10 +67,10 @@ void resamplex(uchar *in, int off, int d, int inx, uchar *out, int outx) { int i, x, k; - double X, xx, v, rat; - + double X, xx, v, rat, rato10; rat = (double)inx/(double)outx; + rato10 = rat/10.; for(x=0; x= inx) i = inx-1; v += in[off+i*d] * K[K2+k]; + xx += rato10; } out[off+x*d] = v; } @@ -96,9 +97,10 @@ void resampley(uchar **in, int off, int iny, uchar **out, int outy) { int y, i, k; - double Y, yy, v, rat; + double Y, yy, v, rat, rato10; rat = (double)iny/(double)outy; + rato10 = rat/10.; for(y=0; y= iny) i = iny-1; v += in[i][off] * K[K2+k]; + yy += rato10; } out[y][off] = v; } -- cgit v1.2.3