В течение долгого времени в таких местах, как IRC-канал Java , SO и другие места, мне говорили что-то вроде «Беспокойся о том, как выглядит код, его читаемость / понятность сейчас и производительность позже, если это абсолютно необходимо». Так что в течение долгого времени я не особо задумывался над производительностью своих небольших настольных или веб-приложений, а просто убирал явно неэффективные.
Большинство ответов «А как насчет масштабируемости?». Это законный вопрос, но если мое приложение было создано только для анализа, скажем, файлов длиной 10 000 строк, должен ли я сделать мой код беспорядочным для небольшого процента людей, которые собираются запихнуть в файл с 1 000 000 строк?
Мой главный вопрос заключается в том, когда мне следует торговать простыми, но несколько неэффективными способами выполнения задач для больших гигантских сложных животных, которые делают вещи очень быстро, но разрушают любые возможные способы обновления и делают код чрезмерно трудным и склонным к переписыванию в любом случае следующим разработчиком?
источник
Обычно это ложная дихотомия . Вы можете написать удивительно эффективный, читаемый и поддерживаемый код. Вы можете написать удивительно неэффективные, неразрешимые груды беспорядка.
Имея дело с проблемами производительности, я обычно стараюсь думать о бизнес-проблеме, которую решаю. Как будет вести себя мое программное обеспечение, когда его используют мои клиенты. Будет ли производительность моих приложений радовать Джейкоба Нильсена ?
источник
Я уловил трюизм, изучая микропроцессоры в колледже: «Сделай общий случай быстрым. Сделай необычный случай правильным».
Пока у вас есть небольшой процент пользователей, которые душат ваш код вводом на два порядка больше, чем предполагалось, не переживайте. Удостоверьтесь, что он обрабатывает ввод правильно, если они дают его достаточно долго, и не оставляет ничего испорченного в бесполезном, если он убивает задание до его завершения.
Но все больше и больше людей начинают использовать его таким образом (или начинают говорить вам: «Знаете, мне бы очень хотелось использовать тот инструмент, который вы написали в моих еженедельных отчетах TPS, но это занимает весь день»), вот когда Вы начинаете задумываться об упрощении обслуживания для повышения производительности.
источник
«Беспокойство о том, как выглядит код и его читаемость / понятность сейчас, а также производительность позже, если это абсолютно необходимо» - это простой выход, который, как правило, бесполезен. хороший дизайн будет легко поддерживать, легко читать и эффективно.
производительность является одним из распространенных компонентов хорошего дизайна. если ваша программа медленная и расточительная, ее нельзя использовать повторно. когда вам нужно исправить , что беспорядок, вы принудительно обновляете своих клиентов, если только для их обновления не требуется слишком много времени. эта медленная программа превращается в большой беспорядок, который слишком дорог, чтобы его улучшать. затем они выбирают альтернативу, потому что она не соответствует их потребностям. диагностика, обновление и устранение побочных эффектов улучшений плохого проекта часто перевешивают начальное время разработки, чтобы написать его, чтобы оно было эффективным, работало правильно и имело хороший в целом дизайн. эта программа имеет многократное использование и требует минимального обслуживания (победа).
Итак, краткий ответ на ваш вопрос: «Не будьте расточительными. Пишите для повторного использования. Хорошо бы лениться при создании прототипа / разработке проверок концепций, но не используйте этот прототип для производственного кода».
будьте внимательны и избегайте расточительных планов при написании производственных программ и программ, которые вы намерены использовать повторно. во время реализации идеальное время для написания вашей программы, чтобы не быть расточительным - у вас есть четкое представление о деталях и ее работе, и это действительно больно и неэффективно исправлять после того, как она написана. многие люди считают, что небольшое профилирование (возможно) в конце или, если есть проблема, является адекватным, когда обычно слишком много времени занимает редизайн / изменение, а неэффективность настолько велика и настолько распространена, что вы не понимаете программу хорошо на основе результатов профиля. этот подход занимает мало времени во время реализации и (при условии, что вы сделали это достаточно много раз), как правило, приводит к тому, что дизайн в несколько раз быстрее, и его можно использовать во многих других контекстах. не расточительный, выбор хороших алгоритмов, продумывание ваших реализаций и повторное использование правильных реализаций - все это компоненты хорошего дизайна; все из которыхулучшает читабельность, удобство обслуживания и повторное использование чаще, чем вредит.
источник
Я пытаюсь сделать код читабельным - производительность будет проклята.
Когда и если код окажется слишком медленным, я сделаю его более быстрым. Обычно процесс рефакторинга сопровождается большим количеством комментариев, поскольку код имеет тенденцию быть менее читабельным.
источник
Гм - Никогда?
Серьезно, код всегда должен быть написан так, чтобы его было легко понять и поддерживать.
Что касается того, когда решать проблемы с производительностью, разбирайтесь с ними, как только вы их идентифицируете, не оптимизируйте свой код заранее, потому что тогда вы просто будете гадать, где проблемы с производительностью.
Если ваш код написан так, чтобы быть ясным, лаконичным, понятным и понятным, у вас или другого программиста не должно возникнуть проблем с рефакторингом кода, чтобы сделать его более эффективным.
источник
Я обычно пишу код, чтобы быть читаемым в первую очередь. Если и только если я обнаружу, что программа работает слишком медленно, чтобы выполнить свою работу, я могу профилировать и оптимизировать. Тем не менее, нет ничего плохого в том, чтобы привыкнуть выполнять обычные оптимизации, которые не влияют на читабельность вашего кода. То есть, если фрагмент кода может быть написан двумя одинаково (или почти одинаково) читаемыми способами, выберите тот, который обычно быстрее.
Например, в Python списки (или выражения-генераторы), как правило
for
, работают быстрее, чем эквивалентный цикл, поэтому я использую списки, когда могу, если они не влияют на читаемость (например, я не вкладываю списки, если Я могу избежать этого и использовать вместо этого цикл for, потому что сложный анализ вложенного списка может быть сложным для умственного анализа).Точно так же неизменяемые типы данных, как правило, работают быстрее, чем изменяемые, поэтому я использую неизменные типы данных, где могу.
источник
Если вы работаете в действительно критичных для производительности областях, то вы не можете откладывать эффективность в качестве запоздалой мысли. Это одна из самых важных вещей, о которой следует подумать при раннем проектировании в тех случаях и способами, которые связаны с ремонтопригодностью конечного результата.
Вы не можете спроектировать и внедрить крупномасштабный сервер и просто начать писать простой, хорошо документированный код, который просто использует функции блокировки для всего с глобальной блокировкой потоков, которая блокирует всю систему для обработки каждого отдельного клиентского запроса, не помещая никаких мысли вообще в общее состояние, спор нити и асинхронность. Таков рецепт катастрофы и необходимость переделывать и переписывать основную часть хорошо документированного кода, который вы написали таким образом, который может привести к созданию наиболее сложной в обслуживании кодовой базы, которую можно себе представить, из-за гонок и тупиков в результате попыток чтобы достичь требуемой эффективности в ретроспективе, а не просто подумать об эффективных, простых, работающих проектах заранее.
Команда разработчиков игр уже 8 месяцев работает с двигателем, который работает на скорости 2 кадра в секунду на самом мощном оборудовании с 32 ядрами, и имеет тенденцию останавливаться на 15 секунд каждый раз, когда экран загружается, вряд ли сразу получит продукт, который можно использовать, просто исправление одной маленькой локализованной точки доступа. Скорее всего, их дизайн FUBAR таким образом, что гарантирует эпическое пересмотр чертежной доски и изменения дизайна, которые могут каскадно войти в каждый угол кодовой базы.
С Джоном Кармаком он однажды рассказал о том, как техническая демонстрация должна работать с минимальной скоростью от сотен до тысяч кадров в секунду, чтобы интегрировать ее в производство. Это не нездоровая одержимость эффективностью. Он заранее знает, что игры должны запускаться со скоростью более 30 FPS, чтобы покупатели находили это приемлемым. В результате один маленький аспект, такой как система мягких теней, не может работать со скоростью 30 FPS, иначе игра в целом не может быть достаточно быстрой, чтобы обеспечить необходимую обратную связь в реальном времени. Это непригоден до тех пор, пока не достигнет необходимой эффективности. В таких критически важных для производительности областях, где существует фундаментальное требование к эффективности, решение, которое не может достичь достаточной скорости, на самом деле не лучше, чем решение, которое вообще не работает, поскольку оба полностью, И вы не можете спроектировать эффективную систему мягких теней, которая будет работать с сотнями и тысячами кадров в секунду, как это требуется для игрового движка реального времени, если вы не будете заранее думать о ее эффективности. На самом деле, в таких случаях 90 +% работы ориентированы на эффективность, поскольку тривиально создать систему с мягкими тенями, которая прекрасно работает при 2 часах на кадр, используя трассировку пути, но вы не можете ожидать ее настройки. чтобы работать с сотнями кадров в секунду без совершенно другого изменения подхода.
Когда эффективность является фундаментальной частью дизайна приложения, вы не можете ожидать, что вы достигнете эффективности в ретроспективе, не теряя значительно больше времени, чем сэкономили, игнорируя его, поскольку вы не можете ожидать, что получите работающий дизайн в ретроспективе. Никто не говорит: « Можно отложить мысль о дизайне на потом. Просто хорошо документируйте свой код, и вы сможете придумать правильный дизайн позже». ». Но в архитектурах, критически важных для производительности, это то, что вы делаете эффективно, если вы не уделяете много внимания и заранее продумываете эффективные проекты.
Теперь это не значит, что вам нужно сразу же настраивать свои реализации. Что касается деталей реализации, то есть много возможностей перейти к более быстрым решениям после измерения при условии, что дизайн не нужно будет менять, и часто это наиболее продуктивный способ решения этой задачи. Но на уровне дизайна это означает, что вы должны задуматься о том, как дизайн и архитектура будут с самого начала относиться к эффективности.
Ключевое отличие здесь дизайн, Оглядываясь назад, нелегко вносить большие изменения в проекты, так как проекты накапливают зависимости, и зависимости изменяются при изменении дизайна. И если дизайн требует разумной эффективности или, в некоторых случаях, что его качество в значительной степени измеряется его эффективностью, то не стоит ожидать, что вы сможете добиться правильного дизайна в качестве запоздалой мысли. С любой конкурирующей продукцией, где эффективность является огромным аспектом качества, будь то операционные системы или компиляторы, видеопроцессоры, raytracers, игровые движки или физические движки, мысли об эффективности и представлении данных тщательно продумывались с самого начала. И в этих случаях это не преждевременная оптимизация, чтобы заранее задуматься об эффективности. Именно такая мысль была поставлена в самое продуктивное время,
источник