- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
inline double poly(double x, const double *c, int k) const {
double y = c[k];
switch (k) {
case 15: y = y * x + c[14];
case 14: y = y * x + c[13];
case 13: y = y * x + c[12];
case 12: y = y * x + c[11];
case 11: y = y * x + c[10];
case 10: y = y * x + c[ 9];
case 9: y = y * x + c[ 8];
case 8: y = y * x + c[ 7];
case 7: y = y * x + c[ 6];
case 6: y = y * x + c[ 5];
case 5: y = y * x + c[ 4];
case 4: y = y * x + c[ 3];
case 3: y = y * x + c[ 2];
case 2: y = y * x + c[ 1];
case 1: y = y * x + c[ 0];
case 0: break;
}
return y;
}
Видимо в отсутствии проверки на k > 15 и в бесполезном break?
В общем случае, конечно, так делать не стоит. Но, видимо, автор убедился, что это вычисление является узким местом в его расчете, и сделал вот такую вот микрооптимизацию. Этот код должен работать эффективнее цикла.
хм, при -funroll-loops выхлоп инлайна функции с циклом вполне приличен
на 4.7.2 немного хуже, но терпимо
желающие могут поэкспериментировать с выхлопом вот тут:
http://liveworkspace.org/code/1FESYP$4
Добавил SSE вариант - делает по скорости исходный код при k > 6
http://liveworkspace.org/code/3QcmgC$5
{
case 0 : return poly<0>(x,c);
case 1 : return poly<1>(x,c);
...
Помнится, кто-то спрашивал в №11479, зачем такое может быть нужно.
Профит от подобного шаблона проявится только если k фиксированное.
P.S. Вот если алгоритм, в котором в цикле используется poly параметризовать тем самым k, и твой свич перетащить на уровень, на котором будет вызываться алгоритм в целом - вот тогда профит будет, но, к сожалению, бинарник станет огромным.
это не хак - это фича. и говна соответственно в коде я лично не вижу.
я еще пару аналогичных свичей встречал.
теория (как сверху объясняется) в том что компилеры должны это сами делать уметь. на практике, без coverage прохода, компилеры не могут знать что именно будет узким местом, поэтому почти всегда идут на компромис когда применяют оптимизации которые могут значительно увеличить размер кода. (излишне много кода == кэш CPU для кода становится узким местом.) поэтому много циклов и не разворачивается.
в добавок, я подобное кино еще в физике несколько раз видел: народ руками оптимизировал некоторую математику что бы сделать ее производительность относительно хорошей, даже без оптимизации компилятора. выбор: либо ждать пока компилер оптимить кончит релиз билд, либо ждать пока функция кончит. народ раз руками оптимит - и потом ни компилера, ни функции не ждет.
Кусок дафф девайса, ибо в даффе еще цикл не помешает.
> оно же не член класса
Ну видимо член, раз написали. Хотя если член, то какого хрена он не static - не понятно.