Yes, it's definitely best to keep pow() (log, exp, etc.) out of the inner loop whenever possible. When log/exp IS required at the audio rate, the --fast-math option can be tried.
- Julius On Wed, Dec 5, 2018 at 4:30 AM Hermann Meyer <[email protected]> wrote: > > > Am 04.12.18 um 18:41 schrieb Joshua Peschke: > > i noticed for example that the smoothing of parameters seems to affect > > performance quite much (if there are lots of them..). do you have any > > suggestions on how to minimise this? any hints are very much appreciated! > > > Hi > > some care needs to be taking when you smooth parameters. Smoothing > itself isn't really expensive, but in combination with, for example > db2linear it could make things worse. > > Let's have a look at the generated code, when we use (from the examples) > > gain = vslider("[1]", 0, -70, +4, 0.1) : ba.db2linear : si.smoo; > > we get a loop like this: > > virtual void compute (int count, FAUSTFLOAT** input, FAUSTFLOAT** output) { > float fSlow0 = (0.001f * powf(10,(0.05f * > float(fslider0)))); // powf called for db2linear once for each callback > FAUSTFLOAT* input0 = input[0]; > FAUSTFLOAT* output0 = output[0]; > for (int i=0; i<count; i++) { > fRec0[0] = (fSlow0 + (0.999f * fRec0[1])); // <- parameter > smoothing > output0[i] = (FAUSTFLOAT)((float)input0[i] * fRec0[0]); > // post processing > fRec0[1] = fRec0[0]; // <- parameter smoothing > } > } > > parameter smoothing is 1 addition and one multiplication and one > "memmove", for each sample. > > now, when you use it like this: > > gain = vslider("[1]", 0, -70, +4, 0.1) : si.smoo : ba.db2linear; > > we get a loop like this: > > virtual void compute (int count, FAUSTFLOAT** input, FAUSTFLOAT** output) { > float fSlow0 = (0.001f * float(fslider0)); > FAUSTFLOAT* input0 = input[0]; > FAUSTFLOAT* output0 = output[0]; > for (int i=0; i<count; i++) { > fRec0[0] = (fSlow0 + (0.999f * fRec0[1])); // <- parameter > smoothing > output0[i] = (FAUSTFLOAT)((float)input0[i] * powf(10,(0.05f > * fRec0[0]))); // additional powf call in inner loop > // post processing > fRec0[1] = fRec0[0]; // <- parameter smoothing > } > } > > Parameter smoothing use the same resources as in the example above, but > we've now the pow call in the inner loop, means it will be called for > any sample, instead like in the above loop, once at any callback. > > > > > > _______________________________________________ > Faudiostream-users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/faudiostream-users -- Julius O. Smith III <[email protected]> Professor of Music and, by courtesy, Electrical Engineering CCRMA, Stanford University http://ccrma.stanford.edu/~jos/ _______________________________________________ Faudiostream-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/faudiostream-users
