Каталог решений - Сравнение скорости чтения данных в 1SQLite и DBEng32

Сравнение скорости чтения данных в 1SQLite и DBEng32

Сравнение скорости чтения данных в 1SQLite и DBEng32

В наличии

Разработки опубликованы на данном сайте по ссылкам:
http://infostart.ru/projects/2127/
http://infostart.ru/projects/1359/
http://infostart.ru/projects/811/

Категория:

Описание

Сразу оговорюсь, что это не является полным тестом данных разработок, а лишь информация к размышлению. Для более полного сравнения скорости работы этих разработок необходимо замерять время выполнения чтения по ключу и запись данных. Проводить тестирование по реальной сети в многопользовательский режим. К сожалению, в текущей версии 1SQLite (1018f) не обеспечена совместимость с DBEng32 и не удаётся оценить скорость их совместной работы.

Примечание от 17.07.08:
Замеры для 1SQLite проводились до исправления проблемы в многопользовательском режиме. Подробнее смотрите сообщения 153, 156, 158, 165 в //sale.itcity.ru/projects/2127/ Снимок экрана при сбое представлен в конце статьи. Замеры будут проводиться повторно, после устранения проблемы автором 1SQLite.

Примечание от 08.09.08:
Добавлены замеры для 1SQLite (1019) после исправления проблемы в многопользовательском режиме.

Выполнялся последовательный просмотр таблицы (справочника) по индексу с суммированием значений одного поля для группы записей. Суммировались только положительные значения. Тест проводился в виртуальной сети на базе “MS Virtual PC 2007” (x64, без SP1), связь через “MS Loopback Adapter” (TCP/IP). Запускались две сессии 1С, каждая в отдельной виртуальной машине. База данных и сервер БД располагались на реальной машине. В одной сессии выполнялся тест, в другой сессии “пользователь” бездействовал. Время указано в секундах. В каждом замере запрос/цикл выполнялся по три раза. Перед каждым замером производилась перезагрузка операционной системы.

Длина ключа: 14 байт для замеров 1,2,3,6,7 и 9 байт для замеров 4,5,8.
Размер файла DBF: 620 мегабайт.
Записей в таблице: 1963065.
Записей отобрано: 510426.

1) Родной движок 1С (штатный язык программирования).
Без транзакции
Время выполнения цикла: 2699
Время выполнения цикла: 2696
Время выполнения цикла: 2698
В транзакции
Время выполнения цикла: 296
Время выполнения цикла: 298
Время выполнения цикла: 293

2) Advantage (без изменения конфигурации).
Время выполнения цикла: 694
Время выполнения цикла: 671
Время выполнения цикла: 683

3) Advantage (добавлено ДВА оператора перед циклом).
Время выполнения цикла: 64
Время выполнения цикла: 67
Время выполнения цикла: 64

4) Advantage (навигационный способ обработки информации).
Время выполнения цикла: 67
Время выполнения цикла: 60
Время выполнения цикла: 61

5) 1SQLite (прямой запрос, родные DBF).
1018f
Время выполнения запроса: 181
Время выполнения запроса: 182
Время выполнения запроса: 182
1019 (NeedTransaction=0)
Время выполнения запроса: 2513
Время выполнения запроса: 2517
Время выполнения запроса: 2516
1019 (NeedTransaction=1)
Время выполнения запроса: 161
Время выполнения запроса: 160
Время выполнения запроса: 160

6) CodeBase (без изменения конфигурации).
Время выполнения цикла: 786
Время выполнения цикла: 711
Время выполнения цикла: 698

7) CodeBase (добавлен ОДИН оператор перед циклом).
Время выполнения цикла: 211
Время выполнения цикла: 212
Время выполнения цикла: 204

8) CodeBase (навигационный способ обработки информации).
Время выполнения цикла: 170
Время выполнения цикла: 171
Время выполнения цикла: 170

Структура справочника:

#==TABLE no 62 : Справочник хДвижение2007
# Name |Descr |Type[A/S/U]|DBTableName|ReUsable
T=SC9998 |Справочник хДвижение2007 |A |SC9998 |1
#——Fields——-
# Name |Descr |Type|Length|Precision
F=ID |ID object |C |9 |0
F=DESCR |object description |C |14 |0
F=ISMARK |Flag Object is Marke|C |1 |0
F=VERSTAMP |Version stamp |C |6 |0
F=SP10010 |(P)Количество |N |20 |5
……………………………………………..
……………………………………………..
#—-Indexes——
# Name |Descr |Unique|Indexed fields |DBName
I=IDD |of ID |0 |ID |IDD
I=DESCR |of DESCR |0 |DESCR(UPPER) |DESCR
……………………………………………..
……………………………………………..

