OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 12:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
СообщениеДобавлено: Четверг, 09 Июнь, 2011 16:42 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Прикрепил к первому сообщению версию 0.32 Старые убрал в архив

Исправлена ошибка нарушения предусловий TextModel.Modify в некоторых случаях


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Август, 2013 04:58 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
У меня возникла одна идея когда работал над подсветкой скобок. Сейчас они удаляются так-же тупо, сканированием ВСЕГО текста. Другого пути нет в ББ, к сожалению. Если бы был некий глобальный список линеек, а каждая линейка бы знала свою позицию, то вычисление этого алгоритма, выделенного красным, было бы гораздо быстрее. Давайте подумаем, как изменить каркас, чтобы осуществить это. Тогда многие текстовые алгоритмы удаться ускорить и устранить позорные тормоза.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Август, 2013 09:53 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Мне кажется, что линейки можно таки победить кэшированием. Там даже вроде была попытка, но не допилили... Нужно попробовать оживить сей механизьм.

Код:
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;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Август, 2013 10:37 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Любопытно, что если закомментировать красную строчку, то становится значительно лучше, но проблема не исчезает полностью...
Где-то еще остается вызов 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;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Август, 2013 10:52 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Иван Денисов писал(а):
Давайте подумаем, как изменить каркас, чтобы осуществить это. Тогда многие текстовые алгоритмы удаться ускорить и устранить позорные тормоза.

Тут я всеми руками за, но с одной оговоркой... Для начала, на мой взгляд, нужно подумать над разработкой нормальных инструментов анализа системы. Хоть убейте, не представляю как можно архитектурить без профилировщика. Это езда с закрытыми глазами. В ББ реально трудно найти источник проблемы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Январь, 2014 17:15 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Борис, у вас версия 0.32 еще для ББ 1.5 раз там импорт National. А свежая версия имеется для 1.6?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Январь, 2014 17:20 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Нет. Я этот National просто копирую к себе в 1.6 и не парюсь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Январь, 2014 17:45 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Ок, понял про 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 ничего не поменялось...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 02 Январь, 2014 17:53 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Нет. Я пока по уши в работе. На ББ времени совсем нет.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB