compress: Avoid PARA_ABS and PARA_MAX in inner loop.
authorAndre Noll <maan@systemlinux.org>
Tue, 2 Apr 2013 15:02:09 +0000 (15:02 +0000)
committerAndre Noll <maan@systemlinux.org>
Sun, 21 Apr 2013 13:39:32 +0000 (15:39 +0200)
These macros are type-safe and evaluate their arguments only once.
However, they are also slow. For the compress filter we are dealing
with ints and unsigned ints only, so the additional checks performed
by the macros only slow things down. Getting rid of the macros reduces
the running time of

para_filter -f compress < foo.wav > /dev/null

by approximately 8%.

compress_filter.c

index 04377b7..cf55985 100644 (file)
@@ -75,8 +75,11 @@ next_buffer:
                op = para_malloc(length);
        for (i = 0; i < length / 2; i++) {
                /* be careful in that heat, my dear */
-               int sample = *ip++, adjusted_sample = (PARA_ABS(sample) *
-                       pcd->current_gain) >> gain_shift;
+               int sample = *ip++, adjusted_sample;
+
+               adjusted_sample = sample > 0? sample : -sample;
+               adjusted_sample *= pcd->current_gain;
+               adjusted_sample >>= gain_shift;
                if (adjusted_sample > 32767) { /* clip */
                        PARA_NOTICE_LOG("clip: sample: %d, adjusted sample: %d\n",
                                sample, adjusted_sample);
@@ -84,8 +87,8 @@ next_buffer:
                        pcd->current_gain = (3 * pcd->current_gain +
                                (1 << pcd->conf->inertia_arg)) / 4;
                        pcd->peak = 0;
-               } else
-                       pcd->peak = PARA_MAX(pcd->peak, adjusted_sample);
+               } else if (adjusted_sample > pcd->peak)
+                       pcd->peak = adjusted_sample;
                op[i] = sample >= 0? adjusted_sample : -adjusted_sample;
                if (++pcd->num_samples & mask)
                        continue;