Когда оптимизация действительно стоит времени, проведенного на нем?

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

Действительно ли стоит провести 4 часа, чтобы иметь запросы, которые на 20% более быстры? Да, нет, возможно, да, если...?

'Трата' 7 часов должна переключить задачу на другой язык для сохранения приблизительно 40% использования ЦП, 'стоящего того'?

Мое нормальное повторение для нового проекта:

  1. Поймите то, что клиент хочет, и в чем он нуждается;
  2. Запланируйте проект: какие языки и где, проектирование баз данных;
  3. Разработайте проект;
  4. Тест и исправление ошибки;
  5. Окончательный анализ рабочей и заключительной оптимизации проекта;
  6. Если проект требует его, дальнейший анализ реального использования ресурсов, сопровождаемых дальнейшей оптимизацией;

"Напишите хороший, удобный в сопровождении код", подразумевается.

Очевидно, большая часть 'оптимизации' происходит в точке № 2, но часто при рассмотрении кода после того, как проект по, я нахожу некоторые разделы, которые, даже если они делают свое задание хорошо, могли бы быть улучшены. Это - объяснение для точки № 5.

Для предоставления конкретного примера последней точки простой пример - когда я ожидаю, что 90% запросов будут SELECT и 10%, чтобы быть INSERT/UPDATE, таким образом, я обвиняю Таблицу базы данных в индексах. Но после 6 месяцев, я вижу, что в реальной жизни существует 10% SELECT запросы и 90% INSERT/UPDATEs, таким образом, скорость запроса не оптимизирована. Это - первый пример, который прибывает по моему мнению (и очевидно это - больше 'патч' к начальному неправильному дизайну, чем оптимизация ;).

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

Я имею в виду, я знаю, что, если я теряю 50 часов для получения 5% общего ускорения приложения, и приложение используется 10 пользователями, затем это, возможно, не стоит времени..., но что относительно того, когда это?

Когда Вы думаете, что оптимизация крайне важна?

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

Править: извините, но я не могу принять ответ как, 'непока люди не жалуются на идентификатор, оптимизация не нужна'; Это может быть бизнес-представление (сомнительный, по моему скромному мнению), но не разработчик или (по моему скромному мнению, также) ответ здравого смысла. Я знаю, этот вопрос действительно субъективен.

Я соглашаюсь с Cheeso, оптимизация производительности должна быть задержана, после некоторого анализа о реальном использовании и загрузке проекта, но small'n'quick оптимизация может быть сделана immediatly после того, как проект закончен.

Благодаря всем ;)

9
задан Community 23 May 2017 в 12:23
поделиться

9 ответов

Есть (как минимум) две категории «Эффективность», чтобы упомянуть здесь:

  • Applications ui (и их зависимости), где наиболее важной мерой является время отклика для пользователя .

  • Пакетная обработка, где основной индикатор представляет собой время работы .


В первом случае есть хорошо документированные правила о времени отклика . Если вы заботитесь о качестве продукта, вам необходимо сохранить время отклика. Чем короче, тем лучше, конечно, но очки разбития о:

  • 100 мс для «немедленного» ответа; Анимация и другие мероприятия «в реальном времени» должны произойти хотя бы это быстро;

  • 1 секунда для «бесперебойного» ответа. Больше, чем это и пользователи будут разочарованы; Вам также нужно начать думать о том, чтобы показать экран прогресса за этот момент.

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

Если вы обнаружите, что несколько операций занимают более 10 секунд, и вы можете исправить проблемы с производительностью со уровнем Sane совокупность усилий (я не думаю, что есть жесткий предел, но лично я «Я определенно что угодно, что по 1 человеческому месяцу и, вероятно, что-то в возрасте до 3-4 месяцев), то вы должны определенно приложите усилия, чтобы исправить его.

Точно так же, если вы окажетесь за ползучестью, что 1-секундное порог, вы должны быть очень трудно сделать его быстрее. Как минимум, сравните время, которое потребуется для улучшения производительности вашего приложения с моментом времени, когда он возьмет, чтобы повторить каждый медленный экран с диалоговыми окнами прогресса и фоновые потоки, которые пользователь может отменить - потому что это Ответственность в качестве дизайнера, чтобы обеспечить, если приложение слишком медленно.

Но не принимайте решение исключительно на этой основе - опыт пользователей тоже. Если он возьмет у вас 1 неделя, чтобы придерживаться диалогов Async Progress и 3 недели, чтобы получить время работы до 1 секунды, я все равно пошел с последним. ИМО, что-нибудь под человеком, является оправданным, если проблема широко используется; Если это только один отчет, который бежит относительно нечасто, я бы, наверное, позволил ему идти.

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


Теперь для второго случая, который я думаю, в основном самоочевидно. Если вы занимаетесь обработкой пакетной обработки, у вас обычно есть масштабируемость . Пока пакет может работать во времени, выделенные, вам не нужно его улучшать. Но если ваши данные растут, если пакет должен работать в течение ночи, и вы начнете видеть, что это ползет в Wee Way утром, и прерывая работу людей в 9:15, то ясно, что вам нужно работать над производительностью.

На самом деле, вы действительно не можете ждать этого долго; После того, как он не завершит в необходимое время, вы уже можете быть в больших неприятностях. Вы должны активно следить за ситуацией и поддерживать какую-то безопасность, - скажем максимальное время работы 5 часов из доступных 6, прежде чем начать беспокоиться.

