Нужен совет опытных программистов

fedotxxl

Well-Known Member
09.11.2005
614
0
#1
Задача: Написать систему логирования LS кода, подсчета производительности (как долго исполняется LS код) и учета ошибок.
Цель: получить удобную среду контроля исполнения кода. Среда будет использоваться только разработчиком, так что нужно решить, какие функции нужны, какие нет и как делать
Что нужно получить на выходе: отчет вида (это мой вариант, может вы придумаете более информативный отчет) :
Саб1 "Зашел в агент"
Саб1 "Получение документов" 12мс
Саб1\Саб2 "Зашел в Саб2"
и т.д.

Вот тут-то и возникает несколько вопросов:
1. Как делать?
1.1 Можно в начале и в конце каждого саба написать wf.SubStart(Title), wf.SubEnd(Title). Преимущества - строится в памяти дерево сабов, запоминается в каком сабе мы находимся. Недостатки - в начале и конце каждого саба нужно что-то писать
1.2 Можно при исполнении каждого события считывать в каком сабе мы находимся и вызываемые ранее сабы (Lsi_info(14)). Преимущество - не требуется дополнительный код в начале и в конце саба. Недостатки - сложно построить и контролировать дерево сабов (имеет ли смысл его строить?)
2. Как хранить данные?
Я набросал быстро класс, в который можно положить любой объект по айдишнику и получить обратно соотв.
2.1. В случае, когда у нас построено дерево сабов (каждому сабу соотв объект "Саб") логично в каждом объекте "Саб" хранить объект "Коллекция"
2.2.1 Когда у нас нет дерева сабов, можно это дерево составить из "Коллекция", вложенных друг в друга. Т.е. в коллекция "Саб1" буду вложены события "Зашел в агент", "Получение документов", а также коллекция "Саб1\Саб2". Таким образом для каждого саба создается своя коллекция
2.2.2 Но насколько просто построить дерево из коллекций? Проще хранить все в одной коллекции и айдишниками "Саб1\Саб2\Название_События". Это гораздо проще, но может быть медленее и в памяти не строится дерево сабов
3. Делать ли "дочерние действия"
В событии "Получение документов", которое занимает, предположим, 10 строк, может быть собите "Подключение к представлению". Делать ли так, что событие "Подключение к представлению" было ответным к событию "Получение документов" или же сделать плоско?

Никто базу от меня не требует, хочется написать для себя... Так что помогите определиться с функционалом и с реализвацией
 

fedotxxl

Well-Known Member
09.11.2005
614
0
#3
Для: Omh
И? Я же не могу приказать всем включить дебаг режим... Потом время исполнения посчитать не сложно, вот сохранить правильно это не легко. + писать отдельно время исполнения, логирование и детектор ошибок нелогично.
Вобщем, я говорил не об этом... Прочто внимательно полностью мой пост
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#4
Для: fedotxxl
Imho, e тебя много свободного времени.
Тебе уже правильно ответили на intertrust'e: лучше почитай "Performance Considerations for Domino Applications" и не будет проблем :)
 

fedotxxl

Well-Known Member
09.11.2005
614
0
#5
Для: Omh
=) Я уже ответил там. Время есть и я его хочу потратить в полезном направлении
Разве не удобно иметь парочку команд, которые будут писать логи не в Log.nsf, а в отдельный документ, наблюдать, какие функции долго работают и т.д.? Впринципе, все это я мог сделать и сам, но получилось бы не наилучшим способом... Поэтому я и спрашиваю, как лучше сделать? Так или же вот так

По поводу книги - нет ничего лучше практики. Доказано, что из книги усваивается только 20% информации (у меня и того меньше =))... Точнее не усваивается, а запоминается. Поэтому парочку раз разобраться, почему код долго работает, лучше, чем прочитать книгу. ИМХО
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
#6
ты в какой-то теме подобный вопрос писал... я еще тогда спросил "не логирование ли задумано?" :)
но это лишь лирическое вступление ;)

я тогда попробовал поработать с Ls_info() и обнаружил, что иногда при вызове функции клиент валиться с нсд. у меня вызов был организован таким образом: рекурсивная функция просто читала и принтила значение Ls_info(14), так вот на вызове так 16-17 всегда, стабильно валился клиент :)

я тогда так и не обнаружил причины - лениво было ;) но запомнил, что с ней надо быть осторожным.
не просто так она недокументированна...

кроме того Ls_info(14) (на том же intertruste есть) выводит вместо имени библиотеки каки-то коды, если на клиенте, а на сервере нормально - имя...

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

fedotxxl

Well-Known Member
09.11.2005
614
0
#7
Для: Akupaka
Ничего умнее не могу придумать, чем писать wf.ExitSub и перед выходом по обработчику (Exit Sub)...

Ls_info(14) не очень конечно удобно возвращает, но какая-то закономерность есть. А на сервере или же на клиенте код исполняется можно... так что распарсить ответь реально
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
#8
ты не понял, распарсить-то без проблем, и достаточно удобно, просто в зависимости от того где выполняется, возвращается строчка подобная этой:
"124322, SomeSub" - на коиенте, "lib1, SomeSub" - на сервере
 

fedotxxl

Well-Known Member
09.11.2005
614
0
#9
Для: fedotxxl
Так ведь можно определить, где код исполняется... По-моему, если на сервере, то NotesSession.Server <> "", если равно пустоте - клиент

Все-таки писать какой-то код в начале и конце каждого саба не очень-то удобно =(.
Есть ли соображения по поводу второго и третьего пункта