Примечание от 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()-Тим)); КонецПроцедуры //--------------------------------------