- 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;
}
bormand 08.02.2013 05:17 # 0
Видимо в отсутствии проверки на k > 15 и в бесполезном break?
В общем случае, конечно, так делать не стоит. Но, видимо, автор убедился, что это вычисление является узким местом в его расчете, и сделал вот такую вот микрооптимизацию. Этот код должен работать эффективнее цикла.
bormand 08.02.2013 05:28 # +1
defecate-plusplus 08.02.2013 09:49 # +1
хм, при -funroll-loops выхлоп инлайна функции с циклом вполне приличен
defecate-plusplus 08.02.2013 10:04 # +2
на 4.7.2 немного хуже, но терпимо
желающие могут поэкспериментировать с выхлопом вот тут:
http://liveworkspace.org/code/1FESYP$4
absolut 08.02.2013 10:12 # 0
defecate-plusplus 08.02.2013 10:12 # 0
absolut 08.02.2013 10:17 # 0
bormand 08.02.2013 10:12 # 0
bormand 08.02.2013 10:16 # 0
uranix 08.02.2013 11:38 # +1
Добавил SSE вариант - делает по скорости исходный код при k > 6
http://liveworkspace.org/code/3QcmgC$5
uranix 08.02.2013 05:28 # 0
bormand 08.02.2013 06:17 # +3
TarasB 08.02.2013 10:08 # +1
{
case 0 : return poly<0>(x,c);
case 1 : return poly<1>(x,c);
...
Помнится, кто-то спрашивал в №11479, зачем такое может быть нужно.
bormand 08.02.2013 10:24 # 0
Профит от подобного шаблона проявится только если k фиксированное.
P.S. Вот если алгоритм, в котором в цикле используется poly параметризовать тем самым k, и твой свич перетащить на уровень, на котором будет вызываться алгоритм в целом - вот тогда профит будет, но, к сожалению, бинарник станет огромным.
tirinox 08.02.2013 18:48 # 0
bormand 09.02.2013 07:57 # 0
Dummy00001 09.02.2013 01:16 # +2
это не хак - это фича. и говна соответственно в коде я лично не вижу.
я еще пару аналогичных свичей встречал.
теория (как сверху объясняется) в том что компилеры должны это сами делать уметь. на практике, без coverage прохода, компилеры не могут знать что именно будет узким местом, поэтому почти всегда идут на компромис когда применяют оптимизации которые могут значительно увеличить размер кода. (излишне много кода == кэш CPU для кода становится узким местом.) поэтому много циклов и не разворачивается.
в добавок, я подобное кино еще в физике несколько раз видел: народ руками оптимизировал некоторую математику что бы сделать ее производительность относительно хорошей, даже без оптимизации компилятора. выбор: либо ждать пока компилер оптимить кончит релиз билд, либо ждать пока функция кончит. народ раз руками оптимит - и потом ни компилера, ни функции не ждет.
igumnovf 10.02.2013 22:38 # 0
bormand 10.02.2013 22:46 # 0
Кусок дафф девайса, ибо в даффе еще цикл не помешает.
> оно же не член класса
Ну видимо член, раз написали. Хотя если член, то какого хрена он не static - не понятно.
igumnovf 10.02.2013 22:51 # 0