OberonCore https://forum.oberoncore.ru/ |
|
Smart - всякие полезности, облегчающие кодинг в BlackBox https://forum.oberoncore.ru/viewtopic.php?f=47&t=3360 |
Страница 3 из 3 |
Автор: | ilovb [ Четверг, 09 Июнь, 2011 16:42 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
Прикрепил к первому сообщению версию 0.32 Старые убрал в архив Исправлена ошибка нарушения предусловий TextModel.Modify в некоторых случаях |
Автор: | Иван Денисов [ Среда, 28 Август, 2013 04:58 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
У меня возникла одна идея когда работал над подсветкой скобок. Сейчас они удаляются так-же тупо, сканированием ВСЕГО текста. Другого пути нет в ББ, к сожалению. Если бы был некий глобальный список линеек, а каждая линейка бы знала свою позицию, то вычисление этого алгоритма, выделенного красным, было бы гораздо быстрее. Давайте подумаем, как изменить каркас, чтобы осуществить это. Тогда многие текстовые алгоритмы удаться ускорить и устранить позорные тормоза. |
Автор: | ilovb [ Среда, 28 Август, 2013 09:53 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
Мне кажется, что линейки можно таки победить кэшированием. Там даже вроде была попытка, но не допилили... Нужно попробовать оживить сей механизьм. Код: PROCEDURE CacheIndex (key, start: INTEGER): INTEGER;
VAR i: INTEGER; BEGIN RETURN -1; (* АХТУНГ !*) i := 0; WHILE (i < boxCacheLen) & ~((boxCache[i].key = key) & (boxCache[i].start = start)) DO INC(i) END; IF i = boxCacheLen THEN i := -1 END; RETURN i END CacheIndex; |
Автор: | ilovb [ Среда, 28 Август, 2013 10:37 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
Любопытно, что если закомментировать красную строчку, то становится значительно лучше, но проблема не исчезает полностью... Где-то еще остается вызов ReadPrevView, и на него приходится уже примерно 60% времени. (вместо прежних 99%) Цитата: PROCEDURE (s: StdSetter) GetLine (start: INTEGER; OUT box: LineBox);
________VAR rd: Reader; ra: TextRulers.Attributes; brk: LineBox; ____________d, off, right, w: INTEGER; i, tabsN: INTEGER; form: SET; adj: BOOLEAN; ch: CHAR; ________PROCEDURE TrueW (VAR b: LineBox; w: INTEGER): INTEGER; ____________VAR i: INTEGER; type: SET; ________BEGIN ____________i := rd.tabIndex; ____________IF (0 <= i ) & (i < TextRulers.maxTabs) & (rd.string[0] # tab) THEN ________________type := rd.tabType * {TextRulers.centerTab, TextRulers.rightTab}; ________________IF type = {TextRulers.centerTab} THEN ____________________DEC(w, b.tabW[i] - MAX(minTabWidth, b.tabW[i] - w DIV 2)) ________________ELSIF type = {TextRulers.rightTab} THEN ____________________DEC(w, b.tabW[i] - MAX(minTabWidth, b.tabW[i] - w)) ________________END ____________END; ____________RETURN w ________END TrueW; ________PROCEDURE Enclose (VAR b: LineBox; w: INTEGER); ____________VAR off, i, d: INTEGER; type: SET; ________BEGIN ____________b.len := rd.pos - start; INC(b.right, w); ____________off := rd.attr.offset; i := rd.tabIndex; ____________IF rd.h - rd.dsc + off > b.asc THEN b.asc := rd.h - rd.dsc + off END; ____________IF rd.dsc - off > b.dsc THEN b.dsc := rd.dsc - off END; ____________IF rd.view # NIL THEN b.views := TRUE END; ____________IF (0 <= i ) & (i < TextRulers.maxTabs) THEN ________________IF rd.string[0] = tab THEN ____________________b.tabW[i] := w ________________ELSE ____________________type := rd.tabType * {TextRulers.centerTab, TextRulers.rightTab}; ____________________IF type = {TextRulers.centerTab} THEN ________________________d := b.tabW[i] - MAX(minTabWidth, b.tabW[i] - w DIV 2); ________________________DEC(b.tabW[i], d); DEC(b.right, d) ____________________ELSIF type = {TextRulers.rightTab} THEN ________________________d := b.tabW[i] - MAX(minTabWidth, b.tabW[i] - w); ________________________DEC(b.tabW[i], d); DEC(b.right, d) ____________________END ________________END ____________END ________END Enclose; ____BEGIN ________ASSERT(s.text # NIL, 20); ASSERT(0 <= start, 21); ASSERT(start <= s.text.Length(), 22); ________i := CacheIndex(s.key, start); ________IF i >= 0 THEN ____________GetFromCache(s, i, box) ________ELSE ____________TextRulers.GetValidRuler(s.text, start, s.rpos, s.ruler, s.rpos); ____________IF s.rpos > start THEN s.ruler := s.defRuler; s.rpos := -1 END; ____________box.ruler := s.ruler; box.rpos := s.rpos; ____________ra := s.ruler.style.attr; tabsN := ra.tabs.len; right := Right(ra, s.vw); ____________s.r := s.text.NewReader(s.r); ____________IF start = 0 THEN s.r.SetPos(start); ch := para ____________ELSE s.r.SetPos(start - 1); s.r.ReadChar(ch) ____________END; ____________s.r.Read; (* ____________IF s.r.char = para THEN box.rbox := ~s.hideMarks; box.bop := s.hideMarks; box.left := 0 ____________ELSIF ch = para THEN box.rbox := FALSE; box.bop := TRUE; box.left := ra.first ____________ELSE box.rbox := FALSE; box.bop := FALSE; box.left := ra.left ____________END; *) ____________IF s.r.char = para THEN box.rbox := TRUE; box.bop := FALSE; box.left := 0 ____________ELSIF ch = para THEN box.rbox := FALSE; box.bop := TRUE; box.left := ra.first ____________ELSE box.rbox := FALSE; box.bop := FALSE; box.left := ra.left ____________END; (**) ____________box.views := FALSE; ____________box.asc := 0; box.dsc := 0; box.right := box.left; ____________box.len := 0; box.adjOff := 0; box.spaces := 0; ____________brk.right := 0; ____ ____________s.rd := s.NewReader(s.rd); rd := s.rd; ____________rd.Set(s.r, s.text, box.left, start, box.ruler, box.rpos, s.vw, s.hideMarks); ____________rd.Read; ____________WHILE ~rd.eot & (box.right + (*rd.w*) TrueW(box, rd.w) <= right) ____________& ~(lineBreak IN rd.setterOpts) DO ________________IF ~(wordJoin IN rd.setterOpts) & (box.right + rd.endW <= right) THEN ____________________(*brk := box;*) ____________________brk.len := box.len; brk.ruler := box.ruler; brk.rpos := box.rpos; ____________________brk.left := box.left; brk.right := box.right; brk.asc := box.asc; brk.dsc := box.dsc; ____________________brk.rbox := box.rbox; brk.bop := box.bop; brk.adj := box.adj; brk.eot := box.eot; ____________________brk.views := box.views; brk.skipOff := box.skipOff; brk.adjOff := box.adjOff; ____________________brk.spaces := box.spaces; brk.adjW := box.adjW; ____________________i := 0; WHILE i < tabsN DO brk.tabW[i] := box.tabW[i]; INC(i) END; ____________________(*---*) ____________________Enclose(brk, rd.endW); ____________________brk.eot := rd.r.eot (* rd.r.eot one ahead of rd.eot *) ________________END; ________________box.adjOff := rd.adjStart - start; box.spaces := rd.spaces; ________________Enclose(box, rd.w); ________________rd.x := box.right; rd.Read ____________END; ____________IF (lineBreak IN rd.setterOpts) (* & ~box.rbox *) THEN Enclose(box, 0) END; ____________box.eot := rd.eot; adj := FALSE; box.skipOff := box.len; ____________IF box.right + rd.w > right THEN____(* rd.w > 0 => ~rd.eot & ~(lineBreak IN setterOpts) *) ________________IF ~(wordJoin IN rd.setterOpts) & (box.right + rd.endW <= right) THEN ____________________IF rd.string[0] = " " THEN DEC(box.spaces) END; ____________________Enclose(box, rd.endW); ____________________adj := TRUE ________________ELSIF brk.right > 0 THEN ____________________(*box := brk;*) ____________________box.len := brk.len; box.ruler := brk.ruler; box.rpos := brk.rpos; ____________________box.left := brk.left; box.right := brk.right; box.asc := brk.asc; box.dsc := brk.dsc; ____________________box.rbox := brk.rbox; box.bop := brk.bop; box.adj := brk.adj; box.eot := brk.eot; ____________________box.views := brk.views; box.skipOff := brk.skipOff; box.adjOff := brk.adjOff; ____________________box.spaces := brk.spaces; box.adjW := brk.adjW; ____________________i := 0; WHILE i < tabsN DO box.tabW[i] := brk.tabW[i]; INC(i) END; ____________________(*---*) ____________________box.skipOff := box.len - 1; adj := TRUE ________________ELSIF box.right = box.left THEN ____________________Enclose(box, rd.w) (* force at least one per line *) ________________END ____________ELSIF (box.right = box.left) & box.eot THEN ________________box.asc := ra.asc; box.dsc := ra.dsc____(* force empty line to ruler's default height *) ____________END; ____ ____________box.adj := FALSE; ____________d := right - box.right; ____________IF d > 0 THEN ________________form := ra.opts * adjustMask; ________________IF form = blocked THEN ____________________IF adj & (box.spaces > 0) THEN ________________________box.right := right; box.adj := TRUE; box.adjW := d ____________________END ________________ELSIF form = rightFlush THEN ____________________IF box.adjOff > 0 THEN ________________________box.adjW := d; box.adj := TRUE ____________________ELSE ________________________INC(box.left, d) ____________________END; ____________________box.right := right ________________ELSIF form = centered THEN ____________________IF box.adjOff > 0 THEN ________________________box.adjW := d DIV 2; box.adj := TRUE ____________________ELSE ________________________INC(box.left, d DIV 2) ____________________END; ____________________INC(box.right, d DIV 2) ________________END ____________END; ____________AddToCache(s.key, start, box) ________END; ________ASSERT(box.eot OR (box.len > 0), 100) ____END GetLine; |
Автор: | ilovb [ Среда, 28 Август, 2013 10:52 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
Иван Денисов писал(а): Давайте подумаем, как изменить каркас, чтобы осуществить это. Тогда многие текстовые алгоритмы удаться ускорить и устранить позорные тормоза. Тут я всеми руками за, но с одной оговоркой... Для начала, на мой взгляд, нужно подумать над разработкой нормальных инструментов анализа системы. Хоть убейте, не представляю как можно архитектурить без профилировщика. Это езда с закрытыми глазами. В ББ реально трудно найти источник проблемы. |
Автор: | Иван Денисов [ Среда, 01 Январь, 2014 17:15 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
Борис, у вас версия 0.32 еще для ББ 1.5 раз там импорт National. А свежая версия имеется для 1.6? |
Автор: | ilovb [ Среда, 01 Январь, 2014 17:20 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
Нет. Я этот National просто копирую к себе в 1.6 и не парюсь. |
Автор: | Иван Денисов [ Среда, 01 Январь, 2014 17:45 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
Ок, понял про National. ilovb писал(а): Мне кажется, что линейки можно таки победить кэшированием. Там даже вроде была попытка, но не допилили... Нужно попробовать оживить сей механизьм. Код: PROCEDURE CacheIndex (key, start: INTEGER): INTEGER; VAR i: INTEGER; BEGIN RETURN -1; (* АХТУНГ !*) i := 0; WHILE (i < boxCacheLen) & ~((boxCache[i].key = key) & (boxCache[i].start = start)) DO INC(i) END; IF i = boxCacheLen THEN i := -1 END; RETURN i END CacheIndex; А тут попытки были? Проверил в финальной версии 1.6 ничего не поменялось... |
Автор: | ilovb [ Четверг, 02 Январь, 2014 17:53 ] |
Заголовок сообщения: | Re: Smart - всякие полезности, облегчающие кодинг в BlackBox |
Нет. Я пока по уши в работе. На ББ времени совсем нет. |
Страница 3 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |