Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Официальный релиз библиотеки "CachedTexts" / 25 сообщений из 83, страница 1 из 4
08.03.2016, 20:49
    #39187635
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
Проект на гитхабе: https://github.com/d-mozulyov/CachedTexts
Скачать архивом: https://github.com/d-mozulyov/CachedTexts/archive/master.zip

CachedTexts - мощная и компактная кроссплатформенная библиотека, целью которой является парсинг и генерация текстовых данных с максимально возможной производительностью. Для библиотеки характерно следующее:
Код находится в модуле "CachedTexts.pas" и зависит от двух других библиотек: CachedBuffers и UniConv . Объявлены классы TUniConvReReader и TUniConvReWriter, позволяющие осуществлять последовательную конвертацию текста из одной кодировки в другую "на лету".

Существует 3 возможные базовые кодировки для парсинга или генерации текста: Byte-кодировка, UTF-16 или UTF-32. Каждая из них имеет свои достоинства и недостатки. UTF-16 является самой распространённой кодировкой, ей в Delphi соответствуют типы string/UnicodeString и WideString. Однако она не является самой быстрой и требует дополнительной логики для обработки суррогатных символов. UTF-32 является самой универсальной, но самой медленной кодировкой. Под Byte-кодировкой понимается UTF-8 или любая из поддерживаемых SBCS (Ansi). Такой вид интерфейса самый быстрый и является универсальным для ASCII-символов, но может представлять сложность при учёте используемой кодировки.

Существует 3 собственных типа строк , используемых при парсинге и генерации: ByteString, UTF16String и UTF32String. Особенность этих строк заключается в том, что для хранения данных они не выделяют память в куче, а ссылаются на данные в CachedBuffer, что существенно увеличивает производительность. Все CachedString -типы имеют одинаковый интерфейс, состоящий из свойств, функций и перегруженных операторов, позволяющих выполнять широкий спектр задач наряду со стандартными строковыми типами. Кроме того они быстрее стандартных аналогов. Для конвертации из одной CachedString в другую существует тип TTemporaryString .

Для парсинга и генерации текстов существуют стандартные классы: CachedTextReader -ы (TByteTextReader, TUTF16TextReader, TUTF32TextReader) и CachedTextWriter -ы (TByteTextWriter, TUTF16TextWriter, TUTF32TextWriter).

Существуют стандартные классы для популярных языков разметки: XML, HTML, JSON и RTF. Для низкоуровневых Simple-API интерфейсов (как например "MSXMLSAX2") используются Byte-кодировки. Для Document Object Model (DOM) используется UnicodeString.

Несмотря на то, что CachedString -типы достаточно быстро сравниваются со строковыми константами, задача идентификации строк (например при сериализации) является достаточно требовательной к ресурсам. Многие используют решения на основе бинарных деревьев и хеш-таблиц, однако библиотека CachedTexts содержит утилиту " CachedSerializer ", позволяющую добиться максимальной производительности за счёт кодогенерации.


Demo.zip
...
Рейтинг: 0 / 0
08.03.2016, 20:49
    #39187636
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
CachedTextReader - ы: TByteTextReader/TUTF16TextReader/TUTF32TextReader

Для последовательного чтения текстовых данных существуют классы: TByteTextReader, TUTF16TextReader и TUTF32TextReader. Вы можете выбирать любой из классов для парсинга в зависимости от того, какая кодировка вам удобнее. В случае если кодировка исходных текстовых данных отличается – конвертация будет произведена автоматически, что может незначительно замедлить выполнение приложения. Т.к. большинство текстовых файлов находятся в байтовой кодировке – для требовательных к производительности участкам кода рекомендуется использовать класс TByteTextReader, потому что автоматической конвертации текста производиться не будет и ByteString является самым быстрым строковым типом.

Каждый TCachedTextReader-класс имеет 2 основных конструктора: Create и CreateFromFile. В обоих случаях исходная кодировка определяется по BOM. В случае если BOM отсутствует – учитывается параметр DefaultByteEncoding, который может быть равен CODEPAGE_UTF8 или одной из SBCS-кодировок. Конструктор CreateDirect используется в тех случаях, когда исходная кодировка и контекст конвертирования задаётся явно, а BOM не учитывается.

Функционал TCachedTextReader-класса похож на TCachedReader, где доступ к данным может осуществляться с помощью свойств Current, Overflow, Margin и функции Flush. Так же есть высокоуровневые фунции: ReadData, Skip, ReadChar и две разновидности Readln. Для текстовых данных, состоящих из множества строк, крайне рекомендуется использовать функцию Readln.

