Иван Горячев писал(а):
Я тут немного поиздевался над динамическими строками.
Давайте погодим "издеваться"
, дождёмся, пока появится репозиторий, а то я уже кое-что добавил к подсистемам, а тут пришлось разбираться с версиями. За модуль StringsBase спасибо, я только хотел свой начать воплощать. Планировал заюзать (System)Mem, там как раз есть работа с динамическими массивами и предвыделение памяти.
Иван Горячев писал(а):
1422 msec - чтение, 2343 msec - запись по Timed execute, отжирает около 21 метра.
Выполнил простой код, без записи даже:
Код:
t:=Services.Ticks();
doc:=XmlcoreCmds.LoadXMLDocument('Xmlcore/Rsrc/antarctica.svg');
StdLog.String('read ');StdLog.Int(Services.Ticks()-t);
Получилось(в среднем) 20 сек., если демка выполняется сразу после запуска среды, и 100 сек., если выполнить демку ещё раз, предварительно выгрузив демо-модуль. Может это из-за тормознутости моей системы (AthlonXP+ 2500 XP, 1024 RAM, WinXP SP2), или неизвестно из-за чего ещё...
Включив запись в файл, так и не дождался окончания...
Иван Горячев писал(а):
Графического редактора под рукой проверить нет, но Firefox открывает оба, причём отрисовывает немножко по-разному
Ну, я тут в IncScape демки всякие рисовал, потом через Xmlcore пропускал... Всё вроде одно и то же, и редактор не ругался... Размеры файлов меняются на несколько килобайт, но это может происходить из-за смены кодировки, или из-за добавления whitespaces всяких... По крайней мере, валидацию проходят все записанные в последнее время файлы. Валидность файлов проверяю просмотром готового xml-файла в Internet Explorer, он там структуру рисует, если всё верно, или указывает место ошибки.
Иван Горячев писал(а):
Кстати, запись тоже была с косяком - доже строки.
Да, похоже это как раз то, что я поправил.
Иван Горячев писал(а):
А автора Basics нужно заставить вручную байты на компьютере персчитывать
Ага, точно. Это ж надо умудриться, для добавления символа в строку заниматься её копированием в новую строку...
Код из BasicsDynStrings:
Код:
PROCEDURE AddRight (inoutString: DynString; IN str: ARRAY OF CHAR);
(* str is added to content of string at the right side. *)
VAR newString: POINTER TO ARRAY OF CHAR;
BEGIN
NEW (newString, LEN (inoutString.content$) + LEN (str$) + 1);
newString^ := inoutString.content$ + str$;
inoutString.content := newString
END AddRight;
...и чуть ниже...
Код:
PROCEDURE (string: DynString) AddCharRight* (inChar: CHAR), NEW;
(* inChar is added at the right side of the content of string. *)
VAR str: ARRAY 2 OF CHAR;
oldLength: INTEGER;
BEGIN
oldLength := LEN (string.content$);
str[0] := inChar;
str[1] := 0X;
AddRight (string, str);
(* Post: string.Length = oldString.Length + 1 *)
Assert.PostStringValid (string.content);
Assert.PostStringLenOk (LEN (string.content$) = oldLength + 1, string.content$, oldLength + 1)
END AddCharRight;