Поделиться через


Практическое руководство. Улучшение производительности

Обновлен: Ноябрь 2007

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

Чтобы сэкономить память при работе с Windows Forms и графикой

Чтобы сэкономить память при работе с данными и строками

  • Используйте целочисленные переменные (Int32 или Int64) в циклах for вместо объектных переменных.

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

  • Избегайте ошибок OutOfMemoryException. Это исключение может вызывать общеязыковая среда выполнения, когда выделяется недостаточно памяти для внутренних целей или новых экземпляров объектов. Чтобы избежать этого исключения, не программируйте большие методы, которые занимают 64 и больше килобайт в памяти.

  • Удалите файл System.SR.dll, который содержит строки сообщений об ошибках для диалоговых окон исключений. Для экономии памяти можно развернуть приложение без этого файла. .NET Compact Framework динамически загружает строки ошибок, содержащиеся в System.SR.dll, при наличии этого файла.

    Если этот файл DLL отсутствует в устройстве, все исключения содержат сообщение "Невозможно загрузить сборку ресурса". Во время разработки, однако, полезно добавить ссылку на файл System.SR.dll в проекте Visual Studio, чтобы отображались осмысленные исключения.

  • Строки относятся к постоянному типу, поэтому каждый раз при изменении строки создается новый объект String. Рассмотрите использование StringBuilder при создании строки, которая будет часто изменяться.

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

  • Ограничьте число открытых объектов SqlCeCommand и удалите их по завершении работы.

Чтобы сэкономить память при взаимодействии с машинным кодом

  • В операциях вызова неуправляемого кода используйте преобразуемые типы, которые имеют общее представление в управляемой и в неуправляемой памяти, такие как Int32 или IntPtr. Преобразуемые типы значений с размером больше 32 бита быстрее передаются по ссылке, чем по значению. Дополнительные сведения о преобразуемых типах см. в разделе Преобразуемые типы .NET Compact Framework.

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

  • Используйте методы в классе Marshal для ручного преобразования между IntPtr управляемыми объектами, такие как PtrToStructure, PtrToStringBSTR, GetObjectForNativeVariant и GetObjectForIUnknown.

  • Используйте методы Prelink и PrelinkAll, чтобы создать JIT-компиляцию заглушки, поддерживающей вызовы из машинного в управляемый код.

  • Если планируется в общем случае использовать собственный объект COM для возвращения S_FALSE или других значений не S_OK HRESULT, установите в поле PreserveSig значение true и обеспечьте совпадение управляемой и машинной подписи. Это позволит избежать затрат ресурсов для блока try/catch, который требуется, когда среда выполнения преобразовывает значения HRESULT в исключения в вызовах COM.

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

Чтобы сэкономить память в коллекциях

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

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

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

Чтобы сэкономить память в XML

  • Используйте XmlTextReader и XmlTextWriter вместо объекта XmlDocument, который использует больше памяти.

  • Укажите параметры для XmlReaderSettings и XmlWriterSettings, чтобы улучшить производительность. Значения свойств IgnoreWhitespace и IgnoreComments, если применимо, могут значительно улучшить производительность.

  • Используйте кодировки UTF-8, ASCII и UTF-16, которые являются более быстрыми, чем кодировки кодовой страницы Windows и ANSI.

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

  • Сопоставьте столбцы как атрибуты и используйте типизированные DataSet, если заполнение DataSet выполняется из источника XML.

  • При заполнении DataSet избегайте следующего:

    • Схемы вывода.

    • Вложенных таблиц.

    • Нескольких столбцов DateTime. Вместо этого для лучшей производительности используйте значение свойства Ticks.

  • Следующие рекомендации помогут улучшить производительность при использовании XML-десериализации.

    • Используйте, по возможности, более краткие имена элементов и атрибутов, так как каждый символ подлежит проверке.

    • XML-код на основе данных атрибута является более быстрым, чем XML-код на основе данных элемента.

    • Используйте метод XmlNodeReader.Skip, когда применимо.

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

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

  • Так как сериализация большого числа XML-данных может занимать много памяти, вместо этого рассмотрите возможность построения пользовательского механизма двоичной сериализации с использованием BinaryReader и BinaryWriter.

Чтобы сэкономить память при использовании веб-службы

  • Используйте DiffGram при чтении и записи DataSet. Дополнительные сведения см. в разделе Объекты DiffGram (ADO.NET).

  • Сохраните удаленный объект DataSet и его схему на устройство как XML.

  • Обеспечьте простой вызов метода веб-службы при отображении экранной заставки, так как первый вызов является более медленным, чем последующие.

  • Будьте внимательны при обработке сетевых ошибок и ошибок данных.

  • В некоторых случаях, ручная сериализация объекта DataSet как строки XML до выполнения вызова веб-службы улучшает производительность.

Чтобы сохранить память в расширенном программировании

  • Обрабатывайте большие операции асинхронно.

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

  • Используйте поля вместо свойств, где возможно.

  • Переопределите методы GetHashCode и Equals при определении типа значения. Если они не переопределены, среда выполнения использует обобщенные версии для этих методов в базовом классе ValueType.

  • Используйте отражение с осторожностью. Использование отражения в исследовательских целях с отсутствующими экземплярами классов может влиять на производительность созданных объектов в приложении.

  • Убедитесь, что управляемые ресурсы имеют полные и точные имена типов в файле RESX. Они должны иметь правильную версию и поля PublicKeyToken. Поиск наиболее подходящей подстановки для неверно указанного типа влияет на производительность.

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

См. также

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

Управление памятью устройства в платформе .NET Compact Framework

Разделы руководства по платформе .NET Compact Framework

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

Производительность и диагностика в .NET Compact Framework