|
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) не, лучше уж через значение в строку пусть будет...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |