Уменьшите стоимость слоя абстракции, вставив

В моем проекте у меня есть несколько слоев абстракции, таких как этот:

 Vector3 normalizeVector(Vector3 v);

Vector3 vectorMultiplyMatrix(Vector3 v, Matrix3 m);

Это просто «прокси» функции для математических библиотек, таких как DirectXMath.

У меня вопрос, как я могу уменьшить стоимость этих слоев? Сделав все эти функции встроенными, будет ли полностью исключена стоимость их вызова вместо непосредственного вызова специфичных для платформы?

Спасибо

2

Решение

Затраты на добавление нового уровня абстракции (прокси, фасад и т. Д.) В смысле объединения набора вызовов функций в другой незначительны. То, как вы передаете им данные, может вызвать проблемы, особенно при использовании сложных объектов, контейнеров и т. Д.

Vector3 normalizeVector(Vector3 v);

создает копию переданного Vector3 возражать при каждом вызове. Если вы сталкиваетесь с проблемами производительности, избегайте создания копии путем изменения передачи по значению на передачу по const ссылка:

Vector3 normalizeVector(const Vector3& v);

Этот новый прототип этой функции выражает: «Мне нужна ссылка на существующий действительный Vector3 объект, который я буду использовать, но не буду менять.

Только не оптимизируйте свой код, если вы действительно не сталкиваетесь с проблемами производительности. Преждевременная оптимизация всегда был злым и всегда будет.

4

Другие решения

Предоставление тела функции даст компилятору возможность исключить вызов функции через встраивание.

Будет ли он на самом деле работать, зависит от его внутренней эвристики: встраивание может увеличить общий размер сгенерированного кода, сделать его менее удобным для кеша и в конечном итоге свести на нет преимущество устранения вызова.

Есть специальные ключевые слова (например, __forceinline под VC ++), который можно использовать для переопределения анализа затрат / выгод компилятора, но компиляторы чаще правы в отношении таких решений, чем программисты!

С помощью профильная оптимизация может помочь компилятору принимать более эффективные решения по оптимизации на основе фактического шаблона использования программы, в том числе того, какие функции являются «горячими» для встроенных функций, а какие «холодными» и должны быть оставлены в покое.


Один особенно мощный метод, чтобы иметь в виду, это метапрограммирование шаблона. Идея состоит в том, чтобы подтолкнуть как можно больше вычислений во время компиляции.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector