src/flac/encode.c : Improve perf of format_input() when compiled with MSVC.
authorErik de Castro Lopo <erikd@mega-nerd.com>
Sat, 1 Feb 2014 22:00:27 +0000 (09:00 +1100)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Sat, 1 Feb 2014 22:00:32 +0000 (09:00 +1100)
MSVS profiler shows that the encoder spends too much time inside format_input()
when the input is 24-bit. Increases encoding speed:

FLAC -5: from 27.1 to 24.2 seconds
FLAC -8: from 76.2 to 73.1 seconds
(MSVS 2010, 32-bit flac.exe, 24-bit stereo input file)

For GCC compiles the encoding speed remains the same. I suspect that GCC is
smart enough to use strict aliasing rule to optimize the code, and MSVS doesn't
even know about it.

Path-from: lvqcl <lvqcl.mail@gmail.com>

src/flac/encode.c

index 04f20ce..50f05df 100644 (file)
@@ -2395,19 +2395,23 @@ FLAC__bool format_input(FLAC__int32 *dest[], unsigned wide_samples, FLAC__bool i
                        unsigned b;
                        for(b = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
                                for(channel = 0; channel < channels; channel++, sample++) {
-                                       out[channel][wide_sample]  = ucbuffer_[b++]; out[channel][wide_sample] <<= 8;
-                                       out[channel][wide_sample] |= ucbuffer_[b++]; out[channel][wide_sample] <<= 8;
-                                       out[channel][wide_sample] |= ucbuffer_[b++];
-                                       out[channel][wide_sample] -= 0x800000;
+                                       FLAC__int32 t;
+                                       t  = ucbuffer_[b++]; t <<= 8;
+                                       t |= ucbuffer_[b++]; t <<= 8;
+                                       t |= ucbuffer_[b++];
+                                       t -= 0x800000;
+                                       out[channel][wide_sample] = t;
                                }
                }
                else {
                        unsigned b;
                        for(b = sample = wide_sample = 0; wide_sample < wide_samples; wide_sample++)
                                for(channel = 0; channel < channels; channel++, sample++) {
-                                       out[channel][wide_sample]  = scbuffer_[b++]; out[channel][wide_sample] <<= 8;
-                                       out[channel][wide_sample] |= ucbuffer_[b++]; out[channel][wide_sample] <<= 8;
-                                       out[channel][wide_sample] |= ucbuffer_[b++];
+                                       FLAC__int32 t;
+                                       t  = scbuffer_[b++]; t <<= 8;
+                                       t |= ucbuffer_[b++]; t <<= 8;
+                                       t |= ucbuffer_[b++];
+                                       out[channel][wide_sample] = t;
                                }
                }
        }