В рамках проектирования системы нам необходимо реализовать заводскую модель. В сочетании с шаблоном Factory мы также используем CRTP, чтобы предоставить базовый набор функций, которые затем могут быть настроены классами Derived.C++ Низкая задержка Дизайн: Функция Dispatch v/s CRTP для заводской реализации
Пример кода ниже:
class FactoryInterface{
public:
virtual void doX() = 0;
};
//force all derived classes to implement custom_X_impl
template< typename Derived, typename Base = FactoryInterface>
class CRTP : public Base
{
public:
void doX(){
// do common processing..... then
static_cast<Derived*>(this)->custom_X_impl();
}
};
class Derived: public CRTP<Derived>
{
public:
void custom_X_impl(){
//do custom stuff
}
};
Хотя эта конструкция свертывается, она делает обеспечить несколько преимуществ. Все вызовы после вызова начальной виртуальной функции могут быть встроены. Вызов производного класса custom_X_impl также выполняется эффективно.
Я написал программу сравнения, чтобы сравнить поведение для подобной реализации (жесткий цикл, повторные вызовы) с помощью указателей функций и виртуальных функций. Этот дизайн получился триумфом для gcc/4.8 с O2 и O3.
Гуру C++, однако, вчера сказал мне, что любой вызов виртуальной функции в большой исполняющей программе может принимать переменное время, учитывая промахи в кэше, и я могу добиться потенциально лучшей производительности, используя таблицы функций таблицы стиля и gcc hotlisting функций. Однако я все еще вижу 2x стоимость в моей примерной программе, упомянутой выше.
Мои вопросы следующие: 1. Утверждается ли утверждение гуру? Для любых ответов есть ли ссылки, на которые я могу ссылаться. 2. Есть ли какая-либо реализация с низкой задержкой, которую я могу ссылаться, имеет базовый класс, вызывающий пользовательскую функцию в производном классе, используя указатели функций? 3. Любые предложения по улучшению дизайна?
Любая другая обратная связь всегда приветствуется.
Thanks Christophe. Ваш анализ связан с тем, что я вижу в тестах производительности. Вы видите какие-либо потенциальные оптимизации в дизайне? – Sid
Думаю, будет еще труднее оптимизировать! Поскольку doX() должен быть виртуальным, а Derived определяется клиентом, я не нахожу другой альтернативы с меньшей косвенностью. – Christophe