Переключение на Главную Страницу Страницы: 1 2 3 [4] 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Сравнение с методом ВыбратьПоЗначению(...) (число прочтений - 13975 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #45 - 24. Марта 2009 :: 21:13
Печать  
Попробую но днем Улыбка
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #46 - 24. Марта 2009 :: 21:16
Печать  
ага, спасибо заранее  Улыбка
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #47 - 25. Марта 2009 :: 05:47
Печать  
Что-то странные результаты. Почему-то не совпадает количество через 1С и 1sqlite.
Можешь тестовую базу выслать?
можно на orefkovСобакаgmail.com
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #48 - 25. Марта 2009 :: 06:23
Печать  
к сожалению базу прислать не могу - она не моя ))
я что нибудь придумаю, если сам не найду причину разницы в количествах
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #49 - 25. Марта 2009 :: 06:33
Печать  
Поставил демобух. Правда там всего два счета вбито и одна накладная с договором из счета. Поэтому прогонял в цикле 1000 раз.
Запрос исправил в плане проверки проведенных документов. Код теста:

Код
Выбрать все
Функция лайтИнит()
	ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
	база = СоздатьОбъект("SQLiteBase");
	база.Открыть(":memory:");
	запросПоДоговорамРН = база.НовыйЗапрос();
	запросПоДоговорамРН.Подготовить("
	|select exists(
	|	select *
	|	from __1S_crdoc cr inner join Журнал Ж on cr.childid = Ж.iddoc
	|	where cr.mdid = :ГрафаОтбора.Договор and cr.parentval = @Договор
	|	and Ж.iddocdef = :ВидДокумента.РасходнаяНакладная and Ж.closed & 1 = 1
	|) [ЕстьОтгрузки :Число.1.0]
	|");
	Возврат запросПоДоговорамРН;
КонецФункции	// лайтИнит

Процедура Сформировать()
	ЗапросЛайт = лайтИнит();
	Док	= СоздатьОбъект("Документ.Счет");
	КолДоковСОтгрузкой1С	= 0;
	КолДоковСОтгрузкойЛайт	= 0;
	КолЗапросов				= 0;
	ДокОбщ	= СоздатьОбъект("Документ");

	счетнач	= _GetPerformanceCounter();
	Для Номер = 1 По 1000 Цикл
		Док.ВыбратьДокументы();
		Пока Док.ПолучитьДокумент()=1 цикл
			Если ПустоеЗначение(Док.Договор)=1 тогда продолжить КонецЕсли;
			КолЗапросов=КолЗапросов+1;
			ДокОбщ.ВыбратьПоЗначению(,,"Договор",Док.Договор);
			Пока ДокОбщ.ПолучитьДокумент()=1 цикл
				Если ДокОбщ.Проведен()=0 тогда
				ИначеЕсли ДокОбщ.Вид()="РасходнаяНакладная" тогда
					КолДоковСОтгрузкой1С = КолДоковСОтгрузкой1С + 1;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	счеткон=_GetPerformanceCounter();
	Сообщить("Количество запросов 1С = " + КолЗапросов);
	Сообщить("Время по ВыбратьПоЗначению: "+(счеткон-счетнач) +
		" Количество доков с отгрузкой = " + КолДоковСОтгрузкой1С);

	КолЗапросов = 0;
	счетнач	= _GetPerformanceCounter();
	Для Номер = 1 По 1000 Цикл
		Док.ВыбратьДокументы();
		Пока Док.ПолучитьДокумент() = 1 цикл
			Если ПустоеЗначение(Док.Договор)=1 тогда продолжить КонецЕсли;
			КолЗапросов=КолЗапросов+1;
			ЗапросЛайт.УстановитьПараметр("@Договор", Док.Договор, -1);
			КолДоковСОтгрузкойЛайт = КолДоковСОтгрузкойЛайт + ЗапросЛайт.Выполнить(0);
		КонецЦикла;
	КонецЦикла;
	счеткон=_GetPerformanceCounter();
	Сообщить("Количество запросов лайт = " + КолЗапросов);
	Сообщить("Время по лайт: "+(счеткон-счетнач) +
		" Количество доков с отгрузкой = " + КолДоковСОтгрузкойЛайт);
КонецПроцедуры

 



База локальная.
Результаты:
В немонопольном режиме:
Код
Выбрать все
Количество запросов 1С = 2000
Время по ВыбратьПоЗначению: 679 Количество доков с отгрузкой = 1000
Количество запросов лайт = 2000
Время по лайт: 474 Количество доков с отгрузкой = 1000
 



В монопольном:
Код
Выбрать все
Количество запросов 1С = 2000
Время по ВыбратьПоЗначению: 434 Количество доков с отгрузкой = 1000
Количество запросов лайт = 2000
Время по лайт: 184 Количество доков с отгрузкой = 1000
 


  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #50 - 25. Марта 2009 :: 08:18
Печать  
тоже исправил проверку проведения

результаты в монополном
Цитата:
Время по ВыбратьПоЗначению: 55 Количество доков с отгрузкой = 107
Время по лайт: 97 Количество доков с отгрузкой = 107
Время по ВыбратьПоЗначению: 55 Количество доков с отгрузкой = 107
Время по лайт: 93 Количество доков с отгрузкой = 107
Время по ВыбратьПоЗначению: 59 Количество доков с отгрузкой = 107
Время по лайт: 91 Количество доков с отгрузкой = 107
Время по ВыбратьПоЗначению: 59 Количество доков с отгрузкой = 107
Время по лайт: 90 Количество доков с отгрузкой = 107
Время по ВыбратьПоЗначению: 55 Количество доков с отгрузкой = 107
Время по лайт: 93 Количество доков с отгрузкой = 107


в немонопольном (подключились два пользователя)

Цитата:
Время по ВыбратьПоЗначению: 66 Количество доков с отгрузкой = 108
Время по лайт: 74 Количество доков с отгрузкой = 108
Время по ВыбратьПоЗначению: 56 Количество доков с отгрузкой = 108
Время по лайт: 72 Количество доков с отгрузкой = 108
Время по ВыбратьПоЗначению: 57 Количество доков с отгрузкой = 108
Время по лайт: 73 Количество доков с отгрузкой = 108
Время по ВыбратьПоЗначению: 59 Количество доков с отгрузкой = 108
Время по лайт: 75 Количество доков с отгрузкой = 108
Время по ВыбратьПоЗначению: 60 Количество доков с отгрузкой = 108
Время по лайт: 76 Количество доков с отгрузкой = 108
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #51 - 25. Марта 2009 :: 08:19
Печать  
результаты на реальной базе перевешивают  Улыбка
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #52 - 25. Марта 2009 :: 08:25
Печать  
увеличил кол. запросов в 10 раз. результаты немонопольных запросов

Цитата:
Время по ВыбратьПоЗначению: 583 Количество доков с отгрузкой = 1080
Время по лайт: 679 Количество доков с отгрузкой = 1080
Время по ВыбратьПоЗначению: 571 Количество доков с отгрузкой = 1080
Время по лайт: 676 Количество доков с отгрузкой = 1080
Время по ВыбратьПоЗначению: 567 Количество доков с отгрузкой = 1080
Время по лайт: 687 Количество доков с отгрузкой = 1080
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #53 - 25. Марта 2009 :: 09:25
Печать  
Странные результаты. А можешь в отладчике с замером времени запустить и лог кинуть?
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #54 - 25. Марта 2009 :: 12:47
Печать  
замер при запущенном отладчике:
Цитата:
Время по ВыбратьПоЗначению: 837 Количество доков с отгрузкой = 1080
Время по лайт: 787 Количество доков с отгрузкой = 1080
Время по ВыбратьПоЗначению: 838 Количество доков с отгрузкой = 1080
Время по лайт: 786 Количество доков с отгрузкой = 1080


замер без отладчика:
Цитата:
Время по ВыбратьПоЗначению: 532 Количество доков с отгрузкой = 1080
Время по лайт: 641 Количество доков с отгрузкой = 1080
Время по ВыбратьПоЗначению: 534 Количество доков с отгрузкой = 1080
Время по лайт: 639 Количество доков с отгрузкой = 1080


так что замер в отладчике не поможет  Печаль

но лог все равно положу
  

zamer.rar ( 0 KB | Загрузки )
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #55 - 25. Марта 2009 :: 16:21
Печать  
Написал хранимые - но на демо результат слабее 1С.
Видимо на столь быстрых запрсах много времени уходит на хранимую
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #56 - 25. Марта 2009 :: 16:22
Печать  
Собственно тест, кому интересно написание хранимых
Код
Выбрать все
Процедура СоздатьПроцедуру(ТекстПроцедуры,ИмяПроцедуры)
	ПутьККаталогу=КаталогИБ();
	ИмяФайлаПроцедуры=ИмяПроцедуры+".prg";
	Если ФС.СуществуетФайл(ПутьККаталогу+ИмяФайлаПроцедуры)=1 Тогда
		Возврат;
	КонецЕсли;
	ФайлТекст=СоздатьОбъект("Текст");
	Для ИИ=1 По  СтрКоличествоСтрок(ТекстПроцедуры) Цикл
		СтрокаТекста=	 СтрПолучитьСтроку(ТекстПроцедуры,ИИ);
		ФайлТекст.ДобавитьСтроку(СтрокаТекста);
	КонецЦикла;
	ФайлТекст.Записать(ИмяФайлаПроцедуры);
КонецПроцедуры

Функция ФоксИнит()  
	ОлеДБ = СоздатьОбъект("OLEDBData");  
	Рез=ОлеДБ.Соединение("  
	|Provider=VFPOLEDB.1;  
	|Data Source=" + КаталогИБ() + ";  
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Mode=ReadWrite;  
	|ANSI= 0;
	|EXACT=0;
	|NEAR -1;  
	|REFRESH TO 0,-1;
	|REPROCESS TO 60 SECONDS;
	|TABLEVALIDATE 0;
    |Collating Sequence=MACHINE;
	|");
	ТекстПроцедурыОткрытия="
	|SET NEAR ON
	|USE 1SCRDOC IN 1 ALIAS OTBOR
	|USE 1SJOURN IN 2 ALIAS JUR
	|SELECT JUR
	|SET ORDER TO TAG IDDOC OF  '1SJOURN.CDX'
	|SELECT OTBOR
	|SET RELATION TO CHILDID INTO JUR
	|SET ORDER TO TAG PARENT OF  '1SCRDOC.CDX'
	|";
	ТекстПроцедурыПоиска="
	|LPARAMETERS dogovor,grapha,VIDRash
	|GO TOP IN OTBOR
	|IndexValue=grapha+dogovor
	|SEEK (IndexValue)
	|IF NOT FOUND()  THEN
	|	Return 0  
	|ENDIF    
	|KolDoc=0
	|DO WHILE  (OTBOR.MDID==grapha)AND(OTBOR.PARENTVAL==dogovor)
	|	IF(JUR.CLOSED==5)AND(JUR.IDDOCDEF==VIDRash)THEN
	|		KolDoc=KolDoc+1
	|      	RETURN KolDoc
	|        
	|	ENDIF
	|	SKIP 1
	|	IF EOF()OR BOF() THEN
	|		RETURN KolDoc
	|	ENDIF      
	|ENDDO
	|RETURN KolDoc
	|";  

    СоздатьПроцедуру(ТекстПроцедурыОткрытия,"OpenTabKolDoc");
    СоздатьПроцедуру(ТекстПроцедурыПоиска,"GetKolDoc");


	Возврат ОлеДБ
КонецФункции
//*******************************************
Процедура Сформировать()
     Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1CPP.dll")=0 Тогда
	//	Если ЗагрузитьВнешнююКомпоненту("1CPP.dll")=0 Тогда
			Предупреждение("Не удалось обнаружить компоненту 1CPP.dll!",20);

			Возврат;
	//	КонецЕсли;
    КонецЕсли;

	глМД = СоздатьОбъект("MetaDataWork");

	ГрафаОтбораДоговор=глМД.ОбрМетаСКЛ("$ГрафаОтбора.Договор");
	ВидДокРасх=глМД.ОбрМетаСКЛ("$ВидДокумента.РасходнаяНакладная");
	ОлеДБ = ФоксИнит();  
    локОлеДБКоманда = ОлеДБ.СоздатьКоманду();
	локОлеДБКоманда.Выполнить("OpenTabKolDoc()");
	ТЗ=СоздатьОбъект("ТаблицаЗначений");
	ТЗ.НоваяКолонка("return_value");

	Док	= СоздатьОбъект("Документ.Счет");
	КолДоковСОтгрузкой1С	= 0;
	КолДоковСОтгрузкойЛайт	= 0;
	КолЗапросов				= 0;
	ДокОбщ	= СоздатьОбъект("Документ");

	счетнач	= _GetPerformanceCounter();
	Для Номер = 1 По 1000 Цикл
		Док.ВыбратьДокументы();
		Пока Док.ПолучитьДокумент()=1 цикл
			Если ПустоеЗначение(Док.Договор)=1 тогда продолжить КонецЕсли;
			КолЗапросов=КолЗапросов+1;
			ДокОбщ.ВыбратьПоЗначению(,,"Договор",Док.Договор);
			Пока ДокОбщ.ПолучитьДокумент()=1 цикл
				Если ДокОбщ.Проведен()=0 тогда
				ИначеЕсли ДокОбщ.Вид()="РасходнаяНакладная" тогда
					КолДоковСОтгрузкой1С = КолДоковСОтгрузкой1С + 1;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	счеткон=_GetPerformanceCounter();
	Сообщить("Количество запросов 1С = " + КолЗапросов);
	Сообщить("Время по ВыбратьПоЗначению: "+(счеткон-счетнач) +
		" Количество доков с отгрузкой = " + КолДоковСОтгрузкой1С);

	КолЗапросов = 0;
	счетнач	= _GetPerformanceCounter();
	Для Номер = 1 По 1000 Цикл
		Док.ВыбратьДокументы();
		Пока Док.ПолучитьДокумент() = 1 цикл
			Если ПустоеЗначение(Док.Договор)=1 тогда продолжить КонецЕсли;
			  КолЗапросов=КолЗапросов+1;  
			  ДлинныйДоговор="'"+глМД.ЗначениеВСамуюДлиннуюСтрокуБД(Док.Договор)+"'";
			  ТЗ.УдалитьСтроки();
			 Договор+","+ВидДокРасх+")",ТЗ,0);
			  Кол=ТЗ.ПолучитьЗначение(1,"return_value");

			  КолДоковСОтгрузкойЛайт = КолДоковСОтгрузкойЛайт + Кол;

		КонецЦикла;
	КонецЦикла;
	счеткон=_GetPerformanceCounter();
	Сообщить("Количество запросов хард = " + КолЗапросов);
	Сообщить("Время по хард: "+(счеткон-счетнач) +
		" Количество доков с отгрузкой = " + КолДоковСОтгрузкойЛайт);
КонецПроцедуры
 


  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #57 - 25. Марта 2009 :: 16:48
Печать  
ага, kiruha, спасибо за пример!  буду изучать
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #58 - 25. Марта 2009 :: 17:13
Печать  
да, по скорости действительно медленней раз в 10.
м. чего не учтено


  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Сравнение с методом ВыбратьПоЗначению(...)
Ответ #59 - 25. Марта 2009 :: 17:45
Печать  
возможно, из-за того, что хранимая процедура в файле и приходится его много раз читать; вот если разместить ее в курсоре - где то я наталкивался
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 
ОтправитьПечать