Эффективность шаблонов проектирования - PullRequest
6 голосов
/ 06 августа 2010

Кто-нибудь знает какие-либо сайты / книги / статьи, посвященные лучшим практикам или теории шаблонов проектирования в высокопроизводительных приложениях? Кажется, что многие шаблоны используют косвенное / абстрагирование / инкапсуляцию таким образом, что это может повлиять на производительность в вычислительно интенсивном коде. Head First Design Patterns и даже GoF упоминают о возможности достижения производительности со многими шаблонами, но без более конкретного совета, как с этим бороться.

Ответы [ 9 ]

5 голосов
/ 06 августа 2010

Я удивлен, что мы не спрашиваем какие проблемы с производительностью у вас возникают!

По моему опыту, проблемы с производительностью обычно связаны с конкретными условиями и ситуациями. Шаблоны проектирования, с другой стороны, являются решением более общих и абстрактных проблем. Было бы немного неловко подходить к обоим в одном и том же тексте: с каким из многих «не шаблонных» решений следует сравнить автора с производительностью шаблона проектирования? Если проблема с производительностью является общей, то, безусловно, уже есть шаблоны для их решения: Flyweight является хорошим примером.

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

Знание шаблонов также может быть полезно для решения проблем с производительностью. Во-первых, кто-то уже упоминал, что шаблоны разбивают проблему на более мелкие биты: это может облегчить точное определение источника проблемы и изоляцию некрасивого, но производительного кода. Они также создают основу рассуждений и ожиданий для разработчиков. Если вам необходимо ввести отклонение по соображениям производительности, это будет очевидно: «За исключением случаев, когда мы отказываемся от X и делаем Y для повышения производительности, это Цепочка ответственности ». Это правила, которые нужно нарушать когда нужно.

(Увы, есть один очень хороший шаблон для получения хорошей производительности: измерение, определение, исправление.)

4 голосов
/ 06 августа 2010

Шаблоны проектирования существуют, чтобы помочь вам понять, как разрабатывать программное обеспечение или повышать его гибкость. То, как вы реализуете шаблон, определяет, какое снижение производительности (или выгода) вы увидите от его использования.

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

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

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

3 голосов
/ 06 августа 2010

Самый конкретный совет: профилируйте его в своем приложении и посмотрите, какое влияние оно действительно оказывает.

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

1 голос
/ 06 августа 2010

Одним из терминов, которые могут помочь вам получить лучшие хиты, является «язык шаблонов». Это набор шаблонов, которые идут вместе с какой-то целью. Если у вас есть более конкретная цель, чтобы высокопроизводительные пользователи могли наметить путь через шаблоны для вашего домена, например: язык шаблонов для параллельного программного обеспечения . Вот еще одна хорошая коллекция шаблонов параллельного программирования от UIUC, очаг работы шаблонов.

Ребята из ACE / TAO имеют много статей о высокопроизводительных сетевых шаблонах с использованием C ++

1 голос
/ 06 августа 2010

Шаблоны проектирования - это, в основном, способы разбить вашу программу на более мелкие части, которые легче использовать, составлять, проектировать и тестировать. Несколько шаблонов разработки приведут к тому, что код будет работать хуже, чем более простой дизайн, но они имеют значительное преимущество, если принять во внимание правило 80/20.

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

0 голосов
/ 06 августа 2010

Помните старую поговорку: «Вы можете сделать это хорошо, быстро и дешево, выберите два»
Шаблоны проектирования обращаются к добру.Требуется хорошая основа, чтобы код мог быть точным и обслуживаемым.
Если производительность является проблемой, тогда проведите сравнительный анализ, а затем оптимизируйте разделы, которые вызывают проблемы.Во многих случаях производительность - это просто вопрос выбора правильного алгоритма, но это может означать, что вам нужно взломать какой-то ужасно оптимизированный код для тех 10%, что занимает 90% времени.Просто убедитесь, что вы прокомментируете S ^^ T из него.

0 голосов
/ 06 августа 2010

Шаблоны проектирования GoF - это использование проверенных шаблонов для решения типичных проблем с элегантным, поддерживаемым кодом. Они не нацелены на производительность.

Если вам нужны шаблоны для повышения производительности, вам, возможно, придется взглянуть на шаблоны архитектуры систем, алгоритмы, структуры данных и т. Д.

Что делает ваше приложение?

Если ваше приложение написано на C ++ и написано разумно, скорее всего, ваш код будет слепо быстро работать на современном оборудовании, пока ему не придется ждать ввода-вывода. Исключением может быть что-то вроде анализа изображений в режиме реального времени, который сильно загружает процессор.

Если производительность является проблемой, вы действительно имеете в виду производительность ввода-вывода? (диск, БД, сеть и т. д.)

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

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

0 голосов
/ 06 августа 2010

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

http://herbsutter.com/

0 голосов
/ 06 августа 2010

Шаблон проектирования действительно фокусируется на том, как вы структурируете код и определяете абстракцию класса и взаимодействие. Производительность вашей вычислительной производительности будет в основном зависеть от того, как вы пишете реальную реализацию кода (тело метода).

Для C ++ я определенно рекомендую прочитать книгу Скотта Мейерса о серии книг Effective C ++ и More Effective C ++, которая сама по себе действительно раскрывает многие идиомы написания высокопроизводительного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...