Код: 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.
type
  TByteTextReader/TUTF16TextReader/TUTF32TextReader = class(TCachedTextReader)
  public
    constructor Create({Encoding for TByteTextReader,} const Source: TCachedReader; const DefaultByteEncoding: Word = 0; const Owner: Boolean = False);
    constructor CreateFromFile({Encoding for TByteTextReader,} const FileName: string; const DefaultByteEncoding: Word = 0);
    constructor CreateDirect(const Context: PUniConvContext; const Source: TCachedReader; const Owner: Boolean = False);
    {for TByteTextReader:} constructor CreateDefault(const Source: TCachedReader; const DefaultByteEncoding: Word = 0; const Owner: Boolean = False);
    {for TByteTextReader:} constructor CreateDefaultFromFile(const FileName: string; const DefaultByteEncoding: Word = 0);

    procedure ReadData(var Buffer; const Count: NativeUInt); 
    procedure Skip(const Count: NativeUInt);
    function Flush: NativeUInt;
    function Readln(var S: ByteString/UTF16String/UTF32String): Boolean;
    function Readln(var S: UnicodeString): Boolean;
    function ReadChar: UCS4Char; 

    property Current: PByte read/write
    property Overflow: PByte read
    property Margin: NativeInt read
    property Finishing: Boolean read
    property EOF: Boolean read/write
    property Converter: TUniConvReReader read
    property Source: TCachedReader read
    property Owner: Boolean read/write
    property FileName: string read
  end;



Простой пример парсинга:
Код: 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.
const
  URL_ID = '<a href=';
  URL_ID_LENGTH = Length(URL_ID);

// стандартный (медленный) способ парсинга файлов
procedure ParseStd(const FileName: string);
var
  Text: TextFile;
  S, URL: string;
  P: Integer;
begin
  AssignFile(Text, FileName);
  Reset(Text);
  while (not EOF(Text)) do
  begin
    Readln(Text, S);

    // находим '<a href='
    P := Pos(URL_ID, S);
    if (P = 0) then Continue;

    // определяем URL
    Delete(S, 1, P + URL_ID_LENGTH - 1);
    P := Pos('"', S);
    if (P = 0) then Continue;
    Delete(S, 1, P);
    P := Pos('"', S);
    if (P <> 0) then
    begin
      URL := Copy(S, 1, P - 1);
      Writeln(URL); // отображаем URL в консоли
    end;
  end;
  CloseFile(Text);
end;

// "cached" (очень быстрый) способ парсинга файлов
procedure Parse(const FileName: string);
var
  Text: TUTF16TextReader;
  S, URL: CachedTexts.UTF16String;
  P: Integer;
begin
  Text := TUTF16TextReader.CreateFromFile(FileName);
  try
    while (Text.Readln(S)) do
    begin
      // находим '<a href='
      P := S.Pos(URL_ID);
      if (P < 0) then Continue;

      // определяем URL
      S.Offset(P);
      P := S.CharPos('"');
      if (P < 0) then Continue;
      S.Offset(P + 1);
      P := S.CharPos('"');
      if (P >= 0) then
      begin
        URL := S.SubString(0, P);
        Writeln({оператор Implicit}string(URL)); // отображаем URL в консоли
      end;
    end;
  finally
    Text.Free;
  end;
end;

...
Рейтинг: 0 / 0
08.03.2016, 20:50
    #39187638
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
CachedString -типы: ByteString/UTF16String/UTF32String

CachedString-типы - это простые структуры (записи), содержащие указатель на символы, длину строки и набор флагов. Особенность этих строк заключается в том, что для хранения данных они не занимают память в куче, а только ссылаются на текстовые данные (например на CachedBuffer), что существенно увеличивает производительность.