Так что ответ на пакетные процессы очевидно. У вас есть трудно требование того, что BAST должен заканчиваться в течение определенного времени. Поэтому, если вы приближаетесь к краю, производительность должна быть улучшена, независимо от того, насколько сложно / дороготу. Затем вопрос становится , что является наиболее экономичным средством улучшения процесса?

, если он стоит значительно меньше, чтобы просто бросить еще несколько аппаратных средств по проблеме (и вы знаете, что проблема действительно делает Масштаб с аппаратным обеспечением), то не проводите в течение всего времени, просто купите новое оборудование. В противном случае выясните, какая комбинация оптимизации дизайна и аппаратных обновлений будет получать вам лучший ROI. Это почти чисто это решение в этот момент.


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

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

6
ответ дан 4 December 2019 в 10:32
поделиться

YAGNI. Если только люди не жалуются, много.


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

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

Я думаю, что это правильный подход.

7
ответ дан 4 December 2019 в 10:32
поделиться

Оптимизация того стоит, когда это необходимо.

Если мы пообещали время отклика клиента в поисках пакета праздничных пакетов, которые находятся на 5 секунд или меньше, и что система будет работать на одном сервере Oracle (каких-либо спецификаций), и поиски принимают 30 секунд при пиковой нагрузке, то Оптимизация определенно стоит того, потому что мы не собираемся платить иначе.

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

5
ответ дан 4 December 2019 в 10:32
поделиться

Хорошая публикация всех.

Вы смотрели на ненужное использование транзакций для простого выбора (ов)? Я сгорел на этом несколько раз ... Я также сделал какой-то очистку кода и обнаружил, что многие графики возвращаются, возможно, 10 записей необходимы ... ВКЛ. Вкл. ... Иногда это не ваш код сами по себе, но кто-то резка Углы .... Удачи!

1
ответ дан 4 December 2019 в 10:32
поделиться

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

Определение измеримых требований к производительности SLA с клиентом (т. Е. 95% запросов завершены в течение 2 секунд) рядом с началом проекта позволяет вам знать, если вы встречаете эту цель или если У вас больше оптимизации. Тестирование производительности в текущих и предполагаемых будущих нагрузках дает вам данные, которые вам нужно увидеть, если вы встречаетесь с SLA.

0
ответ дан 4 December 2019 в 10:32
поделиться

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

Также: Если он не сломан, не исправляйте его.

0
ответ дан 4 December 2019 в 10:32
поделиться

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

Подождите, пока вы начнете достигать предопределенного порога (80% использования - это та отметка, которую я обычно использую, другие думают, что это слишком высоко/низко), а затем оптимизируйте в этот момент, если это необходимо. Имейте в виду, что лучшим решением может быть увеличение или уменьшение масштаба, а не фактическая оптимизация программного обеспечения.

0
ответ дан 4 December 2019 в 10:32
поделиться

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

Обычно думать, что способ найти этот код , измеряя время, проведенное функциями , но на мой разум, который обеспечивает только подсказки - вам все еще нужно воспроизводить детектив. Что касается меня прямо к коду Stackshots . Вот пример 40-кратных ускорений, достигнутых, найдя и фиксируя несколько проблем. Другие на так сообщили о ускорении факторов от 7 до 60, достигнутые с небольшим усилием. *

* (7x: Комментарий 1 . 60x: Комментарий 30 .)

0
ответ дан 4 December 2019 в 10:32
поделиться

Частично достичь (1-уровня наследования) можно с помощью дженериков:

class PropertyBase<T>
{
    public static Type GetMyType() { return typeof (T); }
}

// the base class is actually a generic specialized by the derived class type
class ConcreteProperty : PropertyBase<ConcreteProperty> { /* more code here */ }

// t == typeof(ConcreteProperty)
var t = ConcreteProperty.GetMyType();
-121--1918133-

Бит подкласса не будет работать, поскольку статический метод привязан к типу. Это метод типа , а не метод экземпляра. Подтип не содержит статических методов базового типа, поскольку они являются различными типами и статический метод привязан к базовому типу. Даже если компилятор может позволить вызывать статический метод базового класса как через производный класс, он в действительности вызовет метод из базового класса. Это просто сахар из синтаксиса. По этой же причине невозможно «переопределить» статические методы в подклассах, поскольку это не имеет смысла.

-121--1918134-

Как все говорили в других ответах на вопросы, когда есть денежный смысл изменить что-то, то он нуждается в изменении. В большинстве случаев достаточно хорошо выигрывает день. Если клиенты не жалуются, то это достаточно хорошо. Если они жалуются, то исправьте это достаточно, чтобы они перестали жаловаться. Гибкие методологии дадут вам некоторые рекомендации о том, как знать, когда достаточно. Кого волнует, если что-то использует на 40% ЦП больше, чем вам кажется, это нужно, если это работает и клиенты довольны, то это достаточно хорошо. Действительно просто, получить его работает и ремонтопригоден, а затем ждать жалоб, которые, вероятно, никогда не придет.

Если бы то, что вас беспокоит, действительно было проблемой, НИКТО бы никогда не начал использовать Java для создания критически важных серверных приложений. Или Python, или Erlang, или что-то еще, что не является C в этом вопросе. И если бы они сделали это, ничего не было бы сделано в сроки, чтобы даже приобрести тот первый клиент, который вы так беспокоитесь о проигрыше. Вы будете знать заранее, что вы должны изменить что-то хорошо, прежде чем это станет проблемой.

1
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: