Какую оптимизацию можно делать сразу?

Одна из самых распространенных мантр в области информатики и программирования - никогда не оптимизировать преждевременно, а это значит, что вам не следует оптимизировать что-либо, пока не будет выявлена ​​проблема, поскольку вероятность чтения/ремонтопригодности кода, вероятно, пострадает.

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Что искать:

  • Математические формулы, а не итерация.
  • Шаблоны, которые хорошо известны и документированы.
  • Существующий код/​​компоненты

Ответ 4

ИМХО, нет. Напишите свой код, не задумываясь о "оптимизации". Вместо этого подумайте "ясность", "правильность", "ремонтопригодность" и "проверяемость".

Ответ 5

Из Википедии:

Мы должны забыть о небольших эффективности, скажем, около 97% время: преждевременная оптимизация - это корень всех зол. Но мы не должны пропустите наши возможности в этом критические 3%.  - Дональд Кнут

Думаю, это подводит итог. Вопрос заключается в том, что вы знаете, что у вас 3%, и какой маршрут взять. Лично я игнорирую большинство оптимизаций, пока я, по крайней мере, не получу свой код. Обычно, как отдельный проход с профилировщиком, поэтому я могу убедиться, что я оптимизирую вещи, которые на самом деле имеют значение. Часто код просто работает достаточно быстро, чтобы все, что вы делаете, мало или вообще не имело эффекта.

Ответ 6

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

Ответ 7

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

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

Ответ 8

Documentation

Документирование вашего кода - это оптимизация №1 (процесса разработки), которую вы можете делать прямо с самого начала. По мере роста проектов, чем больше людей вы взаимодействуете, тем больше людей должны понимать, что вы написали, тем больше времени вы потратите

Toolkits

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

Complilers

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

Оптимизация системы

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

Алгоритмы

Стремитесь сделать алгоритмы доступа O (1) или O (Log N). Стремитесь сделать итерацию по списку не более O (N). Если вы имеете дело с большими объемами данных, избегайте чего-либо большего, чем O (N ^ 2), если это вообще возможно.

Трюки кода

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

Ответ 9

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

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

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

"Злая" часть оптимизации - это "грехи", которые совершаются во имя создания чего-то более быстрого - эти грехи обычно приводят к тому, что код очень трудно понять. Я не на 100% уверен, что это один из них.. но посмотрите этот вопрос здесь, это может быть или не быть примером оптимизации (может быть, человек думал сделать это), но есть более очевидные пути решения проблемы, чем то, что было выбрано.

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

Случай, который я делал, это использование файлов с отображением памяти -vs-stream I/O... файл с отображением памяти был значительно быстрее, чем с другим, поэтому меня не беспокоило, было ли сложнее выполнить код ( это не было), потому что скорость была значительной.

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

Ответ 10

В дополнение к тому, чтобы быть понятным и понятным, вам также необходимо потратить достаточное количество времени на правильное внедрение кода. Если вам понадобится день, чтобы заставить код работать правильно, вместо двух часов, которые потребовались бы, если бы вы только что его записали, то вы, возможно, потратили время, потраченное на исправление реальной проблемы с производительностью ( Knuth 3%).

Ответ 11

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

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

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

Конечно, в этом миксе нельзя забывать о требованиях. Существуют неявные требования к производительности, которые необходимо учитывать при проектировании. Для разработки веб-сайта, ориентированного на общественность, часто требуется, чтобы вы сокращали поездки на стороне сервера, чтобы обеспечить "высокую производительность" для конечного пользователя. Это не означает, что вы перестраиваете DOM в браузере при каждом действии и перерисовываете то же самое (я видел это на самом деле), но вы перестраиваете часть DOM и позволяете обозревателю делать остальное (что был обработан разумным дизайнером, который понимал неявные требования).

Ответ 12

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

Ответ 13

Не вызывайте Collection.ElementCount непосредственно в выражении проверки цикла, если вы точно знаете, что это значение будет рассчитано для каждого прохода.

Вместо:

for (int i = 0; i < myArray.Count; ++i)
{
    // Do something
}

делать:

int elementCount = myArray.Count;
for (int i = 0; i < elementCount ; ++i)
{
    // Do something
}

Классический случай.

Конечно, вы должны знать, какая это коллекция (на самом деле, как реализовано свойство/метод Count). Может не быть дорогостоящим.