Код: 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.
90.
91.
92.
93.
type
  ByteString/UTF16String/UTF32String = record
  public
    property Chars: PChar read/write
    property Length: NativeUInt read/write
    property Ascii: Boolean read/write
    property References: Boolean read/write (*полезно для символьных ссылок типа &amp;*) 
    property Tag: Byte read/write
    property Empty: Boolean read/write

    procedure Assign(AChars: PChar; ALength: NativeUInt);
    procedure Assign(const S: string);
    procedure Delete(const From, Count: NativeUInt);

    function DetermineAscii: Boolean;
    function TrimLeft: Boolean;
    function TrimRight: Boolean;
    function Trim: Boolean;
    function SubString(const From, Count: NativeUInt): CachedString;
    function SubString(const Count: NativeUInt): CachedString;
    function Skip(const Count: NativeUInt): Boolean;
    function Hash: Cardinal;
    function HashIgnoreCase: Cardinal;

    function CharPos(const C: Char; const From: NativeUInt = 0): NativeInt;
    function CharPosIgnoreCase(const C: Char; const From: NativeUInt = 0): NativeInt;
    function Pos(const S: CachedString; const From: NativeUInt = 0): NativeInt;
    function Pos(const AChars: PChar; const ALength: NativeUInt; const From: NativeUInt = 0): NativeInt;
    function Pos(const S: string; const From: NativeUInt = 0): NativeInt;
    function PosIgnoreCase(const S: CachedString; const From: NativeUInt = 0): NativeInt;
    function PosIgnoreCase(const AChars: PChar; const ALength: NativeUInt; const From: NativeUInt = 0): NativeInt;
    function PosIgnoreCase(const S: string; const From: NativeUInt = 0): NativeInt;
  public
    function ToBoolean: Boolean;
    function ToBooleanDef(const Default: Boolean): Boolean;
    function TryToBoolean(out Value: Boolean): Boolean;
    function ToHex: Integer;
    function ToHexDef(const Default: Integer): Integer;
    function TryToHex(out Value: Integer): Boolean;
    function ToInteger: Integer;
    function ToIntegerDef(const Default: Integer): Integer;
    function TryToInteger(out Value: Integer): Boolean;
    function ToCardinal: Cardinal;
    function ToCardinalDef(const Default: Cardinal): Cardinal;
    function TryToCardinal(out Value: Cardinal): Boolean;
    function ToHex64: Int64;
    function ToHex64Def(const Default: Int64): Int64;
    function TryToHex64(out Value: Int64): Boolean;
    function ToInt64: Int64;
    function ToInt64Def(const Default: Int64): Int64;
    function TryToInt64(out Value: Int64): Boolean;
    function ToUInt64: UInt64;
    function ToUInt64Def(const Default: UInt64): UInt64;
    function TryToUInt64(out Value: UInt64): Boolean;
    function ToFloat: Extended;
    function ToFloatDef(const Default: Extended): Extended;
    function TryToFloat(out Value: Single): Boolean;
    function TryToFloat(out Value: Double): Boolean;
    function TryToFloat(out Value: TExtended80Rec): Boolean;
    function ToDate: TDateTime;
    function ToDateDef(const Default: TDateTime): TDateTime;
    function TryToDate(out Value: TDateTime): Boolean;
    function ToTime: TDateTime;
    function ToTimeDef(const Default: TDateTime): TDateTime;
    function TryToTime(out Value: TDateTime): Boolean;
    function ToDateTime: TDateTime;
    function ToDateTimeDef(const Default: TDateTime): TDateTime;
    function TryToDateTime(out Value: TDateTime): Boolean; 
  public
    procedure ToAnsiString/ToLowerAnsiString/ToUpperAnsiString(var S: AnsiString; const CodePage: Word = 0);
    procedure ToAnsiShortString/ToLowerAnsiShortString/ToUpperAnsiShortString(var S: ShortString; const CodePage: Word = 0);
    procedure ToUTF8String/ToLowerUTF8String/ToUpperUTF8String(var S: UTF8String);
    procedure ToUTF8ShortString/ToLowerUTF8ShortString/ToUpperUTF8ShortString(var S: ShortString);
    procedure ToWideString/ToLowerWideString/ToUpperWideString(var S: WideString);
    procedure ToUnicodeString/ToLowerUnicodeString/ToUpperUnicodeString(var S: UnicodeString);
    procedure ToString/ToLowerString/ToUpperString(var S: string); 

    function ToAnsiString/ToLowerAnsiString/ToUpperAnsiString: AnsiString;
    function ToUTF8String/ToLowerUTF8String/ToUpperUTF8String: UTF8String;
    function ToWideString/ToLowerWideString/ToUpperWideString: WideString;
    function ToUnicodeString/ToLowerUnicodeString/ToUpperUnicodeString: UnicodeString;
    function ToString/ToLowerString/ToUpperString: string;
    class operator Implicit(const a: CachedString): string;  
  public
    function Equal/EqualIgnoreCase(const S: CachedString/AnsiString/UTF8String/WideString/UnicodeString): Boolean; 
    function Compare/CompareIgnoreCase(const S: CachedString/AnsiString/UTF8String/WideString/UnicodeString): NativeInt; 
    function Equal/EqualIgnoreCase(const AChars: PAnsiChar/PUTF8Char; const ALength: NativeUInt; const CodePage: Word): Boolean;
    function Compare/CompareIgnoreCase(const AChars: PAnsiChar/PUTF8Char; const ALength: NativeUInt; const CodePage: Word): NativeInt;
    function Equal/EqualIgnoreCase(const AChars: PUnicodeChar; const ALength: NativeUInt; const CodePage: Word): Boolean;
    function Compare/CompareIgnoreCase(const AChars: PUnicodeChar; const ALength: NativeUInt; const CodePage: Word): NativeInt;

    class operator Equal/NotEqual/GreaterThan/GreaterThanOrEqual/LessThan/LessThanOrEqual(const S: CachedString/AnsiString/UTF8String/WideString/UnicodeString): Boolean;  
  end;


Поддерживаемые форматы даты: YYYYMMDD, YYYY-MM-DD, -YYYY-MM-DD, DD.MM.YYYY, DD-MM-YYYY, DD/MM/YYYY, DD.MM.YY, DD-MM-YY, DD/MM/YY, YYYY (YYYY-01-01), YYYY-MM (YYYY-MM-01), --MM-DD (2000-MM-DD), --MM-- (2000-MM-01), ---DD (2000-01-DD).

