CPU%是关于"可以做什么"是正常的。而不是"发生了什么"?

时间:2017-05-10 11:15:21

标签: c++ performance cpu-usage

我有这个功能,在我的应用程序中被大量调用:

void Envelope::Process(Voice &voice) {
    VoiceParameters &voiceParameters = mVoiceParameters[voice.mIndex];

    // control rate
    if (voiceParameters.mControlRateIndex-- == 0) {
        voiceParameters.mControlRateIndex = PLUG_CONTROL_RATE - 1;

        DBGMSG("I'm entered");
    }

    // next phase
    voiceParameters.mBlockStep += mRate;
    voiceParameters.mStep += mRate;
}

此功能永远不会进入if声明(即我从未看到"我已输入"消息)。它需要占CPU的3%。

现在,如果我写这个函数:

void Envelope::Process(Voice &voice) {
    VoiceParameters &voiceParameters = mVoiceParameters[voice.mIndex];

    // control rate
    if (voiceParameters.mControlRateIndex-- == 0) {
        voiceParameters.mControlRateIndex = PLUG_CONTROL_RATE - 1;

        DBGMSG("I'm entered");

        // samples (as rest) between two "quantized by block" sections occurs in the prev or next section, by round (interpolation). latest samples will be ignored (>) or added (<)
        if (mIsEnabled) {
            // update value
            voiceParameters.mValue = (voiceParameters.mBlockStartAmp + (voiceParameters.mBlockStep * voiceParameters.mBlockFraction));

            // scale value
            if (!mIsBipolar) {
                voiceParameters.mValue = (voiceParameters.mValue + 1.0) / 2.0;
            }
            voiceParameters.mValue *= mAmount;
        }
        else {
            voiceParameters.mValue = 0.0;
        }

        // connectors
        mOutputConnector_CV.mPolyValue[voice.mIndex] = voiceParameters.mValue;
    }

    // next phase
    voiceParameters.mBlockStep += mRate;
    voiceParameters.mStep += mRate;
}

(也是如此,因为插入的代码永远不会执行)CPU提高了7%。

发生了什么?怎么会这样?

我在Release(或Tracer,没什么不同)模式下工作。

1 个答案:

答案 0 :(得分:1)

由于&#34;未使用&#34;额外代码包含voiceParameters.mBlockStep的读取,对它的写入变得相关。编译器可以使用只写变量获得更多自由,甚至可以消除它们。但他们至少可以做的是重新排序这样的写作。