powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание xml
20 сообщений из 45, страница 2 из 2
Создание xml
    #39482712
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUP.S. В тесте как раз разница в 50 раз относительно TStringList :)
TStringList люди-то для примера приводят. Никто в своём уме 1GB через TStringList перелопачивать не будет.
Скорее всего люди просто сделают Stream.Write(buffer, buffer_size). И какое преимуществу даст твой магический способ записи перед этим методом?
Можно ещё "подшаманить", чтобы в буфере было, к примеру, не менее 2048 байт в момент записи. Что там ещё за волшебные оптимизации могут быть, кроме как использование SSD? :-)
...
Рейтинг: 0 / 0
Создание xml
    #39482752
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUP.S. В тесте как раз разница в 50 раз относительно TStringList :)

Да уж. Быстродействие впечатляет.
...
Рейтинг: 0 / 0
Создание xml
    #39482763
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твое у меня выполняется за 700-900 мс.

А вот якобы быстрая XML писалка:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
  TSimpleXmlWriter = class
    Finished : boolean;
    Buff     : string;
    RLock    : boolean;
    WLock    : boolean;
    Writer   : ITask;

    procedure WriteToBuff(const Text: string);

    constructor Create(const AFileName: string);
    destructor Destroy; override;

    procedure OpenElement(const Name: string; const CloseTag: TXmlCloseTag);
    procedure CloseElement(const Name: string);
    procedure WriteAttribute(const Name: string; const Value: Integer; const CloseTag: TXmlCloseTag);
  end;

constructor TSimpleXmlWriter.Create(const AFileName: string);
begin
  Finished:=False;
  Writer:=TTask.Create(procedure ()
  var
    xBuff : TBytes;
    F     : TFileStream;
  begin
    F:=TFileStream.Create(AFileName,fmCreate,fmShareDenyNone);
    try
      while not Finished or (length(Buff)>0) do begin
        try
          if RLock then Continue;
          WLock:=True;
          if RLock then Continue;
          if length(Buff)>0 then begin
            xBuff:=TEncoding.UTF8.GetBytes(Buff);
            Buff:='';
            WLock:=False;
            F.Write(xBuff[0],length(xBuff));
          end;
        finally
          WLock:=False;
        end;
        Sleep(1);
      end;
    finally
      F.Free;
    end;
  end);
  Writer.Start;
  Buff:='<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
end;

destructor TSimpleXmlWriter.Destroy;
begin
  Finished:=True;
  TTask.WaitForAll([Writer]);

  inherited;
end;

procedure TSimpleXmlWriter.OpenElement(const Name: string; const CloseTag: TXmlCloseTag);
begin
  if CloseTag=xtClose then begin
    WriteToBuff('<'+Name+'>');
  end else begin
    WriteToBuff('<'+Name);
  end;
end;

procedure TSimpleXmlWriter.CloseElement(const Name: string);
begin
  WriteToBuff('</'+Name+'>');
end;

procedure TSimpleXmlWriter.WriteAttribute(const Name: string; const Value: Integer; const CloseTag: TXmlCloseTag);
begin
  if CloseTag=xtClose then begin
    WriteToBuff(' '+Name+'="'+Value.ToString+'">');
  end else begin
    WriteToBuff(' '+Name+'="'+Value.ToString+'"');
  end;
end;

procedure TSimpleXmlWriter.WriteToBuff(const Text: string);
begin
  RLock:=True;
  while WLock do sleep(0);
  Buff:=Buff+Text;
  RLock:=False;
end;

7.5 секунд.

Причем дело не в записи на диск.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
  TSimpleXmlWriter = class
    procedure WriteToBuff(const Text: string);

    constructor Create(const AFileName: string);
    destructor Destroy; override;

    procedure OpenElement(const Name: string; const CloseTag: TXmlCloseTag);
    procedure CloseElement(const Name: string);
    procedure WriteAttribute(const Name: string; const Value: Integer; const CloseTag: TXmlCloseTag);
  end;

constructor TSimpleXmlWriter.Create(const AFileName: string);
begin
end;

destructor TSimpleXmlWriter.Destroy;
begin
end;

procedure TSimpleXmlWriter.OpenElement(const Name: string; const CloseTag: TXmlCloseTag);
begin
  if CloseTag=xtClose then begin
    WriteToBuff('<'+Name+'>');
  end else begin
    WriteToBuff('<'+Name);
  end;
end;

procedure TSimpleXmlWriter.CloseElement(const Name: string);
begin
  WriteToBuff('</'+Name+'>');
end;

procedure TSimpleXmlWriter.WriteAttribute(const Name: string; const Value: Integer; const CloseTag: TXmlCloseTag);
begin
  if CloseTag=xtClose then begin
    WriteToBuff(' '+Name+'="'+Value.ToString+'">');
  end else begin
    WriteToBuff(' '+Name+'="'+Value.ToString+'"');
  end;
end;

procedure TSimpleXmlWriter.WriteToBuff(const Text: string);
begin
end;

Ибо этот "пустой" код выполняется аж за 5 секунд!
Неужели операции со строками настолько тормозные?
...
Рейтинг: 0 / 0
Создание xml
    #39482766
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У автора проблема не в скорости, а в том, что XML-данные надо в потоке писать из-за их объема.
...
Рейтинг: 0 / 0
Создание xml
    #39482769
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

