Практические правила для преждевременной оптимизации

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

Например, я видел, что все большее число людей говорит, что не стоит беспокоиться о сложности алгоритма, потому что это преждевременная оптимизация (например, справки, сортировка NSArray по двум свойствам (с помощью NSSortDescriptor?) ). Честно говоря, я думаю, что это просто лень, и это ужасно для дисциплинированной информатики.

Но мне пришло в голову, что, возможно, учитывая сложность и производительность алгоритмов, это путь разворачивания цикла сборки и другие методы оптимизации, которые теперь считаются ненужными.

Как вы думаете? Разве мы находимся сейчас, когда решение между алгоритмом сложности O (n ^ n) и O (n!) Не имеет значения? Что относительно O (n) против O (n * n)?

Что вы считаете «преждевременной оптимизацией»? Какие практические правила вы используете для осознанного или бессознательного избегания этого?

РЕДАКТИРОВАТЬ

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

Отвечая на это, вы должны сначала ответить на вопрос «что такое предварительная зрелая оптимизация?». Поскольку это определение явно сильно варьируется, любой значимый ответ требует от автора определения термина. Вот почему я действительно не думаю, что это вопрос CW. Опять же, если люди не согласятся, я изменю его.

Что такое преждевременная оптимизация?

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

Разве мы находимся сейчас, когда решение между алгоритмом сложности O (n ^ n) и O (n!) Не имеет значения? Что относительно O (n) против O (n * n)?

Это зависит от размера n и того, как часто ваш код будет вызван.

Если n всегда меньше 5, то асимптотическая производительность не имеет значения. В этом случае размер констант будет иметь большее значение. Простой алгоритм O (n * n) мог бы выполнить более сложный алгоритм O (n log n) для малых n. Или измеримое различие может быть настолько маленьким, что это не имеет значения.

Я все еще думаю, что слишком много людей, которые тратят время на оптимизацию 90% кода, который не имеет значения, а не 10%. Никто не заботится, если какой-то код занимает 10 мс вместо 1 мс, если этот код почти никогда не называется. Бывают моменты, когда просто делать что-то простое, что работает и движется дальше, является хорошим выбором, хотя вы знаете, что алгоритмическая сложность не оптимальна.

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

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

Поэтому независимо от того, насколько хорошо вы знаете алгоритмы и независимо от того, насколько хорошо вы написали свой код, вы не знаете, что еще происходит за пределами вашего модуля. Что вы называете API-интерфейсом за кулисами? Можете ли вы всегда утверждать, что конкретный порядок операций является самым быстрым?

Это то, что подразумевается под «Преждевременной оптимизацией». Все, что вы думаете, это оптимизация, которая не была тщательно протестирована с помощью профилировщика или другого окончательного инструмента (тактовые циклы с помощью ops – это не плохо, но это только говорит о характеристиках производительности. ~ Фактические вызовы важнее, чем время, обычно ), является преждевременной оптимизацией.

@k_b говорит, что это намного выше меня, и это то, что я тоже говорю. Сделайте все правильно, сделайте это простым, затем профиль, затем настройте. При необходимости повторите.

Порядок приоритета: 1. Он должен работать 2. Он должен быть обслуживаемым 3. Он должен быть машинным

Это было с первой недели моего первого курса программирования. В 1982 году .

«Преждевременная оптимизация» – это любое время. Приоритет 3 был рассмотрен до приоритета 1 или 2.

Обратите внимание, что современные методы программирования (абстракции и интерфейсы) предназначены для упрощения этой приоритизации.

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

Для некоторых людей оптимизация – часть удовольствия от написания кода, преждевременного или нет. Мне нравится оптимизировать и сдерживать себя ради удобочитаемости. Совет не оптимизировать так много для людей, которые любят оптимизировать.

В частности, программисты iphone, похоже, думают о том, чтобы избежать преждевременной оптимизации в качестве активной цели

Большинство iPhone-кода связаны с UI. Оптимизировать не нужно. Необходимо не выбирать плохой дизайн, который приведет к плохой производительности, но как только вы начнете кодировать хороший дизайн, мало нужно оптимизировать. Поэтому в этом контексте избежать оптимизации является разумной целью.

Что вы считаете «преждевременной оптимизацией»? Какие практические правила вы используете для осознанного или бессознательного избегания этого?

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

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

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

Иногда избегать преждевременной оптимизации может помочь дизайн, потому что, если вы разрабатываете идею о том, что вам нужно будет оптимизировать позже, тогда вы более склонны развиваться на абстрактном уровне (например, списке), а не на уровне iimplementation (например, Array или связанный список) ,

Это может привести к более простому и понятному коду в дополнение к тому, чтобы избежать отвлечения внимания. Если запрограммировано на интерфейс, различные варианты реализации могут быть заменены позже, чтобы optmize. Преждевременная оптимизация приводит к риску, что детали реализации могут быть преждевременно выставлены и объединены с другими программными компонентами, которые не должны видеть эти детали.

Какие практические правила вы используете для осознанного или бессознательного избегания этого?

Одним из способов избежать ненужной оптимизации является рассмотрение относительной экономической выгоды:

A) Стоимость программиста для оптимизации кода + стоимость для проверки указанной оптимизации + стоимость сохранения более сложного кода, полученного в результате указанной оптимизации

против

B) Стоимость обновления сервера, на котором выполняется программное обеспечение, или просто купить другой (если он масштабируется)

Если A >> B, подумайте, правильно ли это делать. [Игнорируя на данный момент экологические издержки B, которые могут или не могут быть причиной для вашей организации]

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

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

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

Я работал с решениями, в которых вызовы веб-сервисов были необходимы для вычисления новых значений на основе содержимого локального списка. То, как это было реализовано, – это сделать веб-запрос за значение. Не было бы преждевременной оптимизации отправлять несколько значений за раз. То же самое касается использования транзакций базы данных для нескольких операций, т. Е. Множественных вставок.

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

Interesting Posts

Что обычно лучше всего использовать – StringComparison.OrdinalIgnoreCase или StringComparison.InvariantCultureIgnoreCase?

Как применить class CSS к Html.ActionLink в ASP.NET MVC?

Ajax vs Socket.io

Android: Как определить ориентацию изображения (портретную или альбомную), выбранную из галереи при настройке изображения?

Как отключить перенос слов меньше

Как я могу рассматривать круг как элемент управления после его рисования? – Перемещение и выбор фигур

Как установить разрешения по умолчанию для автомонтированных дисков FAT в Ubuntu 9.10?

Частные методы в Objective-C, в Xcode 4.3 Мне больше не нужно объявлять их в моем файле реализации?

Что эквивалентно корню в Windows 8.1 и как я могу открыть оболочку в этом контексте?

Как определить, какой HD участвует в средстве просмотра событий?

std :: vector :: resize () vs. std :: vector :: reserve ()

Как удалить файл в папке с информацией об объеме тома на сервере Windows Server 2008

В чем разница между Thread.start () и Thread.run ()?

Как добавить пользовательские шрифты в приложение для iPhone?

Есть ли какое-либо событие, которое срабатывает при нажатии клавиш при редактировании ячейки?

Давайте будем гением компьютера.