Если у нас есть деление на один во внутреннем цикле, он умен, чтобы добавить специальную обработку случая, чтобы устранить разделение:Должно ли разделение на один получить специальный случай?
ДО:
int collapseFactorDepth...
for (int i = 0; i < numPixels; i++)
{
pDataTarget[i] += pPixelData[i]/collapseFactorDepth;
}
ПОСЛЕ:
if (collapseFactorDepth != 1)
{
for (int i = 0; i < numPixels; i++)
{
pDataTarget[i] += pPixelData[i]/collapseFactorDepth;
}
}
else
{
for (int i = 0; i < numPixels; i++)
{
pDataTarget[i] += pPixelData[i];
}
}
Может компилятор рассуждает это сам по себе? У современных процессоров есть какие-либо средства для оптимизации этого?
Мне особенно интересно, если вы считаете, что дополнительный код полезен в отличие от коэффициента усиления производительности (есть ли какие-либо?).
фона:
- Numpixels большой
- collapseFactorDepth составляет 90% от времени 1
- современных процессоров: Intel x86/amd64 архитектуры
- Пожалуйста, не учитывают более широкие вещи. Оптимизирована нагрузка памяти на загрузку.
- Не будем вспотеть, что мы должны, вероятно, сделать это как двойное умножение.
Как раз моя мысль, если вызывающий человек хочет разделить на один, просто сделайте это. (Вероятно, я не буду проверять «0») –
Это была бы преждевременная оптимизация. Когда вы оптимизируете одно, вы пессимизируете все остальное. Гораздо важнее ясность кода. –
Просто FYI, если вы зададите такой вопрос производительности, и вы знаете, что вы делаете, обычно полезно дать некоторый опыт самой проблеме производительности. В противном случае вы просто получите кучу (потенциально бесполезных) комментариев и ответов, говорящих вам не оптимизировать вообще. – Mysticial