Должно ли программное обеспечение разрабатываться с учетом производительности?
Целесообразно ли устанавливать нуль при разработке компонента или архитектуры программного обеспечения с учетом производительности? Я имею в виду, насколько готов дизайн/архитектура использовать в среде с высокой интенсивностью работы?
При разработке компонентов мы должны просто следовать хорошим принципам OO и просто обеспечить, чтобы компонент был "расширяемым". Таким образом, мы немного настраиваем дизайн и немного там, когда и когда сталкиваемся с проблемами производительности. Несмотря на это, мы часто сталкиваемся с проблемами производительности, когда программное обеспечение для настройки немного не поможет.
В качестве альтернативы, если мы придумаем дизайн, хотя и сложный, это вызовет проблемы производительности. Нам все равно нужно настроить программное обеспечение, но настройка очень проста, так как дизайн ориентирован на производительность.
Примечание. В обоих случаях, перечисленных выше, я пытаюсь настроить производительность программного обеспечения перед тем, как приступить к проблемам производительности. Чтобы повторно сформулировать вопрос, должен ли дизайн программного обеспечения ориентироваться на производительность?
Пожалуйста, не отвечайте мне, говоря, что все зависит от среды, в которой ожидается запуск программного обеспечения. Причина заключается в том, что клиенты любого программного обеспечения промышленного класса, похоже, все больше и больше хотят все больше и больше. Вы не можете постоянно планировать свое программное обеспечение в условиях высокой производительности, но что делать, если это необходимо? Должны ли мы затем перепроектировать программное обеспечение, когда мы это чувствуем?
Этот вопрос беспокоил меня с недели, и у меня пока нет ответа. Каково ваше отношение к этому?
Ответы
Ответ 1
Когда я пишу это, два человека уже ответили цитатой Кнута о преждевременной оптимизации. Я думаю, что это несколько вводит в заблуждение. Думаю, что за этим и за советом по этой теме мне кажется, что программа представляет собой набор алгоритмов, и если она недостаточно эффективна, мы можем определить, какой из алгоритмов слишком медленный, и заменить что-то лучше.
Этот вид игнорирует взаимосвязь программы. Все алгоритмы скрыты за некоторыми API. Хотя "видение" заключается в том, что алгоритм, лежащий в основе API, непрозрачен и взаимозаменяем с другим, он игнорирует ограничения, установленные API для вызывающего. Я проделал определенную долю сетевого программирования, и там легко писать неэффективное программное обеспечение, создавая API, которые просто не могут работать эффективно, и что вы делаете, когда вам приходится делать фундаментальные изменения в API, который используется повсюду? (В сетевом программировании API, который требует, чтобы вызывающий абонент создавал полное сообщение в памяти, легче разрабатывать и реализовывать, чем тот, который позволяет, например, передавать потоковые данные.)
Итак, не поддавайтесь упрощенным и содержательным цитатам. Вы не должны потеть мелкие вещи (и особенно не беспокойтесь о том, что делали люди в 70-х годах, компиляторы сейчас намного умнее), но полностью игнорируют проблемы с производительностью с отношением "Мы всегда можем профилировать и улучшать вещи позже при необходимости" может привести вас в тупик, где вам нужно выполнить значительную повторную реализацию.
О, и я бы также посоветовал "разработать для расширяемости". Делайте простейшую вещь, которая работает, и если вы позже обнаружите, что обобщение чего-то, что у вас упрощает или упрощает, сделайте это. По моему опыту, поиск ненужного общего дизайна приводит только к более сложному в использовании компоненту, который часто на самом деле не очень расширяем, поскольку первоначальный дизайн не может фактически предвидеть, какие вещи компонент должен делать в общем случае и как.
Ответ 2
Проект проекта должен сбалансировать расширяемость, ремонтопригодность, производительность, время доставки и многое другое.
Я пытаюсь разработать пакет + диаграммы высокого уровня для расширяемости, а затем сконструировать низкоуровневую производительность.
Ответ 3
Я бы сказал, что вы идете с хорошими объектно-ориентированными принципами, пока вы не знаете с самого начала, что каждая маленькая производительность будет иметь значение.
Большие выигрыши в производительности в целом достигаются с помощью алгоритмической оптимизации, а не для реструктуризации архитектуры (при условии, что архитектура соответствует обычной лучшей практике). Вид производительности, который вы получаете от выбора более сложного в дизайне, чаще всего не имеет значения во всех, кроме самых требовательных к производительности средах, поэтому, если абсолютная максимальная производительность не является требованием с самого начала, идите с хорошим OO.
Ответ 4
Я бы сказал, что это то, что отличает опытного инженера по программному обеспечению и новичка программного обеспечения.
Опытный инженер-программист должен всегда иметь в виду проблемы с производительностью его дизайна.
Пример. Когда у вас есть алгоритм с поведением производительности O (n ^ 3) внутри вашего модуля с возможным увеличением n, может возникнуть ситуация, что ваш модуль станет очень медленным в обстоятельствах.
Конечно, есть много различий. Когда у вас есть O (n ^ 3) в массиве в памяти, он может быть менее проблематичным как O (n ^ 2) на операции с диском.
Итак, опыт очень важен, чтобы думать об этих вещах и решать, где дизайн должен быть изменен или где последующая настройка может сделать это быстрее без проблем.
Ответ 5
Я должен ответить всем своим сердцем.
Котировка Knuth несколько не применима в реальной жизни за пределами небольшой области проблем, которые не связаны с архитектурой.
В качестве примера мне недавно пришлось потратить 3-4 месяца на повторное архивирование с нуля довольно привлекательной системы, потому что в первоначальном проекте предполагалось, что 100% данных будут загружены в один фрагмент из базы данных. Это было прекрасно в течение 3 лет, пока набор данных не вырос до ~ 100x от того, что ожидал первоначальный дизайнер, и система начала чередоваться между простое изъятие памяти при использовании 2G или сбоем ужасно.
Теперь решение было концептуально простым - разрешить извлечение данных из БД партиями.
Делать это разумно сработало. Но то, что могло быть дополнительными парами недель работы на первоначальном этапе проектирования, если бы они потрудились думать о производительности, превращенной в трехмесячное испытание, потому что каждая маленькая функция, объект и API, а также общая архитектура были явно написаны, чтобы предположить, что "100% данные есть".
В общем, любая ситуация, когда объем данных является проблемой производительности, и разделение данных является основным возможным решением, что chunking ДОЛЖЕН быть разработан для предварительного использования.
Ответ 6
Хорошо спроектированное программное обеспечение, которое следует за передовыми методами ООП, широко использует шаблоны проектирования или должно быть в принципе хорошо поддерживаемым. В настоящее время очень редко, что оптимизация на низком уровне имеет реальную роль, CPU и ресурсы довольно переполнены.
Просто код многоразовый, поддерживаемый и масштабируемый. Дальнейшие реальные потребности для оптимизации низкого уровня будут легко реализованы в такой хорошей среде. Только когда это действительно необходимо, только когда настанет момент позаботиться об этой проблеме.
Ответ 7
Как сказал Гетц: Write Dumb Code: http://java.sun.com/developer/technicalArticles/Interviews/devinsight_1/
Ответ 8
Вы всегда должны стремиться к эффективности над неэффективностью, но не ценой ремонтопригодности. Так что да, вы должны попытаться разработать эффективность, но будьте осторожны с преждевременной оптимизацией. Любимая цитата Дональда Кнута:
"Мы должны забыть о небольшой эффективности, скажем, около 97% времени: преждевременная оптимизация - корень всего зла".
Ответ 9
Практически в зависимости от этого, я думаю, вам действительно нужно принять во внимание то, что ваши требования. Если один из требований с наивысшим приоритетом "должен быть способен поддерживать некоторый сумасшедший уровень пропускной способности/производительности", тогда вы были бы сумасшедшими, чтобы не планировать и не проектировать этот фронт в общей архитектуре и выборе технологий.
Ответ 10
Мне интересно, что только Микаэль Ауно упомянул слово "требование".
В то время как цитата Кнута TRVTH, все сводится к требованиям. Является ли масштабируемость одним из них? Какова ожидаемая нагрузка? Если ваш ответ "Я не знаю", спросить.
Если это требования, добавьте тестирование нагрузки к вашим приемочным испытаниям.
Вы все еще хотите спроектировать для ремонтопригодности. Отложите соображения производительности на Last Responsible Moment, затем профиль - не угадывайте. Микро-оптимизация - это трата денег компании.
Иногда ответственный момент происходит довольно рано; Я не собираюсь создавать корпоративную CRM-систему, где все данные хранятся как файлы XML на диске. То, что я am будет делать, - это абстрактный уровень сохранения.
В конце концов комментарий Колибри верен - ответ (как обычно) - "это зависит".
РЕДАКТОР: При повторном чтении, боюсь, я нарушил ограничение OP: "Пожалуйста, не отвечайте мне, говоря, что все зависит от среды, в которой ожидается запуск программного обеспечения". Однако я согласен с ответом. Если (когда) требования меняются, простой дизайн, как правило, легче модифицировать. Неустановленное предположение состоит в том, что мы заранее знаем , как требования будут меняться. Запрос может быть "сделать его масштабным на порядок" или "разрешить перемещение клиента между организациями". Архитектура для первого может сделать последнее сложнее реализовать.
Ответ 11
Не делайте никаких оптимизаций заранее. Но АРХИТЕКТУРА оказывает огромное влияние на потенциальную производительность системы.
Я предлагаю исправить следующую книгу: Отпустите это!: Разработайте и разверните готовое программное обеспечение