Почему доступ к моей структуре замедляет выполнение моего метода - PullRequest
0 голосов
/ 04 ноября 2011

Я довольно часто вызываю функцию в обратном звуковом вызове ядра, чтобы применить эквалайзер к моим аудиосэмплам. У меня очень странные результаты работы этого метода, измеренные во временных профилях инструментов.

Я сделал 3 теста. Первый вызывает функцию и просто возвращает нулевое значение. Instruments сообщает об этом как 1% .

inline AudioUnitSampleType LowPassProcess (struct EQEffect *obj , AudioUnitSampleType input)
{
return 0;
}

Второй тест фактически выполняет вычисления эквалайзера в функции путем доступа к структуре, содержащей параметры эквалайзера.

При работе с этим инструментом сообщается как * 40 % *!

struct globaldata

    {
        float cutoff;
        float fs;
        float f;
        float q;
        float scale;

        AudioUnitSampleType low;
        AudioUnitSampleType high;
        AudioUnitSampleType band;
        AudioUnitSampleType notch;
    };



struct globaldata global;

inline AudioUnitSampleType LowPassProcess (struct EQEffect *obj , AudioUnitSampleType input)
{

    global.low= global.low + (global.f * global.band);
    global.high= global.scale * input -global.low - global.q * global.band;
    global.band = global.f * global.high +global.band;
    global.notch = global.high + global.low;

    return global.low;

};

Наконец, я попытался снова вызвать функцию, но в этом случае не обращался к структуре EQ, но все еще выполнял то же количество вычислений.

При использовании этого инструмента сообщает как 7%

struct globaldata

        {
            float cutoff;
            float fs;
            float f;
            float q;
            float scale;

            AudioUnitSampleType low;
            AudioUnitSampleType high;
            AudioUnitSampleType band;
            AudioUnitSampleType notch;
        };


    struct globaldata global;

inline AudioUnitSampleType LowPassProcess (struct EQEffect *obj , AudioUnitSampleType input)
{


    float x =10+(50*8);
    float y = ((10 *5) -50)- (6*40);
    float z=10 *(6+9);
    float j=60+0;


    return 0;

};

Итак, мой вопрос: почему моя функция тратится в 5 раз дольше на выполнение, когда я выполняю вычисления на элементах структуры, и занимает гораздо меньше времени, когда я просто выполняю вычисления на переменных?

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Полагаю, компилятор просто оптимизирует ваши постоянные вычисления.

В любом случае, помните, что это не имеет значения, если что-то займет 40%, если это все еще достаточно быстро (и я ожидаю, что это будет, если постоянные вычисления займут 7%). =)

0 голосов
/ 04 ноября 2011

Поскольку в первом и третьем примерах кода выполняется ничего - первый намеренно пуст, а третий оптимизирован компилятором, поскольку вы не обращаетесь к какой-либо памяти и не используете результатывычисления (кстати, все константы времени компиляции).

...