Имя: Пароль:
1C
1С v8
v8: Как оценить "тяжесть" регистров?
,
0 H A D G E H O G s
 
15.10.12
11:54
День добрый.
Как оценить "тяжесть" записи/удаления записи регистра. Неважно, сведений ли, накоплений.
Именно в момент работы 1С: Предприятия. Я пока вижу 2 метода
1) Собирать и хранить статистику по предыдущим записям
2) Аналитически - смотреть количество записей в регистре и число индексированных измерений и примерно коэффициенты "веса" на эти показатели накинуть.
1 Maxus43
 
15.10.12
11:55
замер производительности не то? какую оценку надо?
2 H A D G E H O G s
 
15.10.12
11:56
(1) Мерять надо в 1С: Предприятия. Не хотелось бы Внешку цеплять конечно.
3 H A D G E H O G s
 
15.10.12
11:56
(1) По времени выполнения.
4 Maxus43
 
15.10.12
11:59
именно мониторить надо? просто если предположить что время записи одно и тоже под всеми юзерами в определённый момент времени - 1 раз сделать замер, не мониторя постоянно
5 milan
 
15.10.12
12:28
(0) в БСП есть оценка производительности, не запускал еще
6 Fragster
 
гуру
15.10.12
12:29
(0) переменная глобального модуля с массивом для файлового ну и там покрутить, мой велосипед (зачеркнуто) мегамодуль АПДЕКС

// инициализирует подсистему
Процедура Инициализировать() Экспорт
   глАпдекс = Новый Структура;
   глАпдекс.Вставить("Таймеры", Новый Соответствие);
   глАпдекс.Вставить("ИмяКомпьютера", ИмяКомпьютера());
   глАпдекс.Вставить("ПоследнийИД", 0);
   Попытка
       мЯваСкрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
       мЯваСкрипт.Language = "javascript";
       глАпдекс.Вставить("js", мЯваСкрипт);
   Исключение
       #Если клиент Тогда
           Сообщить("Не получилось создать высокоточный таймер, точность замеров производительности будет снижена!", СтатусСообщения.Информация);
       #КонецЕсли
       глАпдекс.Вставить("js", Неопределено);
   КонецПопытки;
КонецПроцедуры

// функция для получения даты. должна возвращать значение,
// которое можно отнять от другого такого же значения
// например дату. Ну, или число.
Функция ПолучитьДату()
   Если глАпдекс.js = Неопределено Тогда
       Возврат ТекущаяДата() - '00010101';
   Иначе
       Возврат глАпдекс.js.Eval("(new Date()).valueOf()")/1000;
   КонецЕсли;
КонецФункции

// Получает таймер из хранилища таймеров
Функция ПолучитьТаймер(ид)
   Таймер = глАпдекс.Таймеры[ид];
   Если Таймер = Неопределено Тогда
       ВызватьИсключение "Неизвестный идентификатор таймера "+ид;
   КонецЕсли;
   Возврат Таймер;
КонецФункции

// Инициализирует таймер и сохраняет его в хранилище таймеров
Функция Старт(Показатель, Хранилище = Неопределено, Ссылка = Неопределено) Экспорт
   Таймер = Новый Структура;
   Таймер.Вставить("НеЗаписывать", Показатель.НеЗаписывать);
   Таймер.Вставить("Показатель", Показатель);
   Таймер.Вставить("ИнформационнаяБаза", ПараметрыСеанса.ИБЭтогоУзла);
   Таймер.Вставить("Пользователь", ПараметрыСеанса.ТекущийПользователь);
   Таймер.Вставить("Этап", 1);
   Таймер.Вставить("ИмяКомпьютера", глАпдекс.ИмяКомпьютера);
   Таймер.Вставить("УИД", Строка(Новый УникальныйИдентификатор));
   Таймер.Вставить("Хранилище", Хранилище);
   Таймер.Вставить("Ссылка", Ссылка);
   Таймер.Вставить("Дата", ПолучитьДату());
   Ид = глАпдекс.ПоследнийИД + 1;
   глАпдекс.Таймеры.Вставить(Ид, Таймер);
   глАпдекс.ПоследнийИД = Ид;
   
   Возврат Ид