Тексты программ:

//--------------------------------------
ЗагрузитьВнешнююКомпоненту("AddInExt.dll");
Ext=СоздатьОбъект("AddIn.AddInExt");
//--------------------------------------
Процедура Выполнить()                   // Замер 1,2,6 
	Перем Рег,Кол,Тим;
	Рег=СоздатьОбъект("Справочник.хДвижение2007");
	Кол=0;
	Тим=_GetPerformanceCounter();
	Рег.ПорядокНаименований();
	Рег.ВыбратьЭлементы();
	Пока Рег.ПолучитьЭлемент()>0 Цикл
		Если Рег.Количество>0 Тогда
			Кол=Кол+Рег.Количество;
		КонецЕсли;	
	КонецЦикла;
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 3 
	Перем Рег,Кол,Тим,Имя;
	Рег=СоздатьОбъект("Справочник.хДвижение2007");
	Имя="СправочникхДвижение2007";
	Кол=0;
	Тим=_GetPerformanceCounter();
	Рег.ПорядокНаименований();
	Рег.ВыбратьЭлементы();
	Ext._(60,Имя,"val({Количество})>0");
	Ext._(61,Имя,10);
	Пока Рег.ПолучитьЭлемент()>0 Цикл
		Если Рег.Количество>0 Тогда
			Кол=Кол+Рег.Количество;
		КонецЕсли;	
	КонецЦикла;
	Ext._(61,Имя,0);
	Ext._(60,Имя);
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 4
	Перем Рег,Инд,Зап,Дат,Кол,Тим;
	Рег="СправочникхДвижение2007";
	Инд="IDD";
	Дат=" 2XUFQ   ";
	Кол=0;
	Тим=_GetPerformanceCounter();
	Ext._(60,Рег,"val({Количество})>0");
	Ext._(61,Рег,10);
	Зап=Ext._(41,Рег,Инд,Дат);
	Пока Число(Зап)>0 Цикл
		Кол=Кол+Число(Ext._(43,Рег,"Количество"));
		Зап=Ext._(42,Рег,Инд,Зап,1);	
	КонецЦикла;
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
	Ext._(61,Рег,0);
	Ext._(60,Рег);
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 5 
	Попытка
		база = СоздатьОбъект("SQLiteBase");
	Исключение
		ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
		база = СоздатьОбъект("SQLiteBase");
	КонецПопытки;
	база.Открыть(":memory:");
	запрос = база.НовыйЗапрос();
	запрос.ВыполнитьЗапрос("create virtual table хДвижение using dbeng(Справочник.хДвижение2007)");
	т1 = _GetPerformanceCounter();
	тз = запрос.ВыполнитьЗапрос("
	|select
	|	sum(Количество) Колич
	|from
	|	хДвижение
	|where
	|	ID > "" 2XUFQ   "" and Количество > 0 
	|");
	т2 = _GetPerformanceCounter();
	Сообщить("Время выполнения запроса: " + (т2 - т1));
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 7 
	Перем Рег,Кол,Тим,Имя;
	Рег=СоздатьОбъект("Справочник.хДвижение2007");
	Имя="СправочникхДвижение2007";
	Кол=0;
	Тим=_GetPerformanceCounter();
	Рег.ПорядокНаименований();
	Рег.ВыбратьЭлементы();
	Ext._(61,Имя,10);
	Пока Рег.ПолучитьЭлемент()>0 Цикл
		Если Рег.Количество>0 Тогда
			Кол=Кол+Рег.Количество;
		КонецЕсли;	
	КонецЦикла;
	Ext._(61,Имя,0);
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 8
	Перем Рег,Инд,Зап,Дат,Кол,Тим;
	Рег="СправочникхДвижение2007";
	Инд="IDD";
	Дат=" 2XUFQ   ";
	Кол=0;
	Тим=_GetPerformanceCounter();
	Ext._(61,Рег,10);
	Зап=Ext._(41,Рег,Инд,Дат);
	Пока Число(Зап)>0 Цикл
		Кол=Кол+Число(Ext._(43,Рег,"Количество"));
		Зап=Ext._(42,Рег,Инд,Зап,1);	
	КонецЦикла;
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
КонецПроцедуры
//--------------------------------------
has been added to your cart:
Оформление заказа