Имя: Пароль:
1C
1С v8
Оптимизация кода
,
0 TocTep
 
20.07.11
12:09
есть регистр сведений
Измерения:
Номенклатура
СерияНоменклатуры
Ресурсы:
Остальный пар-ры

МассивУзлов=ПроцедурыОбменаДаннымиПоМагазину.ВернутьМассивУзловПоОдномуМагазину(Магазин, СоответствиеУиМ);
Если МассивУзлов <> Неопределено И МассивУзлов.Количество() > 0 Тогда
НаборЗаписей=РегистрыСведений.бгсЗначенияСвойствХарактеристик.СоздатьНаборЗаписе();
   НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура,ИСТИНА);
   НаборЗаписей.Отбор.СерияНоменклатуры.Установить(Справочники.бгсСерииНоменклатуры.ПустаяСсылка(),ИСТИНА);
   НаборЗаписей.Прочитать();
   для каждого запись из НаборЗаписей цикл
       запись.Скидка=Скидка;
   конеццикла;
   НаборЗаписей.Записать();//при мониторинге производ. это срока
//ест 60%
   ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов,НаборЗаписей);
КонецЕсли;
Помогите оптимизировать код.
1 H A D G E H O G s
 
20.07.11
12:10
И что удивительного?
2 vicof
 
20.07.11
12:15
"СоздатьНаборЗаписе()" - это работает?
3 simol
 
20.07.11
12:16
60% от 1 часа или 1 микросекунды?
4 TocTep
 
20.07.11
12:16
этот код полностью рабочий,
но медленный при большом объеме
5 TocTep
 
20.07.11
12:16
60% от 7 часов
6 rs_trade
 
20.07.11
12:17
(0) так будет быстрее

//НаборЗаписей.Записать();//при мониторинге производ. это срока
7 Ненавижу 1С
 
гуру
20.07.11
12:17
(4) брешишь, см (2)
8 simol
 
20.07.11
12:17
Может у тебя вместо винчестера секретарь-стенографист...
9 TocTep
 
20.07.11
12:17
точнее сказать от всего затраченного времени на процедуру
10 simol
 
20.07.11
12:17
Или у тебя эта строка повторяется миллиард раз
11 Ненавижу 1С
 
гуру
20.07.11
12:17
(6) так еще быстрее:

//МассивУзлов=ПроцедурыОбменаДаннымиПоМагазину.ВернутьМассивУзловПоОдномуМагазину(Магазин, СоответствиеУиМ);
//Если МассивУзлов <> Неопределено И МассивУзлов.Количество() > 0 Тогда
//НаборЗаписей=РегистрыСведений.бгсЗначенияСвойствХарактеристик.СоздатьНаборЗаписе();
//    НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура,ИСТИНА);
//    НаборЗаписей.Отбор.СерияНоменклатуры.Установить(Справочники.бгсСерииНоменклатуры.ПустаяСсылка(),ИСТИНА);
//    НаборЗаписей.Прочитать();
//    для каждого запись из НаборЗаписей цикл
//        запись.Скидка=Скидка;
//    конеццикла;
//    НаборЗаписей.Записать();//при мониторинге производ. это срока
//
////ест 60%
//
//    ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов,НаборЗаписей);
//КонецЕсли;
12 TocTep
 
20.07.11
12:19
8 ядер 32ГБ ОЗУ и винты по 10000
13 vs84
 
20.07.11
12:19
самый оптимальный вариант:
14 TocTep
 
20.07.11
12:19
строка повторяется 250 000 раз
15 vs84
 
20.07.11
12:21
(0) поменяй бгсСерииНоменклатуры на бггСерииНоменклатуры
16 TocTep
 
20.07.11
12:21
Это оптимально)))
17 TocTep
 
20.07.11
12:22
СоздатьНаборЗаписей() - Й не влез
18 simol
 
20.07.11
12:23
Сделай набор общий и запиши его один раз
19 TocTep
 
20.07.11
12:24
угу и все записи регистра похерить?
сам регистр состоит из 3 млн записей
20 Mort
 
20.07.11
12:43
Используй транзакции блоками.
21 RomaH
 
naïve
20.07.11
12:46
а если читать наборы по номенклатуре, а потом менять только необходимые серии?
22 RomaH
 