Поддерживаемые форматы времени: hh:mm:ss.zzzzzz, hh-mm-ss.zzzzzz, hh:mm:ss.zzz, hh-mm-ss.zzz, hh:mm:ss, hh-mm-ss, hhmmss, hh:mm, hh-mm, hhmm.
...
Рейтинг: 0 / 0
08.03.2016, 20:50
    #39187640
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
CachedTextWriter -ы: TByteTextWriter/TUTF16TextWriter/TUTF32TextWriter

Для последовательной записи текстовых данных существуют классы: TByteTextWriter, TUTF16TextWriter и TUTF32TextWriter. Функционал TCachedTextWriter-класса похож на TCachedWriter, где доступ к данным может осуществляться с помощью свойств Current, Overflow, Margin и функции Flush. Для прямой записи данных используйте функцию WriteData. Независимо от кодировки TCachedTextWriter-класса текстовые данные могут быть автоматически переконвертированы в любую другу кодировку – для этого указывайте параметр BOM в конструкторах Create и CreateFromFile, или параметр Context в конструкторе CreateDirect.

TCachedTextWriter-классы позволяют записывать не только строки, но и другие распространённые типы: булеаны, целые числа, числа с плавающей точкой, даты и время, варианты. А для форматирования текста существуют функции WriteFormat, WriteFormatUTF8 и WriteFormatUnicode. Важно знать, что все эти функции работают быстрее своих SysUtils-аналогов. Параметры записи чисел с плавающей точкой и дат/времени задаются в полях FloatSettings и DateTimeSettings.

Код: 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.
type
  TByteTextWriter/TUTF16TextWriter/TUTF32TextWriter = class(TCachedTextWriter)
  public
    constructor Create({Encoding для TByteTextWriter,} const Target: TCachedWriter; const BOM: TBOM = bomNone; const DefaultByteEncoding: Word = 0; const Owner: Boolean = False);
    constructor CreateFromFile({Encoding для TByteTextWriter,} const FileName: string; const BOM: TBOM = bomNone; const DefaultByteEncoding: Word = 0);
    constructor CreateDirect(const Context: PUniConvContext; const Target: TCachedWriter; const Owner: Boolean = False);
    procedure WriteData(const Buffer; const Count: NativeUInt);
    function Flush: NativeUInt;

    property Current: PByte read/write
    property Overflow: PByte read
    property Margin: NativeInt read
    property EOF: Boolean read/write
    property Converter: TUniConvReWriter read
    property Target: TCachedWriter read
    property Owner: Boolean read/write
    property FileName: string read
  public
    FloatSettings: TFloatSettings;
    DateTimeSettings: TDateTimeSettings;

    procedure WriteCRLF;
    procedure WriteAscii(const AChars: PAnsiChar; const ALength: NativeUInt);
    procedure WriteUnicodeAscii(const AChars: PUnicodeChar; const ALength: NativeUInt);
    procedure WriteUCS4Ascii(const AChars: PUCS4Char; const ALength: NativeUInt);
    procedure WriteAnsiChars(const AChars: PAnsiChar; const ALength: NativeUInt; const CodePage: Word);
    procedure WriteUTF8Chars(const AChars: PUTF8Char; const ALength: NativeUInt);
    procedure WriteUnicodeChars(const AChars: PUnicodeChar; const ALength: NativeUInt);
    procedure WriteUCS4Chars(const AChars: PUCS4Char; const ALength: NativeUInt);

    procedure WriteByteString(const S: ByteString);
    procedure WriteUTF16String(const S: UTF16String);
    procedure WriteUTF32String(const S: UTF32String);

    procedure WriteAnsiString(const S: AnsiString);
    procedure WriteShortString(const S: ShortString; const CodePage: Word = 0);
    procedure WriteUTF8String(const S: UTF8String);
    procedure WriteWideString(const S: WideString);
    procedure WriteUnicodeString(const S: UnicodeString);
    procedure WriteUCS4String(const S: UCS4String; const NullTerminated: Boolean = True);

    procedure WriteFormat(const FmtStr: AnsiString; const Args: array of const);
    procedure WriteFormatUTF8(const FmtStr: UTF8String; const Args: array of const);
    procedure WriteFormatUnicode(const FmtStr: UnicodeString; const Args: array of const);
  public
    procedure WriteBoolean(const Value: Boolean);
    procedure WriteBooleanOrdinal(const Value: Boolean);
    procedure WriteInteger(const Value: Integer; const Digits: NativeUInt = 0);
    procedure WriteHex(const Value: Integer; const Digits: NativeUInt = 0);
    procedure WriteCardinal(const Value: Cardinal; const Digits: NativeUInt = 0);
    procedure WriteInt64(const Value: Int64; const Digits: NativeUInt = 0);
    procedure WriteHex64(const Value: Int64; const Digits: NativeUInt = 0);
    procedure WriteUInt64(const Value: UInt64; const Digits: NativeUInt = 0);
    procedure WriteFloat(const Value: Extended; const Settings: TFloatSettings);
    procedure WriteFloat(const Value: Extended);
    procedure WriteDate(const Value: TDateTime; const Settings: TDateTimeSettings);
    procedure WriteDate(const Value: TDateTime);
    procedure WriteTime(const Value: TDateTime; const Settings: TDateTimeSettings);
    procedure WriteTime(const Value: TDateTime);
    procedure WriteDateTime(const Value: TDateTime; const Settings: TDateTimeSettings);
    procedure WriteDateTime(const Value: TDateTime);
    procedure WriteVariant(const Value: Variant; const FloatSettings: TFloatSettings; const DateTimeSettings: TDateTimeSettings);
    procedure WriteVariant(const Value: Variant);
  end;

