Использование памяти и немного о производительности

Posted on Декабрь 25, 2010

7


Привет Всем!

Не один раз, программисты «старой закалки» говорили о том, что современное поколение совершенно не умеет программировать, ведь когда они обучались этому делу, работа программ просчитывалась с точностью до байтов. А мы? При нынешних возможностях ПК, практически никто из программистов не задумывается о том, сколько же памяти кушает его программа. А тем более, этому не учат в университете (Разве что один-два преподавателя по Си, «Старой закалки») и никто не думает учить этому для применения в новых технологиях.

Проблема является очень актуальной, особенно для мобильных устройств. Почему, спросите вы? Ведь мобильные устройства в разы превосходят те же старые компьютеры! Только вот превосходить — они превосходят, но с учетом размаха души дизайнеров и программистов, приложение может получиться не самым легким. Да и часто бывает необходимо сделать быстрое приложение… Все это приводит нас к вопросу: Как же следить за состоянием памяти на Windows Phone 7 и что следует знать о производительности.

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

Немного о памяти

using Microsoft.Phone.Info.DeviceExtendedProperties;

Этот класс необходимо использовать для того, что бы получить значения свойств, таких как производитель, имя, уникальный ай ди, и тех, которые нам необходимы: total memory и current и peak memory usage.

DeviceTotalMemory A long integer. The device’s physical RAM size in bytes. This value will be less than the actual amount of device memory, but can be used for determining memory consumption requirements.
ApplicationCurrentMemoryUsage A long integer. The current application’s memory usage in bytes.
ApplicationPeakMemoryUsage A long integer. The current application’s peak memory usage in bytes.

Данные о классе можно посмотреть тут. Теперь попробуем все же получить значения:

const string total = "DeviceTotalMemory";
сonst string current = "ApplicationCurrentMemoryUsage";
const string peak = "ApplicationPeakMemoryUsage";

var totalBytes =
(long)DeviceExtendedProperties.GetValue(total);
var currentBytes =
(long)DeviceExtendedProperties.GetValue(current);
var peakBytes =
(long)DeviceExtendedProperties.GetValue(peak);

Выведем эти значения куда-то и увидим магические цифры. Если не очень хочется мучать себя, то можно скачать готовое решение (в виде dll), подключить ее к проекту и написать одну строку где-то в конструкторе страницы:

dnp.Counter.EnableMemoryCounter = true;

Запустив приложение, мы увидим:

Первое значение это total memory, второе current и третье peak memory usage.

Заметьте, необходимо скрыть System Tray, что бы увидеть значения.

С тем как посмотреть на память, мы закончили, теперь немного о том, как же на нее повлиять.

Производительность

Итак, поговорим о том, как можно повлиять на производительность вашего Silverlight приложения для Windows Phone 7. Немного советов об Изображениях, сокрытии элементов и запуске приложения.

Согласно документации устройство с Windows Phone имеет ограниченный CPU (central processing unit) и GPU (graphics processing unit) в сравнении с десктопом или ноутбуком. Для оптимизации производительности приложений были сделанны некоторые изменения в то, как Silverlight обрабатывает графику и другие объекты. Несмотря на оптимизацию Silverlight под Windows Phone 7, существует несколько вещей, которые вы можете сделать для того, что бы лучше использовать CPU и GPU.

С другой стороны, WP7 Application Certification Requirements гласят:

5.2 Performance and Resource Management
5.2.1 Launch Time
a. The application must render the first screen within 5 seconds after launch.
The application may provide a splash screen image in a file called SplashScreenImage.jpg in the root of the XAP package while the application is still trying to load.  However, the first application screen must be rendered within the 5 second requirement even when there is a splash screen.
Microsoft recommends that the application provides a splash screen image only when it takes longer than 1 second to load the first screen.
b. Within 20 seconds after launch, the application must be responsive to user input.

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

Images

Изображения — это составляющая часть почти всех приложений. Потому важно помнить несколько вещей о них.

На данный момент поддерживаются два формата изображений:

  • JPG — обработка JPG происходит быстрее, чем обработка PNG. Если нет прозрачности лучше использовать именно JPG.
  • PNG — Все изображения с прозрачностью хранятся в PNG, JPG не поддерживает прозрачность.

Заметка: При создании сложных объектов, лучше (для производительности) экспортировать их как изображение. а не как XAML.

Несколько важных моментов при использовании изображений:

  1. Используйте JPG при возможности.
  2. Всегда, по возможности, используйте JPG, конечно если нет прозрачности), так как обработка JPG быстрее.

  3. Компилируйте изображения как «Content» (Build Action).
  4. Всегда выставляйте «Build Action» в «Content» вместо стандартного «Resource». При добавлении изображение, по умолчанию выставляется ресурс. Выставляйте «Content» для уменьшения размера ваших DLL, что ускорит загрузку приложения и загрузку изображений.

    content
    Заметка: Когда «Build Action» выставлен в «Content» доступ к изображению осуществляется так:

    <Image Source="fl.jpg">
    

    А когда «Build Action» выставлен в «Resource» то доступ осуществляется так:

    <Image Source="/WP7EncodeDecodeDemo;component/fl.jpg">
    

    Brad Tutterow имеет отличный пост на тему content или resources, что бы лучше вникнуть в проблему, прочтите его.

  5. Убедитесь в правильности размеров изображений.
  6. Вам еще стоит волноваться о размере изображений из-за ограниченного разрешения экрана мы вынуждены ограничивать размеры изображений до 2000 на 2000 пикселей (изображение большее по размеру будет медленнее появляться на экране). Проверяйте размер изображений, ведь нет смысла загружать для небольшого изображения картинку высотой в 512 пикселей?

Видимость и Прозрачность

Сокрытие/показ элементов — типично для большинства WP7 приложений. Есть два способа для того что бы спрятать элемент:

  • Visibility — когда вы отображаете элемент на экране задав свойство Visibility в Visible, при этом перерисовывается контент визуального дерева с элементом, а элемент перерисовывается полностью.
  • Opacity — при использовании прозрачности ВАЖНО использовать bitmap-кеширование, задав CacheMode элента как BitmapCache. Кеширование позволит визуальным элементам сохраниться в виде Bitmap-ов после первой отрисовки. После того, как элемент закеширован, приложение пропускает этап отрисовки и отображает кешированный bitmap элемента. Не следует использовать прозрачность без кеширования из-за снижения производительности. Тем не менее, иногда будет выгоднее использовать Visibility, например когда в изображении есть сложные графические объекты.

Application Startup

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

  1. Используйте Splash Screen
  2. Все Windows Phone проекты включают в себя загрузочный экран. Для этого используется изображение с названием SplashScreenImage.jpg. Оно автоматически появляется при старте приложение. Рекомендуется использовать загрузочный экран в случае длительности загрузки первой страницы приложения более одной секунды.

  3. Уменьшите размеры сборок в приложении
  4. — Вот подсказки для уменьшения размеров:

    — Старайтесь выставлять «Build Action» как «Content».

    — Если приложение локализировано, не включайте переведенные ресурсы в главную сборку. Вместо этого сделайте отдельные сборки для каждого из языков. Больше информации тут: How to: Build a Localized Application for Windows Phone

  5. Разбивайте приложение на небольшие сборки
  6. Это делается с помощью добавления в приложение библиотек, которые будут хранить страницы, используемые только по запросу.

  7. Минимизируйте количество кода в Конструкторах и в событиях Loaded
  8. Следите за использованием изолированного хранилища
  9. Избегайте блокирования UI Thread
  10. Используйте Push Notifications

Надеюсь, это поможет вам писать быстрые и хорошие приложения.

Реклама