Каковы наиболее важные рекомендации по оптимизации производительности в С#
Когда я читал этот учебник, я заметил следующее сообщение об использовании structs в С#:
Если вам не нужен ссылочный тип семантика, класс, который меньше более 16 байт могут быть более эффективными обрабатывается системой как структурой.
Я искал аналогичный вопрос в stackoverflow, и я нашел несколько вопросов, которые говорят о лучших примерах производительности в ADO.Net, Networking, Streams, но не о лучших примерах производительности на С# (язык).
Я хочу добавить еще один совет об использовании целых типов:
Время выполнения оптимизирует производительность 32-битных целых типов (Int32 и UInt32), поэтому используйте эти типы для счетчики и другие часто используемые интегральные переменные.
Ответы
Ответ 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" ) и т.д.) при выполнении огромных операций. Я нашел значительные улучшения производительности при удалении таких операций, когда это возможно.