KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework

Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Иво Салмре, "Программирование мобильных устройств на платформе .NET Compact Framework" бесплатно, без регистрации.
Перейти на страницу:

   //Изменить дату отъезда

   //НИЗКАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Осуществить поиск столбца, используя

   //сравнение строк!

   System.DateTime currentTravelDate =

    (System.DateTime)currentCustomerRow[COLUMN_NAME_DATE_OF_TRAVEL];

   if (currentTravelDate != newTravelDate) {

    //НИЗКАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Осуществить поиск столбца, используя

    //сравнение строк!

    currentCustomerRow[COLUMN_NAME_DATE_OF_TRAVEL] = newTravelDate;

    numberRecordsChanged++;

   }

  } //endif: сравнение строк

 } //end foreach

 return numberRecordsChanged; //Количество обновленных записей

}


//ФУНКЦИЯ, ХАРАКТЕРИЗУЮЩАЯСЯ НЕСКОЛЬКО ЛУЧШЕЙ ПРОИЗВОДИТЕЛЬНОСТЬЮ

private int changeDayOfTravel_cachedColumnIndex(string creditCardNumber, System.DateTime newTravelDate) {

 int numberRecordsChanged = 0;

 //Поиск имени таблицы

 System.Data.DataTable dataTable_Customers;


 //ЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: использовать кэшированный индекс

 dataTable_Customers = m_myDataSet.Tables[m_IndexOfTestTable];

 foreach (System.Data.DataRow currentCustomerRow in dataTable_Customers.Rows) {

  string currentCreditCard;


  //ЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: использовать кэшированный индекс столбца!

  currentCreditCard =

   (string)currentCustomerRow[m_IndexOfTestColumn_CreditCard];


  //Проверить, совпадает ли номер кредитной карточки...

  if (creditCardNumber == currentCreditCard) {

   //Изменить дату отъезда

   //ЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Использовать кэшированный индекс столбца!

   System.DateTime currentTravelDate =

    (System.DateTime)currentCustomerRow[m_IndexOfTestColumn_TravelDate];

   if (currentTravelDate != newTravelDate) {

    //ЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Использовать кэшированный индекс

    //столбца!

    currentCustomerRow[m_IndexOfTestColumn_TravelDate] = newTravelDate;

    numberRecordsChanged++;

   }

  }

 }

 return numberRecordsChanged; //Количество обновленных записей

}


//ФУНКЦИЯ, ОБЛАДАЮЩАЯ НАИЛУЧШЕЙ ПРОИЗВОДИТЕЛЬНОСТЬЮ

private int changeDayOfTravel_CachedColumns(string creditCardNumber, System.DateTime newTravelDate) {

 int numberRecordsChanged = 0;

 //Найти имя таблицы

 System.Data.DataTable dataTable_Customers = m_TableCustomerInfo;

 foreach (System.Data.DataRow currentCustomerRow in dataTable_Customers.Rows) {

  string currentCreditCard;


  //НАИЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Использовать кэшированный индекс столбца!

  currentCreditCard =

   (string)currentCustomerRow[m_TestColumn CreditCard];


  //Проверить, совпадает ли номер кредитной карточки...

  if (creditCardNumber == currentCreditCard) {

   //Изменить дату отъезда


   //НАИЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Использовать кэшированный индекс столбца!

   System.DateTime currentTravelDate =

    (System.DateTime)currentCustomerRow[m_TestColumn_TravelDate];

   if (currentTravelDate != newTravelDate) {

    //НАИЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Использовать кэшированный индекс

    //столбца!

    currentCustomerRow[m_TestColumn TravelDate] = newTravelDate;

    numberRecordsChanged++;

   }

  }

 }

 return numberRecordsChanged; //Количество обновленных записей

}


//Событие щелчка на кнопке

private void buttonRunTest_Click(object sender, System.EventArgs e) {

 createDataSet();

 cacheDataSetInfo();


 //НИЗКАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Использовать поиск по строкам

 changeDayOfTravel_test(testType.textColumnLookup);


 //ЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Использовать поиск по целочисленным индексам

 changeDayOfTravel_test(testType.cachedIndexLookup);


 //НАИЛУЧШАЯ ПРОИЗВОДИТЕЛЬНОСТЬ: Использовать поиск по объектам столбцов

 changeDayOfTravel_test(testType.cachedColumnObject);

}