КонецФункции

// Сохраняет данные таймера в регистр статистики
Процедура Записать(Таймер, Время)
   Если Таймер.НеЗаписывать Тогда
       Возврат;
   КонецЕсли;
   Запись = РегистрыСведений.СтатистикаАпдекс.СоздатьМенеджерЗаписи();
   ЗаполнитьЗначенияСвойств(Запись,Таймер);
   Запись.Время = Время;
   Запись.Период = ТекущаяДата();
   Запись.Записать();
КонецПроцедуры

// Сохраняет время "круга", например, когда показатель состоит из нескольких этапов
// Приостановленный таймер запускается снова
Процедура Отметка(ид) Экспорт
   Таймер = ПолучитьТаймер(ид);
   ТекДата = ПолучитьДату();
   Отметка = 0;
   Если Не Таймер.Свойство("Приостановлено", Отметка) Тогда
       Отметка = ТекДата;
   КонецЕсли;
   Записать(Таймер, Отметка - Таймер.Дата);
   Таймер.Дата = ТекДата;
   Таймер.Этап = Таймер.Этап + 1;
КонецПроцедуры

// Сохраняет время с последней отметки и удаляет таймер из хранилища
Процедура Стоп(ид) Экспорт
   Таймер = ПолучитьТаймер(ид);
   ТекДата = ПолучитьДату();
   Отметка = 0;
   Если Не Таймер.Свойство("Приостановлено", Отметка) Тогда
       Отметка = ТекДата;
   КонецЕсли;
   Записать(Таймер, Отметка - Таймер.Дата);
   глАпдекс.Таймеры.Удалить(Ид);
КонецПроцедуры

// Удаляет таймер из хранилища
Процедура Отмена(ид) Экспорт
   глАпдекс.Таймеры.Удалить(Ид);
КонецПроцедуры

// устанавливает ссылку и/или хранилище у уже запущенного таймера
Процедура УстановитьДопПараметры(ид, Хранилище = Неопределено, Ссылка = Неопределено) Экспорт
   Таймер = ПолучитьТаймер(ид);
   Если ЗначениеЗаполнено(Хранилище) Тогда
       Таймер.Хранилище = Хранилище;
   КонецЕсли;
   Если ЗначениеЗаполнено(Ссылка) Тогда
       Таймер.Ссылка = Ссылка;
   КонецЕсли;
КонецПроцедуры

// приостанавливает таймер
Процедура Приостановить(ид) Экспорт
   Таймер = ПолучитьТаймер(ид);
   Если Не Таймер.Свойство("Приостановлено") Тогда
       Таймер.Вставить("Приостановлено", ПолучитьДату(    ));
   КонецЕсли;
КонецПроцедуры

// Запускает приостановленный таймер
Процедура Восстановить(ид) Экспорт
   Таймер = ПолучитьТаймер(ид);
   Приостановлено = Неопределено;
   Если Таймер.Свойство("Приостановлено", Приостановлено) Тогда
       Таймер.Дата = Таймер.Дата + ПолучитьДату() - Приостановлено;
       Таймер.Удалить("Приостановлено");
   КонецЕсли;
КонецПроцедуры

Обработка ожидания по сбрасыванию инфы в базу...
7 Fragster
 
гуру
15.10.12
12:30
или под "тяжесть" понимается оценка добавляемого занятого места в БД?
8 H A D G E H O G s
 
15.10.12
12:31
(6) Все таки таймер.
(7) Нет, время выполнения.
Балансирую разбиение регистров по фоновым задачам.
9 H A D G E H O G s
 
15.10.12
12:31
Ты так же делал?
10 Fragster
 
