Я автоматически генерирую код C для вычисления больших выражений и пытаюсь на простых примерах выяснить, имеет ли смысл предварительно определять определенные части в отдельных переменных.
В качестве простого примера, скажем, мы вычисляем что-то в форме:
#include <cmath>
double test(double x, double y) {
const double c[9][9] = { ... }; // constants properly initialized, irrelevant
double expr = c[0][0]*x*y
+ c[1][0]*pow(x,2)*y + ... + c[8][0]*pow(x,9)*y
+ c[1][1]*pow(x,2)*pow(y,2) + ... + c[8][1]*pow(x,9)*pow(y,2)
+ ...
со всеми правильно инициализированными c [i] [j].На самом деле эти выражения содержат десятки миллионов умножений и сложений.
Коллега теперь предложил - уменьшить количество вызовов функции pow () и кэшировать часто необходимые значения в выражениях - чтобы определить каждую степеньx и y в отдельной переменной, что не составляет большого труда, так как код все равно генерируется автоматически, например:
double xp2 = pow(x,2);
double xp3 = pow(x,3);
double xp4 = pow(x,4);
// ...
// same for pow(y,n)
Я думаю, однако, что это не нужно, так как компилятор должен позаботитьсяиз этих оптимизаций.
К сожалению, у меня нет опыта чтения и интерпретации ассемблера, но я думаю, что вижу, что все вызовы pow () оптимизированы, верно?Кроме того, компилятор кеширует значения для pow (x, 2), pow (x, 3) и т. Д.?
Заранее спасибо за ваш ввод!