2009-02-12 3 views
7

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

ответ

15

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

Хотя «оптимизация» имеет тот же корень, что и «оптимальный», процесс оптимизации не дает полностью оптимальной системы: всегда есть компромисс, поэтому оптимизируются только самые интересные интересы.

И помните:

Первое правило оптимизации программы: Не делайте этого. Второе правило оптимизации программ (только для экспертов!): Не делайте этого еще. (Michael A. Jackson)

+3

+1, но я ненавижу эту цитату Джексона. В основном это говорит, что молитесь, чтобы вы разработали систему исполнителей, а если нет, отложите необходимые исправления до последнего момента. ИМО, рецепт катастрофы. Я бы просто сказал, что понимаю ваши требования к производительности и развивается соответствующим образом. –

+1

Я предпочитаю цитату Дональда Кнута: «Мы должны забыть о небольшой эффективности, скажем, около 97% времени: преждевременная оптимизация - это корень всего зла, но мы не должны упускать наши возможности в этих критических 3%». Эта критическая 3% является особенно важной (и часто игнорируемой) частью этой цитаты. Это низкие висячие фрукты. Иногда самые большие выигрыши могут быть реализованы с минимальными усилиями. Вам просто нужно потратить немного времени на измерение и анализ, чтобы найти эти узкие места. –

-3

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

+0

Я думаю, что это называется рефакторинг. Это не совсем то же самое. –

3

Оптимизация кода ускоряет выполнение кода. Существует два основных способа сделать это:

1) Сжатие больше работы в меньшие циклы. Выясните, где код выполняет дополнительную копию, или если есть ветка в узком цикле. Это оптимизация в малом.

2) Улучшение ваших алгоритмов. Возможно, вы слышали о записи «Big O». Это приводит к значительному снижению алгоритма с большими наборами данных.

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

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

+0

Я бы расширил «работает быстрее», чтобы «потреблять меньше ресурсов». – peterchen

+0

Это полезно, но больше объяснений будет оценено Из телефонной книги. Предположим, у меня есть тысячи имен, и у каждого имени есть один или несколько телефонов, в поисках каждого имени со всеми его телефонами. Должен зацикливаться на каждое имя и выбирать его телефон. Где оптимизировать здесь. Как применять Big O. –

+0

Я склонен согласиться с Питером Ченом, что основным ресурсом, который сегодня исчерпан, является не циклы ЦП. IMO - это пропускная способность сети, следовательно, все усилия по оптимизации AV-кодеков и т. Д. ... –

5

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

В вашем случае в основном относится к 2-х уровнях:

уровень дизайна

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

уровень Исходный код

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

1

Чтобы добавить ответ Антона Гоголева, когда часть кода нуждается в оптимизации, это связано с тем, что определенное требование к производительности не выполняется. Мы разрабатываем программы для удовлетворения требований пользователей, не так ли? Большинство программистов склонны думать в основном о функциональных требованиях, то есть о том, что делает программа, но у пользователей также будут требования к производительности, какова стоимость ресурсов (пропускная способность сети, циклы ЦП, память, дисковое пространство и т. Д.) Предоставления функциональность. Оптимизация - это процесс изменения части кода для удовлетворения конкретных требований к производительности. ИМХО это должно произойти во время разработки, но иногда вы будете писать фрагмент кода, чтобы обнаружить, что он хуже. Чтобы оптимизировать код, сначала нужно выяснить, какой ресурс вы используете. Если это циклы CPU или память, может помочь профилировщик. Если это пропускная способность сети, которая является очень распространенной в наши дни, вам нужно будет выполнить некоторое нагрузочное тестирование и профилирование комм.

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

1

Оптимизация имеет две основные цели:

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

  • получение вашего программного обеспечения более ремонтопригодным, путем его рефакторинга.

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

3

При оптимизации кода вы берете метрику на свой код и пытаетесь сделать ее более эффективной. Метрика обычно относится к скудному ресурсу.

Вот общие показатели

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

После оптимизации кода должен дать тот же результат.

Проблема в том, что вам нужно сделать выбор. Скорость выполнения часто приходит с большим объемом памяти ...

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

Смежные вопросы