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

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 137 138 139 140 141 142 143 144 145 ... 206
Перейти на страницу:

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

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

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

   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. Для создания и выполнения приложения потребуется выполнить следующие действия:

1 ... 137 138 139 140 141 142 143 144 145 ... 206
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре.
Комментарии