Предупреждения производительности
Предупреждения производительности поддерживают библиотеки и приложения, в которых требуется обеспечить высокую производительность.
В этом подразделе
Правило |
Описание |
---|---|
Повторяющиеся приведения снижают производительность, особенно если приведения выполняются в компактных операторах итераций. |
|
Сигнатура метода включает параметр, не использующийся в основной части метода. |
|
Поле объявляется статичным и доступным только для чтения (Shared и ReadOnly в Visual Basic) и инициализируется со значением, вычисляемым во время компиляции. Поскольку значение, присвоенное конечному полю, вычисляется во время компиляции, замените объявление полем const (Const в Visual Basic), чтобы значение вычислялось не во время выполнения, а во время компиляции. |
|
Неиспользуемые локальные переменные и ненужные присвоения увеличивают размер сборки и снижают производительность. |
|
Создается, но никогда не используется новый объект, либо вызывается метод, который создает и возвращает новую строку, и такая новая строка никогда не используется, либо метод COM или P/Invoke возвращает HRESULT или код ошибки, который никогда не используется. |
|
CA1809: избегайте чрезмерного использования локальных переменных |
Обычно для оптимизации производительности рекомендуется хранить значение не в памяти, а в регистре процессора. Это называется регистрацией значения. Чтобы повысить вероятность регистрации всех локальных переменных, следует ограничить их количество 64. |
CA1810: инициализируйте статические поля ссылочного типа встроенными средствами |
Если в типе объявляется явный статический конструктор, компилятор JIT добавляет проверку в каждый статический метод и конструктор экземпляров этого типа, чтобы убедиться, что статический конструктор уже вызывался ранее. Проверки статических конструкторов могут привести к снижению производительности. |
Закрытый или внутренний член (член уровня сборки) не вызывается ни объектами сборки, ни средой CLR, ни делегатом. |
|
Экземпляр типа уровня сборки не создается кодом в сборке. |
|
В библиотеке классов .NET Framework предоставляются методы для извлечения пользовательских атрибутов. По умолчанию эти методы осуществляют поиск иерархии наследования атрибутов. Если запечатать атрибут, поиск в иерархии наследования выполняться не будет, в результате чего может повыситься производительность. |
|
Массив массивов — это массив, элементы которого сами являются массивами. Массивы, которые составляют элементы, могут иметь различные размеры, что позволяет экономить пространство для некоторых наборов данных. |
|
CA1815: следует переопределять равенства и равенства операторов в типах значений |
В унаследованной реализации Equals для типов значений используется библиотека отражения и сравнивается содержимое всех полей. Отражение является процессом, требующим с точки зрения вычислений больших затрат, и сравнение каждого поля на равенство может быть лишним. Если предполагается, что пользователи будут сравнивать, сортировать экземпляры или использовать их в качестве ключей хэш-таблиц, тип значения должен реализовывать Equals. |
CA1816: вызов GC.SuppressFinalize должен осуществляться правильно |
Метод, являющийся реализацией Dispose, не вызывает GC.SuppressFinalize, либо метод, не являющийся реализацией Dispose, вызывает GC.SuppressFinalize, либо метод вызывает GC.SuppressFinalize и передает что-либо другое (Me в Visual Basic). |
Массивы, возвращаемые свойствами, не защищены от записи, даже если свойство доступно только для чтения. Чтобы защитить массив от изменений, свойство должно возвращать копию массива. Как правило, пользователи не понимают требований к производительности при вызове такого свойства. |
|
CA1820: проверьте наличие пустых строк путем проверки длины строки |
Сравнивать строки с использованием свойства String.Length или метода String.IsNullOrEmpty значительно быстрее, чем с помощью Equals. |
Если возможно, старайтесь не использовать финализаторы, поскольку из-за отслеживания жизненного срока объектов снижается производительность программы. Пустой метод завершения создает дополнительную нагрузку на систему, не обеспечивая никаких преимуществ. |
|
Члены, не обращающиеся к данным экземпляра и не вызывающие методы экземпляра, можно пометить как статические (Shared в Visual Basic). Если пометить методы как статические, компилятор предоставит этим членам невиртуальные места вызова. Это обеспечивает значительное повышение производительности при работе с кодом, для которого важна высокая производительность системы. |
|
Обнаружены закрытые поля, доступ к которым, судя по всему, не предоставляется в сборке. |
|
CA1824: следует помечать сборки атрибутом NeutralResourcesLanguageAttribute |
Атрибут NeutralResourcesLanguage сообщает ResourceManager о языке, используемом для отображения независящих от языка и региональных параметров ресурсов для сборки. При этом повышается эффективность поиска первого загружаемого ресурса и может сократиться рабочее множество. |