В каких случаях не следует использовать объекты ADO.NET DataSet

Если данные мобильного приложения большей частью применяются только для чтения, если приходится хранить большие объемы данных в памяти или если между данными существуют сравнительно простые отношения, то стоит подумать о привлечении пользовательской модели управления данными. Объекты ADO.NET DataSet можно эффективно реализовать, но предлагаемая ими модель управления данными является универсальной. Можно добиться существенного выигрыша в объеме занимаемой памяти и производительности, создав специализированную модель данных, которая наилучшим образом соответствует вашим потребностям. Ключевым фактором эффективного использования памяти является уменьшение количества объектов, которые должны размещаться для хранения ваших данных; как правило, чем меньше объектов, тем меньше нагрузка на память и тем выше производительность.

В табл. 14.2 и листинге 14.4 представлены результаты использования оптимизированного пользовательского формата для хранения строк данных. Тестовый код, приведенный в листинге 14.4, выполняет ту же задачу, что и код из листинга 14.3, но вместо объектов ADO.NET DataSet в нем используется простой типизированный массив данных. От такой замены производительность приложения выигрывает в двух отношениях:

1. Быстродействие. Как видно из табл. 14.2, применение пользовательского формата данных позволило уменьшить время выполнения приложения до 38% того времени, которое было зафиксировано для решения, базирующегося на ADO.NET с использованием текстового индекса. Сравнение с результатом, достигнутым в оптимизированном варианте поиска, в котором использовался объект DataColumn, свидетельствует о сокращении времени выполнения почти в два раза (12,32/23,54=52,3%).

2. Снижение нагрузки на память. Поскольку в решении, основанном на пользовательском формате данных, для хранения данных требуется лишь минимальное количество объектов, а накладные расходы, связанные с объектами ADO.NET DataSet, отсутствуют, наше приложение предъявляет к памяти менее жесткие требования. Это означает, что при прочих равных условиях объем работы по сборке мусора уменьшается, а рабочее пространство для кода приложения увеличивается. Хотя этот результат и не отражен в таблице, он положительно влияет на общую производительность приложения.

Разумеется, у решения, основанного на пользовательском формате данных, имеются и недостатки по сравнению с вариантами решений, в которых используются объекты ADO.NET DataSet. Самое главное — это то, что при необходимости обновления данных на сервере в нашем коде требуется организовать учет всех изменений данных. Это означает, что мы должны ввести, по крайней мере, один дополнительный столбец булевских значений, указывающих на то, в каких строках были сделаны изменения. Это не составляет особого труда в случае простых табличных данных, но значительно усложняется, если данные разбросаны по нескольким таблицам и связаны между собой целой системой различных отношений. Кроме того, ADO.NET предлагает объекты DataView, обеспечивающие сортировку и фильтрацию данных, чего мы лишены, если останавливаемся на варианте пользовательской реализации модели данных. Расширение возможностей связано с дополнительными накладными расходами, и поэтому вы должны тщательно взвешивать все за и против, выбирая между функциональностью Al)O.NET и потенциально более высокой эффективностью пользовательской реализации. В случае приложений для устройств повышение эффективности часто окупает дополнительные затраты труда на разработку пользовательской модели данных на стадии проектирования.


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

Номер теста (А) Текстовый индекс, с (Б) Целочисленный индекс, с (В) Индексирование по объектам DataColumn, с (Г) Пользовательский формат данных, с   (ADO.NET) (ADO.NET) (ADO.NET) (Пользовательский) 1 32,538 30,09 23,554 12,268 2 33,063 30,387 23,491 12,335 3 32,87 30,372 23,582 12,358 Среднее 32,82 30,28 23,54 12,32 Относительная производительность 100% 92% 72% 38%

Приведенный в листинге 14.4 код необходимо включить в форму в проекте Pocket PC. Для создания и выполнения приложения потребуется выполнить следующие действия:

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*