Подтвердить что ты не робот

Каковы наиболее важные рекомендации по оптимизации производительности в С#

Когда я читал этот учебник, я заметил следующее сообщение об использовании structs в С#:

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

Я искал аналогичный вопрос в stackoverflow, и я нашел несколько вопросов, которые говорят о лучших примерах производительности в ADO.Net, Networking, Streams, но не о лучших примерах производительности на С# (язык).

Я хочу добавить еще один совет об использовании целых типов:

Время выполнения оптимизирует производительность 32-битных целых типов (Int32 и UInt32), поэтому используйте эти типы для счетчики и другие часто используемые интегральные переменные.

4b9b3361

Ответ 1

Эрик Липперт много говорит об оптимизации. Я бы прочитал его blog.
Я также проверил Jon Skeet блог.

Ответ 2

Просто: профиль.

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

В большинстве случаев IO является точкой пинча, поэтому думать об IO - это не проблема. Достаточно доступ к БД. Но помимо этого: измерьте это.

Ответ 3

Ответ 4

Не используйте исключения в исключительных обстоятельствах.

Ответ 5

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

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

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

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

Ответ 6

Избегайте бокса и распаковки в циклах.

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

Ответ 7

Я могу назвать много оптимизаций производительности:

  • String.Format/StringBuilder для строковой манипуляции как строки неизменен.
  • Inherit IDisposable для написания собственного кода для удаления объектов, чтобы использовать оператор using позже.
  • Не устанавливайте локальные ссылки на null.
  • Не создавайте новое исключение во время броска. Используйте бросок, чем бросать ex
  • Поместите большие объекты как WeakReference, что делает его доступным для GC немедленно. http://www.abhisheksur.com/2010/07/garbage-collection-algorithm-with-use.html
  • Избегайте бокса/распаковки. Используйте Generics.

и т.д..

Ответ 8

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

Ответ 9

Если вы подписались на событие на объекте "A" из объекта "B", обязательно отмените подписку на события "B" в "A" перед изменением "B", иначе "B" никогда не сможет получить GC'd.

Ответ 10

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