Книга: Программирование мобильных устройств на платформе .NET Compact Framework
Листинг 14.4. Результаты тестирования производительности при использовании пользовательского формата данных вместо объектов DataSet
Листинг 14.4. Результаты тестирования производительности при использовании пользовательского формата данных вместо объектов DataSet
//Определение размерных характеристик теста
const int DUMMY_ROWS_OF_DATA = 100;
const int NUMBER_TEST_ITERATIONS = 500;
const string TABLE_NAME_PASSENGERINFO = "CustomerTravelInfo";
const string TEST_CREDIT_CARD = "IvoCard-987-654-321-000";
string [] m_data_creditCards;
string [] m_data_names;
System.DateTime [] m_data_travelDates;
//-------------------------------------------------------------
//Создает массив данных (вместо использования объектов DataSet)
//-------------------------------------------------------------
private void createDataSet() {
//=============================================
//1. Создать пространство для размещения данных
//=============================================
m_data_creditCards = new string[DUMMY_ROWS_OF_DATA + 1];
m_data_names = new string[DUMMY_ROWS_OF_DATA + 1];
m_data_travelDates = new System.DateTime[DUMMY_ROWS_OF_DATA + 1];
//----------------------
//Добавить строки данных
//----------------------
System.Text.StringBuilder buildTestString;
buildTestString = new System.Text.StringBuilder();
for (int addItemsCount = 0; addItemsCount < DUMMY_ROWS_OF_DATA; addItemsCount++) {
//Выбрать день отъезда пассажира
m_data_travelDates[addItemsCount] = System.DateTime.Today.AddDays(addItemsCount);
//---------------------
//Выбрать имя пассажира
//---------------------
//Очистить строку
buildTestString.Length = 0;
buildTestString.Append("TestPersonName");
buildTestString.Append(addItemsCount);
m_data_names[addItemsCount] = buildTestString.ToString();
//-------------------------------------------------------
//Связать с пассажиром текстовый номер кредитной карточки
//-------------------------------------------------------
//Строка значения третьего столбца набора данных
buildTestString.Length = 0;
buildTestString.Append("IvoCard-000-000-0000-");
buildTestString.Append(addItemsCount);
m_data_creditCards[addItemsCount] = buildTestString.ToString();
}
//Добавить элемент, поиск которого мы хотим выполнить в нашем тесте...
//Выбрать день для значения в первом столбце данных
m_data_travelDates[DUMMY_ROWS_OF_DATA] = System.DateTime.Today;
//Строка для второго столбца данных
m_data_names[DUMMY_ROWS_OF_DATA] = "Ms. TestPerson";
//Строка с идентификатором кредитной карточки
m_data_creditCards[DUMMY_ROWS_OF_DATA] = ТЕST_CRE DIT_CARD;
} //Конец функции
//-----------------
//Выполнить тест...
//-----------------
void changeDayOfTravel_test() {
//Отобразить курсор ожидания
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
//Начать с известной даты...
System.DateTime newDate;
newDate = System.DateTime.Today;
changeDayOfTravel_CustomArrays(ТЕST_CREDIT_CARD, newDate);
//ТОЛЬКО В ЦЕЛЯХ ТЕСТИРОВАНИЯ!!!
//HE СЛЕДУЕТ использовать вызовы сборщика мусора в готовом программном
//коде. Это ЗАМЕДЛЯЕТ работу приложения.
System.GC.Collect();
const int testNumber = 0;
//Запустить таймер теста
PerformanceSampling.StartSample(testNumber, "Custom Array implementation");
//Запустить тест!
for(int testCount = 0; testCount < NUMBER_TEST_ITERATIONS; testCount++) {
//Передвинуть дату вперед на один день
newDate = newDate.AddDays(1);
int numberRecordsChanged = 0;
//Просмотреть все имена, используя СТРОКИ
numberRecordsChanged = changeDayOfTravel_CustomArrays(TEST_CREDIT_CARD, newDate);
//Убедиться в нормальном выполнении теста...
if (numberRecordsChanged != 1) {
System.Windows.Forms.MessageBox.Show("No matching records found. Test aborted!");
return;
}
}
//Получить время выполнения теста
PerformanceSampling.StopSample(testNumber);
//Обычный курсор
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
//Отобразить результаты теста
string runInfo = NUMBER_TEST_ITERATIONS.ToString() + "x" +
DUMMY_ROWS_OF_DATA.ToString() + ": ";
System.Windows.Forms.MessageBox.Show(runInfo +
PerformanceSampling.GetSampleDurationText(testNumber));
}
private int changeDayOfTravel_CustomArrays(string creditCardNumber, System.DateTime newTravelDate) {
int numberRecordsChanged = 0;
//Просмотреть каждый элемент массива
for (int index = 0; index <= DUMMY_ROWS_OF_DATA; index++) {
string currentCreditCard;
currentCreditCard = m_data_creditCards[index];
//Обновить запись при наличии совпадения
if (creditCardNumber == currentCreditCard) {
//Изменить дату поездки
System.DateTime currentTravelDate = m_data_travelDates[index];
//Увеличить значение счетчика обновлений только при несовпадении данных
if (currentTravelDate != newTravelDate) {
m_data_travelDates[index] = newTravelDate;
numberRecordsChanged++;
}
}
}
//Возвратить количество обновленных записей
return numberRecordsChanged;
}
private void buttonRunTest_Click(object sender, System.EventArgs e) {
createDataSet();
changeDayOfTravel_test();
}
- Высокоуровневый подход, основанный на использовании объектов ADO.NET DataSet
- Низкоуровневый подход, основанный на использовании объектов подключения к данным ADO.NET
- В каких случаях следует использовать объекты ADO.NET DataSet
- Использование классов DataAdapter для организации взаимодействия с базами данных
- Использование файлов и потоков XML для сохранения и передачи данных
- Листинг 14.2. Использование параметра XMLWriteMode при сохранении объекта ADO.NET DataSet
- Сериализация объектов ADO.NET DataSet с помощью пользовательского кода
- Работа с нетипизированными объектами DataSet
- Перенос типизированных объектов ADO.NET DataSet на мобильные устройства
- Меры по обеспечению максимальной производительности при работе с объектами ADO.NET DataSet
- Листинг 14.3. Сравнение производительности различных вариантов доступа к данным с использованием объектов DataSet
- В каких случаях не следует использовать объекты ADO.NET DataSet
- Листинг 14.4. Результаты тестирования производительности при использовании пользовательского формата данных вместо объектов DataSet
- Пример использования базы данных на устройстве и управления пользовательскими данными
- Листинг 14.5. Пример пользовательского управления данными — код, помещаемый в форму Form1.cs
- Листинг 14.6. Пример кода управления данными для DatabaseAccess.cs
- Листинг 14.7. Пример кода управления данными для GameData.cs
- Листинг 14.8. Пример кода управления данными для VocabularyWord.cs
- Резервное копирование базы данных InterBase
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Резервное копирование многофайловых баз данных
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Восстановление из резервных копий многофайловых баз данных
- Владелец базы данных
- ЧАСТЬ IV. База данных и ее объекты.
- Перевод базы данных InterBase 6.x на 3-й диалект
- Типы данных для работы с датой и временем
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Обзор основных причин повреждения базы данных
- Ошибки проектирования базы данных