Производительность (Руководство по программированию в C#)

Обновлен: Июль 2008

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

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

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

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

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

Упаковка–преобразование и распаковка–преобразование

Лучше всего избегать использования типов значений в случаях, когда они должны быть упакованы много раз, например в не универсальных классах коллекций, например, System.Collections.ArrayList. Упаковки-преобразования типов значений можно избежать с помощью универсальных коллекций, например, System.Collections.Generic.List<T>. Упаковка и распаковка являются процессами, требующими с точки зрения вычислений больших затрат. При упаковке типа значения должен быть создан совершенно новый объект. Это действие занимает на 20 минут больше времени, чем назначение простой ссылки. При распаковке процесс приведения может длиться в четыре раза дольше назначения. Дополнительные сведения см. в разделе Упаковка–преобразование и распаковка–преобразование.

Строки

При сцеплении большого количества строковых переменных, например, в непрерывном цикле, используйте System.Text.StringBuilder вместо C# оператора +. Дополнительные сведения см. в разделе Практическое руководство. Объединение нескольких строк (Руководство по программированию в C#).

Деструкторы

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

Другие ресурсы

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Безопасность (руководство по программированию на C#)

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Добавлены сведения к разделу об упаковке-преобразовании и распаковке-преобразовании.

Улучшение информации.

Июль 2008

Добавлен раздел о строках.

Улучшение информации.

Июль 2008

Добавлены сведения к введению.

Улучшение информации.