Объем как раз и приводит к проблемам со скоростью.
...
Рейтинг: 0 / 0
Создание xml
    #39482773
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat

А вот якобы быстрая XML писалка:


Закопай обратно
...
Рейтинг: 0 / 0
Создание xml
    #39482845
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Как показывает практика, скорость записи, если речь конечно о файлах до 100-300Мб, SSD и ОС начиная с Висты, упирается в такты, а не ожидание винта, потому что по сути запись идёт в ОЗУ, а на диск оно сбрасывается спустя время. И здесь важна оптимизация по регистрам, инлайны, не говоря уже о высоких материях типа конвертации, проверок, присвоение вместо Move, вызов дополнительных функций. Конкатенациях строк - это отдельная прожорливая штука. Потому, что надо выделить память в менеджере, скопировать, очистить. Всё это оборачивается try/finally и interlocked методами. Очень хорошо иллюстрируется разница в примере по CachedBuffers. Ручная низкоуровневая запись обходится в 109мск. А человеческая, "высокоуровневая", хоть и жутко оптимизированная - уже 265мск. То есть вопросы кеш-промахов и ожиданий диска, о чем любят говорить противники чрезмерной оптимизации, просто не играют сколько-нибудь значимой роли.
...
Рейтинг: 0 / 0
Создание xml
    #39482858
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

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

До тех пор, пока размер данных не упрётся в кэш веника.
...
Рейтинг: 0 / 0
Создание xml
    #39482861
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Наверное, да. Но в этом случае разница по скорости будет уже не в 50 раз, а в 25. Что само по себе не мало )
...
Рейтинг: 0 / 0
Создание xml
    #39482865
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schirgreat

А вот якобы быстрая XML писалка:


Закопай обратно
Откопай быструю.
...
Рейтинг: 0 / 0
Создание xml
    #39482990
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatschiпропущено...


Закопай обратно
Откопай быструю.

20612383
...
Рейтинг: 0 / 0
Создание xml
    #39483035
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Дело хорошее, но, судя по тестам, работает в 5 раз медленнее возможного
...
Рейтинг: 0 / 0
Создание xml
    #39483064
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНеужели операции со строками настолько тормозные?

> WriteToBuff(' '+Name+'="'+Value.ToString+'">');
Сложение строк и понятие "быстрый" в Delphi несовместимое понятие.
Надо делать inline-функции типа WriteChar, WriteBuf и вызывать их по-очереди.
Разумеется, при условии что в них не что-то вроде: "Buf := Buf + Text;".
...
Рейтинг: 0 / 0
Создание xml
    #39483097
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUschi,

Дело хорошее, но, судя по тестам, работает в 5 раз медленнее возможного

Но что характерно, без ошибок.
...
Рейтинг: 0 / 0
Создание xml
    #39483112
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Ну так и через CachedBuffers без ошибок
...
Рейтинг: 0 / 0
Создание xml
    #39483156
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

alekcvpСложение строк и понятие "быстрый" в Delphi несовместимое понятие.

в других языках, впрочем, тоже
...
Рейтинг: 0 / 0
Создание xml
    #39483184
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor_prgСлыхал, что есть другие способы создания xml-файлов, без хранения
всего дерева.

Microsoft XML Lite например

https://github.com/the-Arioch/Delphi-XmlLite/tree/master/Samples/DynArrays to-from files
...
Рейтинг: 0 / 0
Создание xml
    #39483185
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor_prgЯ так в самом начале и сделал. Но если в тексте будут какие-то спецсимволы
(типа "&"), то xml файл не пройдет валидность

для этого есть escaping-функции ( например в составе Jedi CodeLib )

но все равно останется вопрос с CDATA-блоками, сбалансированным открыванием-закрыванием тээгов и т.д.
...
Рейтинг: 0 / 0
Создание xml
    #39483195
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp"direct XML writer". Например, OmniXML пишет что в нём есть

Возможно, имеет смысл попробовать OXml, но OmniXML...

Функции direct XML writer я в нем не искал, а вот чтение монстрового XLSX файла пробовал (очень удачно прислали медвежуть, сформированную каким-то надмозгом).

Сравнительно с банальным Microsoft XML v6 через TXMLDocument этот Omni жрал заметно больше памяти и заметно медленнее работал.

Нет, для Дельфи он действительно весьма удбный и приятный для использования на малых и средних файлах, но рекорды по объёму/скорости я бы на нём ставить даже не пытался.

Впрочем, я вообще в этом плане извращенец и маленькие XML файлы обычно лени ради читаю через JSON SuperObject
...
Рейтинг: 0 / 0
Создание xml
    #39483197
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatSOFT FOR YOUP.S. В тесте как раз разница в 50 раз относительно TStringList :)

Да уж. Быстродействие впечатляет.

TStringList - сам по себе очень медленный и жадный до памяти класс. В нём слишком много свисков и перделок на каждый чих.
Если уж хочется скорости и объёмов, то надо вместо него использовать TList<string>
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание xml
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]