...
Рейтинг: 0 / 0
08.03.2016, 20:51
    #39187641
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
TTemporaryString

Львиную долю процессорного времени при парсинге могут занимать операции с менеджером памяти и подсчетом ссылок. Все типы системных строк обслуживаются внутренними функциями модуля System.pas, и при таких распространенных операциях как инициализация, конкатенация или финализация - производят ряд сложных операций для перераспределения выделенной памяти, негативно влияющих на производительность. Именно поэтому основной упор в библиотеке CachedTexts сделан на статических строках: ByteString, UTF16String и UTF32String. Однако существуют задачи, когда обойтись без динамического выделения памяти сложно. Например распаковать XML-строку, содержащую символьные ссылки, или перевести ByteString в UTF16String. Специально для таких задач в библиотеке содержится тип TTemporaryString. В его основе лежат динамический массив байт и принцип резервирования памяти. Это означает, что память в нем если и будет перевыделяться, то редко. Единовременно в TTemporaryString могут находиться данные только одного типа из трёх: ByteString, UTF16String или UTF32String. В любое время можно вызвать метод InitByteString, InitUTF16String или InitUTF32String. Заполнение данными, конвертация и конкатенация - осуществляются с помощью методов Append. Данные либо сразу добавляются в конец строки, либо предварительно конвертируются в требуемую кодировку.

Одной очень важной особенностью TTemporaryString является возможность "эмуляции" системной строки. В этом случае к символьным данным дописывается специальный системный заготовок, позволяющий компилятору Delphi использовать данные TTemporaryString как "константную строку". Это может быть полезно если ваши алгоритмы и функции используют стандартные строки. Например при Writeln, ExtractFileName или StrToDate(FormatSettings). Однако будьте осторожны, время жизни эмулированной строки ограничено временем жизни данных в TTemporaryString. Крайне рекомендуется использовать эмулированную строку как временную строковую константу. Для использования реальных системных строк используйте CachedString.ToString-методы или UniqueString после присвоения строковой переменной.

Пример:
Код: 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.
program Produce;
var
  Temp: TTemporaryString;
  P: PUnicodeString;
  S: UnicodeString;
begin
  // инициализация
  Temp.InitUTF16String;

  // конкатенация и автоматическая конвертация
  Temp.Append(UnicodeString('Delphi'));
  Temp.Append(AnsiString(' is the way to build applications for'));
  Temp.Append(UTF8String(' Windows 10, Mac,'), ccUpper);
  Temp.Append(WideString(' Mobile and more.'), ccLower);

  // стандартная (системная) строка
  Writeln(Temp.CastUTF16String.ToUnicodeString);

  // эмуляция константной системной строки
  P := Temp.EmulateUnicodeString;
  Writeln(P^);

  // копирование эмулированной строки в системную
  S := P^;
  UniqueString(S);
  Writeln(S);

  // переинициализация
  Temp.InitByteString(CODEPAGE_DEFAULT);
  Temp.Append(UTF8String('Delphi is the best.'));
  Writeln(Temp.EmulateAnsiString^);

  Readln;
end.



На выходе будет:
ConsoleDelphi is the way to build applications for WINDOWS 10, MAC, mobile and more.
Delphi is the way to build applications for WINDOWS 10, MAC, mobile and more.
Delphi is the way to build applications for WINDOWS 10, MAC, mobile and more.
Delphi is the best.
...
Рейтинг: 0 / 0
08.03.2016, 20:51
    #39187642
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
CachedSerializer

Утилита "CachedSerializer" служит единственной цели - идентификация (сериализация) строковых данных с максимально возможной производительностью. Вы можете откомпилировать проект из исходников в папке "utilities/CachedSerializer" или сразу скачать бинарные файлы вместе с примерами. В качестве первого аргумента командной строки утилита принимает имя текстового файла, в котором содержатся опции и идентификаторы. Для сериализации важны следующие опции:

-<encoding>. В качестве encoding может выступать "-utf16", "-utf8", "-utf32" или ряд других кодовых страниц, например "-1250" (полный список однобайтовых кодировок можно увидеть в описании библиотеки UniConv ). "-raw" воспринимается как CODEPAGE_RAWDATA, "-user" воспринимается как CODEPAGE_USERDEFINED, "-ansi" воспринимается как CODEPAGE_DEFAULT. "-ansi" является кодировкой по умолчанию, если ваш ByteString-идентификатор содержит только ASCII-символы, то кодировка не важна, можете указывать "-ansi" или не указывать её вообще.


