我有这个功能,在我的应用程序中被大量调用:
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,没什么不同)模式下工作。
答案 0 :(得分:1)
由于&#34;未使用&#34;额外代码包含voiceParameters.mBlockStep
的读取,对它的写入变得相关。编译器可以使用只写变量获得更多自由,甚至可以消除它们。但他们至少可以做的是重新排序这样的写作。