naïve
20.07.11
12:46
НаборЗаписей.Отбор.СерияНоменклатуры.Установить(Справочники.бгсСерииНоменклатуры.ПустаяСсылка(),ИСТИНА); - это исключить
23 H A D G E H O G s
 
20.07.11
12:52
Была, была подобная ветка...
24 H A D G E H O G s
 
20.07.11
12:52
*** так зло, с прищуром....
25 assasu
 
20.07.11
12:53
(19) а каков глубинный смысл этого регистра
26 H A D G E H O G s
 
20.07.11
12:53
Юннат тоже утверждал, что запись тормозит.
Мы уж и индексы отключали, и измерения местами меняли и вывод статуса на экран отключали...
27 H A D G E H O G s
 
20.07.11
12:53
А все оказалось дико проще.

Жаль, архив отключен, найти не могу...
28 IKSparrow
 
20.07.11
12:55
Я бы предложил взять в руки ассемблер... Но кто из нынешних 1Сников знает, что это такое...?
29 Fragster
 
гуру
20.07.11
12:55
если % записей больше определенного от общего количества, то быстрее прочитать все без отбора, поменять нужные, записать все бехз отбора. но 2гб на клиенте может не хватить, надо на сервере делать, причем 64битном, если не хватает
30 Fragster
 
гуру
20.07.11
12:56
% определяется опытным путем, обычно 10-20
31 Mort
 
20.07.11
13:52
(28) Ну ты, видимо, наверняка знаешь. Расскажи неучам как его использовать в данной ситуации.
32 mishgan75
 
20.07.11
14:06
+(29) абсолютно согласен, можно также извратиться с отбором и вид сравнения поставить в списке, и в значение отбора положить массив номенклатуры.
33 Fragster
 
гуру
20.07.11
14:11
(32) там может быть только вид сравнения "равно"
34 hhhh
 
20.07.11
14:31
(19) а зачем 2 раза регистрировать изменения? в ПриЗаписи() регистра они и так регистрируются.
35 TocTep
 
20.07.11
14:32
я тоже думаю, что решение есть!!!!
отбор по списку не работает
36 TocTep
 
20.07.11
14:32
изменить нужно ресурс согласно отбора
37 TocTep
 
20.07.11
14:33
H A D G E H O G s - вспомнил решение?
38 hhhh
 
20.07.11
14:37
(37) может транзакции спасут гиганта мысли? По 100-200 номенкклатур в каждой транзакции.
39 Fragster
 
гуру
20.07.11
14:39
(34) а если авторегистрации нет?
40 hhhh
 
20.07.11
14:42
(39) наоборот, если авторегистрация, то на уровне платформы регистрируется, а если авторегистрации нет, то в подписках ПередЗаписью и ПриЗаписи. Наверняка у него в подписках всё это есть.
41 TocTep
 
20.07.11
14:44
авторегистрации нет
при транзакции Записать(); - будет делать столько же раз с тойже скоростью?
42 ДенисЧ
 
20.07.11
14:45
Код в транзакции выполняется?

Если попробовать кусками писать?
43 МихаилМ
 
20.07.11
14:49
СоздатьНаборЗаписе - это опечатка ?
44 Широкий
 
20.07.11
14:50
НаборЗаписей.Прочитать(); -сколько времени жрется на это?

Попробуй данные запросом вытащь.. чтение набора записей не юзать
45 Fragster
 
гуру
20.07.11
14:51
кстати, "прочитать"  действительно здесь нафиг не сдалось
46 Широкий
 
20.07.11
14:52
(45) он скидку меняет
47 TocTep
 
20.07.11
14:53
43 - да
45 - нужно ... если есть др вариант напишите
48 RomaH
 
naïve
20.07.11
14:58
(47) зачем?
два измерения
по обоим отбор на равенство
запись только одна

тут вообще через менеджер можно

... единственное - если не нашли запись, то ничего не создается - но это решается запросом и отбором только необходимых записей

в общем код не оптимален - у тебя пустых наборов сколько записывается?
49 hhhh
 
20.07.11
15:01
(41) причем тут записать()? у тебя сейчас допустим 100000 транзакций, а если сделаешь их порциями, то будет например 1000 транзакций. Ощущаешь разницу?
50 Широкий
 
20.07.11
15:01
(48)(49) Регистр может быть периодическим/подчинен регистратору.. возможно автор не указал это
51 hhhh
 