-p"<variable_name>" или -p"<pointer_name>:<length_name>" или -p"<pointer_name>:<length_name>:<code_indent>". Сериализация происходит по двум параметрам: указатель на символы и длина строки. Если ваш идентификатор хранится в CachedString – укажите <variable_name>, и тогда сериализация будет происходить по параметрам <Name>.Chars and <Name>.Length. По умолчанию используются "S.Chars" и "S.Length". Параметр <code_indent> может быть полезен для дополнительного смещения кода, значение по умолчанию - ноль.


–i. Данная опция указывает, что сериализация будет происходить без учёта регистра символов.


-f"<Name(-SType)>:<Prefix>" или -f"<Name(-SType)>:<Prefix>:<TypeName>". Опция -f позволяет сгенерировать функцию <Name> с параметром "S". Если SType не указан - будет использована CachedString. Для каждого идентификатора будет сгенерирована либо числовая константа (<PREFIX>IDENTIFIERN = N), либо перечисляемый тип (<TypeName> = (<prefix>Identifier1, <prefix>Identifier2, …).


-fn"<Name(-SType)>:<Prefix>" или -fn"<Name(-SType)>:<Prefix>:<TypeName>". Смысл опции -fn такой же как -f, но для -fn будет сгенерирован только код сериализации.


-s"FileName". Опция позволяет сохранить сгенерированный код в текстовый файл.

Каждая из этих опций может быть указана в качестве аргумента командной строки. Кроме них допустимы следующие опции:

-nolog. Не отображать сгенерированный код в консоли.

-nocopy. Не копировать сгенерированный код в буфер обмена.

-nowait. Не ожидать нажатия Enter после генерации кода.

Каждая строка текстого файла может быть представлена в нескольких форматах:

<identifier>

<identifier>::<implementation>

<identifier>:<marker>:<implementation>

<identifier>:<marker>

Кроме <identifier> важна <implementation> - это код, который выполняется в случае определения <identifier>. Если указана опция -f или -fn, то <implementation> будет создана автоматически. Возникают случаи, когда для нескольких <identifier> должна быть одинаковая <implementation>. В этом случае указывайте <marker> - некая строковая константа.

При написании <identifier>, <marker> или <implementation> допустимы следующие специальные символы:
"\:", "\\", "\n", "\r", "\t" (Tab), "\s" (пробел)


Например вы отправляете на сериализацию следующий текстовый файл ("examples/simple1.txt"):
Файл-ansi -f"ValueToID-AnsiString:ID_" -p"S:Length(S)"
sheet
row
cell
data
value
style

На выходе получаете код:
Код: 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.
const
  ID_UNKNOWN = 0;
  ID_CELL = 1;
  ID_DATA = 2;
  ID_ROW = 3;
  ID_SHEET = 4;
  ID_STYLE = 5;
  ID_VALUE = 6;

function ValueToID(const S: AnsiString): Cardinal;
begin
  // default value
  Result := ID_UNKNOWN;

  // byte ascii
  with PMemoryItems(S)^ do
  case Length(S) of 
    3: if (Words[0] + Bytes[2] shl 16 = $776F72) then Result := ID_ROW; // "row"
    4: case (Cardinals[0]) of // "cell", "data"
         $6C6C6563: Result := ID_CELL; // "cell"
         $61746164: Result := ID_DATA; // "data"
       end;
    5: case (Cardinals[0]) of // "sheet", "style", "value"
         $65656873: if (Bytes[4] = $74) then Result := ID_SHEET; // "sheet"
         $6C797473: if (Bytes[4] = $65) then Result := ID_STYLE; // "style"
         $756C6176: if (Bytes[4] = $65) then Result := ID_VALUE; // "value"
       end;
  end;
end;



Если поменять опции на -f"ValueToEnum:tk:TTagKind" ("examples/simple2.txt") - такой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
type
  TTagKind = (tkUnknown, tkCell, tkData, tkRow, tkSheet, tkStyle, tkValue);

function ValueToEnum(const S: ByteString): TTagKind;
begin
  // default value
  Result := tkUnknown;

  // byte ascii
  with PMemoryItems(S.Chars)^ do
  case S.Length of 
    3: if (Words[0] + Bytes[2] shl 16 = $776F72) then Result := tkRow; // "row"
    4: case (Cardinals[0]) of // "cell", "data"
         $6C6C6563: Result := tkCell; // "cell"
         $61746164: Result := tkData; // "data"
       end;
    5: case (Cardinals[0]) of // "sheet", "style", "value"
         $65656873: if (Bytes[4] = $74) then Result := tkSheet; // "sheet"
         $6C797473: if (Bytes[4] = $65) then Result := tkStyle; // "style"
         $756C6176: if (Bytes[4] = $65) then Result := tkValue; // "value"
       end;
  end;
end;
...
Рейтинг: 0 / 0
09.03.2016, 11:26
    #39187915
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
SOFT FOR YOU,

1. Установки не требует?
2. Под Лазарь работа проверялась?
3. Дока на русском в архиве тоже есть или только тут?
...
Рейтинг: 0 / 0
09.03.2016, 11:35
    #39187924
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
авторКод находится в модуле "CachedTexts.pas" и зависит от двух других библиотек: CachedBuffers и UniConv.

Если CachedTexts использует эти библиотеки, они обязаны быть в наличии в дистрибутиве CachedTexts,
чтобы взял и пользуешься, а не начинаешь рыскать, где это взять
...
Рейтинг: 0 / 0
09.03.2016, 12:58
    #39188029
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
Док,

Установки не требует, дока на русском вся здесь и по сути является переводом README.md со страницы на гитхабе. Под Лазарем не проверялась, т.к. Фрипаскаль не является целевым компилятором, но задел под FPC имеется. Т.е. если под FPC будут обнаружены баги, то правиться они будут относительно быстро. Тестирование проводилось на Delphi6-XE10 под процессоры x86 и x64.

defecator,

Это организовано с помощью гитовских сабмодулей. В папке "lib". Исходники подтягиваются либо стандартными командами Git, либо с помощью батника "update.bat". Но если Git не установлен - тогда придётся вручную.
...
Рейтинг: 0 / 0
09.03.2016, 15:33
    #39188234
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
Таки вот что я заметил, потыкав в демку "FileWriters" компилятором DXE7
на компе Win7 x64, Core i5 2.8 ГГц, винт обычный, 4 гига памяти.


Отключение ассемблера приводит к заметному ускорению работы CachedTexts.

Ассемблер включён:
автор1) TStringList --> UTF8......fill: 3500...save: 5656 10219ms done.
2) TextFile --> UTF8... 37281ms done.
3) TextFile + buffer --> UTF8... 33078ms done.
4) CachedByteWriter ANSI --> UTF8... 969ms done.
5) CachedByteWriter UTF8 --> UTF8... 797ms done.
6) CachedUTF16Writer --> UTF8... 1860ms done.
7) CachedUTF32Writer --> UTF8... 1750ms done.

