Примечание от 17.07.08:
Замеры для 1SQLite проводились до исправления проблемы в многопользовательском режиме. Подробнее смотрите сообщения 153, 156, 158, 165 в //infostart.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()-Тим));
КонецПроцедуры
//--------------------------------------
Вступайте в нашу телеграмм-группу Инфостарт