20.07.11
15:03
(50) ЗначенияСвойствХарактеристик ?? подчинен регистратору?
52 RomaH
 
naïve
20.07.11
15:03
(50) тогда в отборе должен быть период и регистратор, не так?
53 TocTep
 
20.07.11
15:04
52 - нет
54 RomaH
 
naïve
20.07.11
15:04
НаборЗаписей.Прочитать();
   для каждого запись из НаборЗаписей цикл
       запись.Скидка=Скидка;
   конеццикла;
   НаборЗаписей.Записать();//при мониторинге производ. это срока

как минимум так:

 НаборЗаписей.Прочитать();
   для каждого запись из НаборЗаписей цикл
       запись.Скидка=Скидка;
       ЗаписатьНабор = Истина;
   конеццикла;
   Если ЗаписатьНабор Тогда
       НаборЗаписей.Записать();//при мониторинге производ. это срока
55 Широкий
 
20.07.11
15:05
(51) ЗначенияСвойствХарактеристик в типовых нет..
а вот бгсЗначенияСвойствХарактеристик вполне возможно
56 Широкий
 
20.07.11
15:05
(54) Да запросом надо данные считать.. там же и проверить менялась ли скидка
57 TocTep
 
20.07.11
15:06
48 при одном прочтении - 1 строчка
54 - у меня нет пустых наборов
55- регистр не типовой
56- это изменения их точно надо применять в проверке не нуждается
58 Fragster
 
гуру
20.07.11
15:38
(57) ставь номер поста, на который отвечаешь в скобочки
59 TocTep
 
20.07.11
15:39
(48) при одном прочтении - 1 строчка
(54) - у меня нет пустых наборов
(55)- регистр не типовой
(56)- это изменения их точно надо применять в проверке не нуждается
60 Kuein
 
20.07.11
15:59
(0) Попробуйте выяснить почему НаборЗаписей.Записать() жрет столько времени. Может быть там в модуле регистра процедура ПриЗаписи() вызывающая десятка полтора других процедур из разных модулей? Ситуация абсолютно реальная, приходилось сталкиваться.
61 TocTep
 
20.07.11
16:28
(60) пусто
62 TocTep
 
22.07.11
10:23
Форумчанне дайте совет по оптимизации
63 Fragster
 
гуру
22.07.11
10:27
(62) а совет писать либо все сразу, либо в транзакции по 100-1000 штук чем не угодил?
64 rutony
 
22.07.11
11:34
(62) Кучу советов дали же:
1) Попробовать обработать через менеджер (самому приходилось сталкиваться с тем что он работает в разы быстрее)
2) Сделать дополнительные проверки, меняется ли скидка
3) Порезать набор на Н-частей
4) Индексирование
5) Получение данных из запроса (на получение же данных тратиться 2-3 часа)

Это все дело теста, универсальную панацею никто не даст
65 TocTep
 
22.07.11
12:03
(64)
1. пробую
2. сделал, еще до того как на форум написал
3. производительность ухудш. на 10%
4. скулем?
5. если я будут получать данные запрос, то как мне менять их ?
66 rutony
 
22.07.11
12:08
(65)
4. индексирование измерений у регистра
5. менеджером + при этом постараться избавиться от "трех точек" в цикле:
Справочники.бгсСерииНоменклатуры.ПустаяСсылка()
такие вещи сильно посаживают производительность
67 TocTep
 
22.07.11
13:01
НаборЗаписей=РегистрыСведений.бгсЗначенияСвойствХарактеристик.СоздатьМенеджерЗаписи();
НаборЗаписей.Номенклатура=Номенклатура;
НаборЗаписей.СерияНоменклатуры=Серия;
НаборЗаписей.Скидка=Скидка;
НаборЗаписей.Записать();
НаборЗаписей=РегистрыСведений.бгсЗначенияСвойствХарактеристик.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура,ИСТИНА);
НаборЗаписей.Отбор.СерияНоменклатуры.Установить(Серия,ИСТИНА);
НаборЗаписей.Прочитать();

ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов,НаборЗаписей);

Скорость увеличил на 5%

Подскажите, как заменить этот кусок кода
НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура,ИСТИНА);
НаборЗаписей.Отбор.СерияНоменклатуры.Установить(Серия,ИСТИНА);
НаборЗаписей.Прочитать();