Ассемблер ВЫключен только в файле CachedTexts.pas:
автор1) TStringList --> UTF8......fill: 3609...save: 5547 10218ms done.
2) TextFile --> UTF8... 37609ms done.
3) TextFile + buffer --> UTF8... 33110ms done.
4) CachedByteWriter ANSI --> UTF8... 750ms done.
5) CachedByteWriter UTF8 --> UTF8... 672ms done.
6) CachedUTF16Writer --> UTF8... 1719ms done.
7) CachedUTF32Writer --> UTF8... 1641ms done.

Ассемблер ВЫключен в модулях CachedTexts.pas И CachedBuffers.pas:
автор1) TStringList --> UTF8......fill: 3375...save: 5344 9766ms done.
2) TextFile --> UTF8... 37422ms done.
3) TextFile + buffer --> UTF8... 33094ms done.
4) CachedByteWriter ANSI --> UTF8... 734ms done.
5) CachedByteWriter UTF8 --> UTF8... 578ms done.
6) CachedUTF16Writer --> UTF8... 1781ms done.
7) CachedUTF32Writer --> UTF8... 1812ms done.

Отключать ассемблер в файле UniConv.pas не стал - там аццкая путаница с DEFINE'ами.

Тут:
автор1) TStringList --> UTF8......fill: 3375...save: 5344 9766ms done.
fill - время заполнения TStringList через List.Add(IntToStr(i))
save - время отработки List.SaveToFile(FileName, TEncoding.UTF8)
...
Рейтинг: 0 / 0
09.03.2016, 17:05
    #39188407
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
Видимо, не всегда ассемблерная лапша "одинаково полезна" для здоровья...
...
Рейтинг: 0 / 0
09.03.2016, 17:15
    #39188417
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
просто аффтар переоценил свои скиллы
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.03.2016, 17:28
    #39188439
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
возможно автор тюнил под конкретную/свою архитектуру/машину а так там такой разброс возможен по линейкам что впору делать отдельные ветки
...
Рейтинг: 0 / 0
09.03.2016, 19:55
    #39188556
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
defecator,

А чем "ассемблирование выключал"?
...
Рейтинг: 0 / 0
09.03.2016, 19:57
    #39188559
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
vavan,

Да, скорее всего дело в способе копирования памяти. Надо разбираться
...
Рейтинг: 0 / 0
09.03.2016, 20:02
    #39188563
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
SOFT FOR YOUdefecator,

А чем "ассемблирование выключал"?

CashedTexts.pas - в заголовке закомментил блок:
Код: pascal
1.
2.
3.
{$if Defined(CPUX86) or Defined(CPUX64)}
  {$define CPUINTEL}
{$ifend}



Для CashedBuffers.pas ровно то же самое, только пришлось кое-что поправить на эту тему в плане того,
что там уже пошло смешение {$IFDEF CPUINTEL} и {$IFDEF CPUX86}