гуру
15.10.12
12:32
(9) делал по принципу "электронной очереди", но там дрючение базы постоянное. как взаимодействовать между фоновыми заданиями - не придумал :(
11 Fragster
 
гуру
15.10.12
12:33
параллельное проведение одного документа не делал, только массовое
12 H A D G E H O G s
 
15.10.12
12:35
(11) Вон оно че..
13 H A D G E H O G s
 
15.10.12
12:35
(10) Взаимодействовать через ВременноеХранилище, но у вас 8.1 вроде.
14 H A D G E H O G s
 
15.10.12
12:36
мЯваСкрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
       мЯваСкрипт.Language = "javascript";
       глАпдекс.Вставить("js", мЯваСкрипт);

Бррр, не хочетца чето такое делать.
15 Fragster
 
гуру
15.10.12
12:36
(13) да, 8.1
16 H A D G E H O G s
 
15.10.12
12:36
Интересно, как 1С замутило замер. Надо глянуть.
17 Fragster
 
гуру
15.10.12
12:37
(14) в клюшках был гетперфоманскаунтер, в v8 просрали :(
18 H A D G E H O G s
 
15.10.12
12:37
Кстати, ВременноеХранилище - это тупо запись в файл.
19 Fragster
 
гуру
15.10.12
12:38
у яваскрипта разрешение 15-16мс
20 H A D G E H O G s
 
15.10.12
12:38
(19) Да нее, там всякие косяки по правам могут быть.
21 Fragster
 
гуру
15.10.12
12:40
(20) да, у меня на паре рабочих мест почему-то js не инициализируется :)
22 acsent
 
15.10.12
12:42
(18) почему файл, а не просто в памяти держит? откуда знаешь?
23 Fragster
 
гуру
15.10.12
12:42
(21)+ но мне пофиг, я измеряю общее время проведения, время выполнения отчетов. регистр потом по РИБ наверх полднимается, строится отчет, анализируются причины, и т.п.
24 acsent
 
15.10.12
12:43
1с юзает компоненту для точных счетчиков
25 acsent
 
15.10.12
12:43
(24) КипВнешнийКомпонент
26 H A D G E H O G s
 
15.10.12
12:44
(22) Потому что ProcessMonitor.exe

В файловом - это файл 1Cv8tmp.1CD
В серверном - это temp файл.
27 H A D G E H O G s
 
15.10.12
12:44
(25) Спасибо.
28 H A D G E H O G s
 
15.10.12
12:44
Вообще с ВременнымХранилищем - феерия творицца.
29 Fragster
 
гуру
15.10.12
12:58
ИМХО замерить время записи одного набора в рамках проведения документа сложно - велико влияние времени фиксации транзакции. а если "отложенная" запись, то можно очень, очень сильно попасть
30 Axel2009
 
15.10.12
12:59
(0) по каким критериям будешь замерять запись в 1 регистр? что за события?
31 H A D G E H O G s
 
15.10.12
13:03
(29) Вот я и попробую.Все равно я примерно ориентируюсь, где тяжелый регистр, а где легкий.
32 Axel2009
 
15.10.12
13:06
(29) куда отложенная?
33 Fragster
 
гуру
15.10.12
13:06
(31) ну, прибивание "ненужных" индексов позволило ускорить запись одного заляпушного регистра (история его возникновения - отдельная) на 50%, что сократило время проведения в некоторых случаях на 40%

но я ориентировался на показания общего времени проведения с перепроведением с замером отладчиком и профайлером самых тяжелых документов и вдумчивым анализом данных.
34 Fragster
 
гуру
15.10.12
13:06
(32) ну блин, отложенную запись никогда не делал?
35 Axel2009
 
15.10.12
13:08
(34) создавать записи не вместе с проведением, а потом роботом?
36 H A D G E H O G s
 
15.10.12
13:08
(33) Я подкоплю сначало статистику на каком- нибудь дружественном клиенте с многими пользователями. Посмотрю разброс. Потом репу чесать буду.
37 Fragster
 
гуру
15.10.12
13:38
кстати, есть ли способ скопировать структуру кроме как ЗначениеИзСтрокиВнутр(ЗначениВСтрокуВнутр(Структура))?
38 H A D G E H O G s
 
15.10.12
13:43
Перебором
39 Fragster
 
гуру
15.10.12
13:46
(38) не, лучше уж через значение в строку пусть будет...
Закон Брукера: Даже маленькая практика стоит большой теории.