я смотрю тут собрание экспертов по высокоэффективному кодингу сегодня
вот вам для примера пара процедурок, делающих одно и то же:
раз
double *input, *output;
for (int i = 0; i < 32; i++) {
double s = 0;
for (int j = 0; j < 32; j++)
s += input[j] * m_cos_cache[i][j];
output[i] = s;
}
двас
float *src, *dst;
double v53, v58, v59, v60, v74, v78, v79, v80, v81;
double v82, v83, v129, v142, v143, v144, v145, v146;
double v147, v148, v149, v150, v151, v152, v153, v154;
double v155, v200, v201, v202, v203, v204, v205, v206;
double t0, t1, t2, t3, t4, t5, t6, t7;
t0 = src[0] + src[31];
v142 = src[0] - src[31];
t1 = src[1] + src[30];
v152 = src[1] - src[30];
v74 = src[2] + src[29];
v200 = src[2] - src[29];
v146 = src[3] + src[28];
v144 = src[3] - src[28];
v81 = src[4] + src[27];
v150 = src[4] - src[27];
v79 = src[5] + src[26];
v154 = src[5] - src[26];
v201 = src[6] + src[25];
v129 = src[6] - src[25];
v82 = src[7] + src[24];
v148 = src[7] - src[24];
v53 = src[8] + src[23];
v153 = src[8] - src[23];
v60 = src[9] + src[22];
v151 = src[9] - src[22];
v202 = src[10] + src[21];
v203 = src[10] - src[21];
v204 = src[11] + src[20];
v145 = src[11] - src[20];
v205 = src[12] + src[19];
v149 = src[12] - src[19];
v58 = src[13] + src[18];
v155 = src[13] - src[18];
t2 = src[17] + src[14];
v143 = src[14] - src[17];
t3 = src[16] + src[15];
v147 = src[15] - src[16];
v83 = t0 + t3;
v80 = t0 - t3;
v59 = t1 + t2;
v78 = t1 - t2;
t0 = v74 + v58;
v74 = v74 - v58;
t1 = v146 + v205;
v146 = v146 - v205;
t2 = v81 + v204;
v81 = v81 - v204;
t3 = v79 + v202;
v79 = v79 - v202;
t4 = v201 + v60;
v201 = v201 - v60;
t5 = v82 + v53;
v82 = v82 - v53;
v53 = v83 + t5;
v83 = v83 - t5;
v60 = v59 + t4;
v59 = v59 - t4;
v202 = t0 + t3;
v206 = t0 - t3;
v204 = t1 + t2;
v58 = t1 - t2;
t0 = v53 + v204;
v53 = v53 - v204;
t1 = v60 + v202;
v60 = v60 - v202;
v202 = t0 + t1;
t1 = (t0 - t1)*sincos[_sin_pi_div_4];
t2 = v53 * sincos[_cos_pi_div_8] + v60 * sincos[_sin_pi_div_8];
v53 = v53 * sincos[_sin_pi_div_8] - v60 * sincos[_cos_pi_div_8];
v60 = v83 * sincos[_cos_pi_div_16] + v58 * sincos[_sin_pi_div_16];
v83 = v83 * sincos[_sin_pi_div_16] - v58 * sincos[_cos_pi_div_16];
v58 = v206 * sincos[_sin_3pi_div_16] + v59 * sincos[_cos_3pi_div_16];
v59 = v206 * sincos[_cos_3pi_div_16] - v59 * sincos[_sin_3pi_div_16];
t3 = v60 + v58;
t4 = (v60 - v58)*sincos[_sin_pi_div_4];
v58 = v83 + v59;
t5 = (v83 - v59)*sincos[_sin_pi_div_4];
v59 = t4 + t5;
v60 = t4 - t5;
t4 = v80 * sincos[_cos_pi_div_32] + v82 * sincos[_sin_pi_div_32];
v80 = v80 * sincos[_sin_pi_div_32] - v82 * sincos[_cos_pi_div_32];
t5 = v201 * sincos[_sin_3pi_div_32] + v78 * sincos[_cos_3pi_div_32];
v78 = v201 * sincos[_cos_3pi_div_32] - v78 * sincos[_sin_3pi_div_32];
t6 = v74 * sincos[_cos_5pi_div_32] + v79 * sincos[_sin_5pi_div_32];
v74 = v74 * sincos[_sin_5pi_div_32] - v79 * sincos[_cos_5pi_div_32];
v79 = v81 * sincos[_sin_7pi_div_32] + v146 * sincos[_cos_7pi_div_32];
v146 = v81 * sincos[_cos_7pi_div_32] - v146 * sincos[_sin_7pi_div_32];
v81 = t4 + v79;
v83 = t4 - v79;
v79 = t5 + t6;
v82 = t5 - t6;
t4 = v81 + v79;
t5 = (v81 - v79)*sincos[_sin_pi_div_4];
t6 = v83 * sincos[_cos_pi_div_8] + v82 * sincos[_sin_pi_div_8];
v83 = v83 * sincos[_sin_pi_div_8] - v82 * sincos[_cos_pi_div_8];
t7 = v80 + v146;
v80 = v80 - v146;
v146 = v78 + v74;
v78 = v78 - v74;
v74 = t7 + v146;
v82 = (t7 - v146)*sincos[_sin_pi_div_4];
v146 = v80 * sincos[_cos_pi_div_8] + v78 * sincos[_sin_pi_div_8];
v80 = v80 * sincos[_sin_pi_div_8] - v78 * sincos[_cos_pi_div_8];
v78 = t6 + v80;
v79 = t6 - v80;
v80 = t5 + v82;
v81 = t5 - v82;
v82 = v83 + v146;
v83 = v83 - v146;
t5 = v142 * sincos[_cos_pi_div_64] + v147 * sincos[_sin_pi_div_64];
v142 = v142 * sincos[_sin_pi_div_64] - v147 * sincos[_cos_pi_div_64];
t6 = v143 * sincos[_sin_3pi_div_64] + v152 * sincos[_cos_3pi_div_64];
v152 = v143 * sincos[_cos_3pi_div_64] - v152 * sincos[_sin_3pi_div_64];
v143 = v200 * sincos[_cos_5pi_div_64] + v155 * sincos[_sin_5pi_div_64];
v200 = v200 * sincos[_sin_5pi_div_64] - v155 * sincos[_cos_5pi_div_64];
v155 = v149 * sincos[_sin_7pi_div_64] + v144 * sincos[_cos_7pi_div_64];
v144 = v149 * sincos[_cos_7pi_div_64] - v144 * sincos[_sin_7pi_div_64];
v149 = v150 * sincos[_cos_9pi_div_64] + v145 * sincos[_sin_9pi_div_64];
v150 = v150 * sincos[_sin_9pi_div_64] - v145 * sincos[_cos_9pi_div_64];
v145 = v203 * sincos[_sin_11pi_div_64] + v154 * sincos[_cos_11pi_div_64];
v154 = v203 * sincos[_cos_11pi_div_64] - v154 * sincos[_sin_11pi_div_64];
v203 = v129 * sincos[_cos_13pi_div_64] + v151 * sincos[_sin_13pi_div_64];
v129 = v129 * sincos[_sin_13pi_div_64] - v151 * sincos[_cos_13pi_div_64];
v151 = v153 * sincos[_sin_15pi_div_64] + v148 * sincos[_cos_15pi_div_64];
v148 = v153 * sincos[_cos_15pi_div_64] - v148 * sincos[_sin_15pi_div_64];
v153 = t5 + v151;
v146 = t5 - v151;
v151 = t6 + v203;
v147 = t6 - v203;
t5 = v143 + v145;
v143 = v143 - v145;
t6 = v155 + v149;
v155 = v155 - v149;
v149 = v153 + t6;
v153 = v153 - t6;
v145 = v151 + t5;
v151 = v151 - t5;
t5 = v149 + v145;
t6 = (v149 - v145)*sincos[_sin_pi_div_4];
v145 = v153 * sincos[_cos_pi_div_8] + v151 * sincos[_sin_pi_div_8];
v153 = v153 * sincos[_sin_pi_div_8] - v151 * sincos[_cos_pi_div_8];
v151 = v146 * sincos[_cos_pi_div_16] + v155 * sincos[_sin_pi_div_16];
v146 = v146 * sincos[_sin_pi_div_16] - v155 * sincos[_cos_pi_div_16];
v155 = v143 * sincos[_sin_3pi_div_16] + v147 * sincos[_cos_3pi_div_16];
v147 = v143 * sincos[_cos_3pi_div_16] - v147 * sincos[_sin_3pi_div_16];
v143 = v155 + v151;
t7 = (v151 - v155)*sincos[_sin_pi_div_4];
v155 = v147 + v146;
v146 = (v146 - v147)*sincos[_sin_pi_div_4];
v147 = t7 + v146;
v151 = t7 - v146;
t7 = v142 + v148;
v142 = v142 - v148;
v148 = v152 + v129;
v152 = v152 - v129;
v129 = v200 + v154;
v200 = v200 - v154;
v154 = v144 + v150;
v144 = v144 - v150;
v150 = t7 + v154;
v146 = t7 - v154;
t7 = v148 + v129;
v148 = v148 - v129;
v129 = v150 + t7;
v150 = (v150 - t7)*sincos[_sin_pi_div_4];
v154 = v146 * sincos[_cos_pi_div_8] + v148 * sincos[_sin_pi_div_8];
v146 = v146 * sincos[_sin_pi_div_8] - v148 * sincos[_cos_pi_div_8];
v148 = v142 * sincos[_cos_pi_div_16] + v144 * sincos[_sin_pi_div_16];
v142 = v142 * sincos[_sin_pi_div_16] - v144 * sincos[_cos_pi_div_16];
v144 = v200 * sincos[_sin_3pi_div_16] + v152 * sincos[_cos_3pi_div_16];
v152 = v200 * sincos[_cos_3pi_div_16] - v152 * sincos[_sin_3pi_div_16];
t7 = v148 + v144;
v148 = (v148 - v144)*sincos[_sin_pi_div_4];
v144 = v142 + v152;
v142 = (v142 - v152)*sincos[_sin_pi_div_4];
v152 = v148 + v142;
v148 = v148 - v142;
v142 = v143 + v144;
v143 = v143 - v144;
dst[3] = (float)v142;
dst[6] = (float)v78;
v144 = v145 + v146;
v145 = v145 - v146;
dst[5] = (float)v143;
dst[7] = (float)v144;
dst[10] = (float)v79;
dst[9] = (float)v145;
dst[12] = (float)v59;
v146 = v147 + v148;
v147 = v147 - v148;
dst[14] = (float)v80;
dst[11] = (float)v146;
dst[13] = (float)v147;
v148 = t6 + v150;
v149 = t6 - v150;
dst[15] = (float)v148;
dst[18] = (float)v81;
dst[17] = (float)v149;
dst[20] = (float)v60;
v150 = v151 + v152;
v151 = v151 - v152;
dst[19] = (float)v150;
dst[21] = (float)v151;
v152 = v153 + v154;
v153 = v153 - v154;
v154 = v155 + t7;
v155 = v155 - t7;
dst[0] = (float)v202;
dst[1] = (float)t5;
dst[2] = (float)t4;
dst[4] = (float)t3;
dst[8] = (float)t2;
dst[16] = (float)t1;
dst[22] = (float)v82;
dst[23] = (float)v152;
dst[24] = (float)v53;
dst[25] = (float)v153;
dst[26] = (float)v83;
dst[27] = (float)v154;
dst[28] = (float)v58;
dst[29] = (float)v155;
dst[30] = (float)v74;
dst[31] = (float)v129;
вопросы:
- какая из них более оптимизирована ?
- какая из них говнокод ?
- какая из них быдлокод ?
- функцию и смысл какой из них можно понять не поехав мозгами ?
- в случае возникновения проблем или ошибок какую из них возможно отладить и хоть что-то понять ?
- в случае если окажется, что базовый алгоритм в целом не верен и его нужно изменить, в каком из вариантов это реально сделать ?
ответы на эти вопросы возможно помогут вам немножко понять что такое "оптимизации", а также когда их применяют а когда нет.
PS: код не отфонарный, это одна из базовых операций декодирования аудио (и -видео вроде тоже) MPEG-ов.