А в модуле UniConv.pas выключить по простому этот макрос не удалось,
так как там хаос из проверок - где-то проверяется IFDEF CPUX86, где-то - {$IFDEF CPUINTEL}
Там требуется в модуле серьёзно поработать метлой.

Подозреваю, что отключение ассемдлера и в UniConv.pas ещё бы прибавило быстродействия.
...
Рейтинг: 0 / 0
10.03.2016, 09:17
    #39188754
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
SOFT FOR YOUскорее всего дело в способе копирования памятиа у тебя там асм только в копировании? и твое копирование быстрее фасткодерского?
...
Рейтинг: 0 / 0
10.03.2016, 09:49
    #39188782
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
vavanSOFT FOR YOUскорее всего дело в способе копирования памятиа у тебя там асм только в копировании? и твое копирование быстрее фасткодерского?

АСМ там везде, где нужно и где не нужно, причём сначала писалось на паскале,
а потом тот же кусок переписывался на ассемблере.
...
Рейтинг: 0 / 0
10.03.2016, 10:57
    #39188843
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
В режиме x64 отключение ассемблера даёт ещё более существенный прирост быстродействия:

Ассемблер включён:
автор1) CachedByteWriter ANSI --> UTF8... 1110ms done.
2) CachedByteWriter UTF8 --> UTF8... 938ms done.
3) CachedUTF16Writer --> UTF8... 2328ms done.
4) CachedUTF32Writer --> UTF8... 2234ms done.

Ассемблер ВЫключен:
автор1) CachedByteWriter ANSI --> UTF8... 938ms done.
2) CachedByteWriter UTF8 --> UTF8... 735ms done.
3) CachedUTF16Writer --> UTF8... 2047ms done.
4) CachedUTF32Writer --> UTF8... 1828ms done.
...
Рейтинг: 0 / 0
10.03.2016, 11:19
    #39188867
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
defecator
Ассемблер ВЫключен в модулях CachedTexts.pas И CachedBuffers.pas:
автор1) TStringList --> UTF8......fill: 3375...save: 5344 9766ms done.
2) TextFile --> UTF8... 37422ms done.
3) TextFile + buffer --> UTF8... 33094ms done.
4) CachedByteWriter ANSI --> UTF8... 734ms done.
5) CachedByteWriter UTF8 --> UTF8... 578ms done.
6) CachedUTF16Writer --> UTF8... 1781ms done.
7) CachedUTF32Writer --> UTF8... 1812ms done.

Отключать ассемблер в файле UniConv.pas не стал - там аццкая путаница с DEFINE'ами.

Удалось отключить ассемблер и в модуле UniConv.pas:
автор1) CachedByteWriter ANSI --> UTF8... 728ms done.
2) CachedByteWriter UTF8 --> UTF8... 578ms done.
3) CachedUTF16Writer --> UTF8... 1734ms done.
4) CachedUTF32Writer --> UTF8... 1734ms done.

Как ни странно, но стало ещё быстрее
...
Рейтинг: 0 / 0
10.03.2016, 11:27
    #39188873
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
Hello, Defecator!
You wrote on 10 марта 2016 г. 11:27:08:

Defecator> Как ни странно, но стало ещё быстреебраво!

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.03.2016, 11:31
    #39188880
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
Отключение ассемблера в модуле UniConv.pas даёт незначительный прирост быстродействия,
так что там можно оставить и забить, если не упарываться десятком миллисекунд.

А вот отключение ассемблера в остальных двух модулях даёт существенный прирост скорости.
Возникает вопрос - а зачем тогда там длинные ассемблерные портянки ?
Что они такого дают, если только всё портят ?
...
Рейтинг: 0 / 0
10.03.2016, 12:31
    #39188952
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
defecatorпричём сначала писалось на паскале,
а потом тот же кусок переписывался на ассемблере.Я это замечал сто лет назад, довольно парадоксально было обнаруживать замедление от тотального переписывания на ассемблер. Потом плюнул на это дело. Оптимальный алгоритм на паскале всегда будет быстрее неоптимального алгоритма на ассемблере. А себестоимость нахождения оптимального алгоритма, отладки и сопровождения на паскале гораздо ниже ассемблерного
...
Рейтинг: 0 / 0
10.03.2016, 12:37
    #39188956
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
зато сколько стонов в сторону компилятора delphi, который, якобы, генерит тормозной код
...
Рейтинг: 0 / 0
10.03.2016, 12:50
    #39188973
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Официальный релиз библиотеки "CachedTexts"
компилятор/оптимизатор дельфи безусловно оставляет желать лучшего
но увы редко существует код выполняющийся оптимально на любой архитектуре, не зря фасткодеры и прочие подобные проекты месяцами вылизывали ветки под конкретные камни и условия
я уже говорил что вполне вероятно на машине автора его асмовый вариант обыгрывает паскалевский
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Официальный релиз библиотеки "CachedTexts" / 25 сообщений из 83, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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