Шаблоны выражений: повышение производительности при оценке выражений?
По методике шаблонов выражений матричное выражение типа
D = A*B+sin(C)+3.;
с точки зрения производительности вычислений в значительной степени эквивалентен рукописномуfor
петля.
Теперь предположим, что у меня есть следующие два выражения
D = A*B+sin(C)+3.;
F = D*E;
cout << F << "\n";
В «классической» реализации по шаблонам выражений производительность вычислений будет почти такой же, как у двухfor
петли в последовательности. Это связано с тем, что выражения вычисляются сразу после=
операторы встречаются.
Мой вопрос: есть ли метод (например, использование заполнителей?), Чтобы признать, что значенияD
на самом деле не используются, и что представляющие интерес ценности являются единственными элементамиF
, так что только выражение
F = E*(A*B+sin(C)+3.);
оценивается, и вся производительность эквивалентна производительности одногоfor
цикл?
Конечно, такая гипотетическая техника также должна быть в состоянии вернуться обратно, чтобы оценить выражение
D = A*B+sin(C)+3.;
если позже в коде значенияD
нужны.
Спасибо заранее за любую помощь.
РЕДАКТИРОВАТЬ: Результаты экспериментов решение, предложенное Евгением
Оригинальная инструкция:
Result D=A*B-sin(C)+3.;
Время вычислений: 32 мс
Инструкция в два этапа:
Result Intermediate=A*B;
Result D=Intermediate-sin(C)+3.;
Время вычислений: 43мс
Решение сauto
:
auto&& Intermediate=A*B;
Result D=Intermediate-sin(C)+3.;
Время вычислений: 32мс.
В заключение,auto&&
Позволяет восстановить исходное время вычислений в случае одной команды.
РЕДАКТИРОВАТЬ: Обобщение соответствующих ссылок, следуя предложениям Евгения
Универсальные ссылки на C ++ 11
C ++ и последующий 2012 год: Скотт Мейерс - Универсальные ссылки на C ++ 11