Можно ли оптимизировать серию "склеенных" std::function
с и / или есть какая-либо реализация, которая пытается это сделать?
То, что я имею в виду, легче всего выразить математически: скажем, я хочу сделать std::function
, который является функцией функции:
f(x,y,z) = x^2 * y^3 * z^4
g(x,y,z) = f(x,y,z) / (x*y^2)
Есть ли способ для разработчика STL / компилятора оптимизировать удаленные части арифметики, вызывая функциональный объект g
, созданный из функционального объекта f
?
Это было бы своего рода символическим упрощением функций, но поскольку это std::function
, его нужно было бы обнаружить на уровне машины.
Из-за того, что это оптимизация, которая требует времени и, вероятно, не бесплатна (в тактах и / или памяти), она, вероятно, не разрешена Стандартом? Он опирается очень близко к языку, который обычно запускается через виртуальную машину. (Я думаю, что LLVM здесь больше, чем Java, с оптимизацией времени выполнения).
РЕДАКТИРОВАТЬ: Чтобы сделать обсуждение "более полезным", вот небольшой фрагмент кода (я понимаю, что лямбда не является std::function
, но лямбда может быть сохранена в std::function
, поэтому предположим, что auto
ниже означает std::function<T>
с соответствующим T
отлично выразит то, что я имел в виду выше):
auto f = [](const double x, const double y, const double z){ return x*x*y*y*y*z*z*z*z; };
auto g = [](const double c, const double y, const double z){ return f(x,y,z)/(x*y*y); };
«Тривиальный» компилятор сделает g
эквивалентным
double g(const double x, const double y, const double z){ return x*x*y*y*y*z*z*z*z/(x*y*y); }
Хотя оптимизированный std::function
мог бы сделать это (математически и во всех других смыслах правильно!):
double g( const double x, const double y, const double z){ return x*y*z*z*z*z; }
Обратите внимание, что хотя я говорю о математических функциях здесь, аналогичные преобразования могут быть сделаны для функций в общем смысле, но для этого потребуется больше самоанализа, что означает накладные расходы.
Я вижу, что это очень важно при разработке математических и физических симуляций, где общность объединения существующих библиотечных функций в пользовательские функции со всеми обычными математическими упрощениями могла бы стать хорошим методом выразительного, но производительного программного обеспечения для расчетов. .