Автор Тема: Семантика SHORT(x) в Компонентном Паскале  (Прочитано 33362 раз)

X512

  • Newbie
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #90 : Январь 24, 2013, 06:23:22 am »
Относительно возможности открытия больших текстов в BlackBox.
BlackBox не загружает содержимое в память, он читает текст из файла используя кеширование. Но Piece'ы загружаются в память полностью. Поэтому текст с большим количеством не Latin-1 символов может забить память Piece'ами и привести к жутким тормозам. Можете открыть HeapSpy и посмотреть как чередуются в памяти Piece и LPiece. Тормоза можно убрать, если отключить генерацию коротких Piece'ов, записывая все символы только в UTF-16. Для этого можно сделать такой хак в модуле TextModels:
PROCEDURE (wr: StdWriter) WriteChar (ch: CHAR);
VAR t: StdModel; u, un: Run; lp: LPiece; pos, spillPos: INTEGER;
fw: Files.Writer; op: EditOp; bunch: BOOLEAN;
BEGIN
IF ch = 200BX THEN wr.WriteChar(zwspace)
ELSIF ch = 2010X THEN wr.WriteChar(hyphen)
ELSIF ch = 2011X THEN wr.WriteChar(nbhyphen)
ELSE
После него BlackBox сразу открывает файлы даже размером в полтора гигабайта (предварительно сконвентированные в ODC; если этого не сделать, то BlackBox будет сам конвертировать при загрузке в %temp%). Ничего не тормозит вообще, только полоса прокрутки глючит. Потребление памяти при этом - около 500 КБ. Очень большие файлы открыть нельзя ввиду того, что для задания позиций и размеров используется INTEGER (в соответствии с сообщением о языке его размер - 4 байта).

Видимо эти LPiece'ы были добавлены бездумно без учёта последствий. К тому же насколько мне известно BlackBox разрабатывали немцы, а им юникод не нужен.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #91 : Январь 24, 2013, 06:32:17 am »
Короче вот они, последствия преждевременной оптимизации -- стреляют ещё как.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

X512

  • Newbie
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #92 : Январь 24, 2013, 06:34:27 am »
Короче вот они, последствия преждевременной оптимизации -- стреляют ещё как.
Где тут про преждевременную оптимизацию? Просто криво поддержку юникода ввели...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #93 : Январь 24, 2013, 07:28:36 am »
Короче вот они, последствия преждевременной оптимизации -- стреляют ещё как.
Где тут про преждевременную оптимизацию? Просто криво поддержку юникода ввели...
При этом заоптимизировали эту поддержку для уменьшения объёма файлов...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

X512

  • Newbie
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #94 : Январь 24, 2013, 08:33:36 am »
При этом заоптимизировали эту поддержку для уменьшения объёма файлов...
Скорее для совместимости со старыми версиями без поддержки юникода так сделали, а не из-за размера. У старых версий BlackBox'а LPiece'ов не было.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Семантика SHORT(x) в Компонентном Паскале
« Ответ #95 : Январь 24, 2013, 09:24:52 am »
Относительно возможности открытия больших текстов в BlackBox.
BlackBox не загружает содержимое в память, он читает текст из файла используя кеширование. Но Piece'ы загружаются в память полностью. Поэтому текст с большим количеством не Latin-1 символов может забить память Piece'ами и привести к жутким тормозам. Можете открыть HeapSpy и посмотреть как чередуются в памяти Piece и LPiece. Тормоза можно убрать, если отключить генерацию коротких Piece'ов, записывая все символы только в UTF-16. Для этого можно сделать такой хак в модуле TextModels:
PROCEDURE (wr: StdWriter) WriteChar (ch: CHAR);
VAR t: StdModel; u, un: Run; lp: LPiece; pos, spillPos: INTEGER;
fw: Files.Writer; op: EditOp; bunch: BOOLEAN;
BEGIN
IF ch = 200BX THEN wr.WriteChar(zwspace)
ELSIF ch = 2010X THEN wr.WriteChar(hyphen)
ELSIF ch = 2011X THEN wr.WriteChar(nbhyphen)
ELSE
После него BlackBox сразу открывает файлы даже размером в полтора гигабайта (предварительно сконвентированные в ODC; если этого не сделать, то BlackBox будет сам конвертировать при загрузке в %temp%). Ничего не тормозит вообще, только полоса прокрутки глючит. Потребление памяти при этом - около 500 КБ.

Спасибо. Это действительно объясняет результаты этого эксперимента: http://oberspace.dyndns.org/index.php/topic,408.msg12256.html#msg12256

Ключевое слово - ASCII.
Y = λf.(λx.f (x x)) (λx.f (x x))