powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Официальный релиз библиотеки "CachedTexts"
83 сообщений из 83, показаны все 4 страниц
Официальный релиз библиотеки "CachedTexts"
    #39187635
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проект на гитхабе: 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
Официальный релиз библиотеки "CachedTexts"
    #39187636
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Официальный релиз библиотеки "CachedTexts"
    #39187638
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Официальный релиз библиотеки "CachedTexts"
    #39187640
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Официальный релиз библиотеки "CachedTexts"
    #39187641
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Официальный релиз библиотеки "CachedTexts"
    #39187642
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Официальный релиз библиотеки "CachedTexts"
    #39187915
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

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

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

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

defecator,

Это организовано с помощью гитовских сабмодулей. В папке "lib". Исходники подтягиваются либо стандартными командами Git, либо с помощью батника "update.bat". Но если Git не установлен - тогда придётся вручную.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188234
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Таки вот что я заметил, потыкав в демку "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
Официальный релиз библиотеки "CachedTexts"
    #39188407
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо, не всегда ассемблерная лапша "одинаково полезна" для здоровья...
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188417
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто аффтар переоценил свои скиллы
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188439
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно автор тюнил под конкретную/свою архитектуру/машину а так там такой разброс возможен по линейкам что впору делать отдельные ветки
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188556
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

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

Да, скорее всего дело в способе копирования памяти. Надо разбираться
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188563
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
Официальный релиз библиотеки "CachedTexts"
    #39188754
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUскорее всего дело в способе копирования памятиа у тебя там асм только в копировании? и твое копирование быстрее фасткодерского?
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188782
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
vavanSOFT FOR YOUскорее всего дело в способе копирования памятиа у тебя там асм только в копировании? и твое копирование быстрее фасткодерского?

АСМ там везде, где нужно и где не нужно, причём сначала писалось на паскале,
а потом тот же кусок переписывался на ассемблере.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188843
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
В режиме 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
Официальный релиз библиотеки "CachedTexts"
    #39188867
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
Официальный релиз библиотеки "CachedTexts"
    #39188873
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Defecator!
You wrote on 10 марта 2016 г. 11:27:08:

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

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

А вот отключение ассемблера в остальных двух модулях даёт существенный прирост скорости.
Возникает вопрос - а зачем тогда там длинные ассемблерные портянки ?
Что они такого дают, если только всё портят ?
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188952
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorпричём сначала писалось на паскале,
а потом тот же кусок переписывался на ассемблере.Я это замечал сто лет назад, довольно парадоксально было обнаруживать замедление от тотального переписывания на ассемблер. Потом плюнул на это дело. Оптимальный алгоритм на паскале всегда будет быстрее неоптимального алгоритма на ассемблере. А себестоимость нахождения оптимального алгоритма, отладки и сопровождения на паскале гораздо ниже ассемблерного
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188956
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зато сколько стонов в сторону компилятора delphi, который, якобы, генерит тормозной код
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188973
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компилятор/оптимизатор дельфи безусловно оставляет желать лучшего
но увы редко существует код выполняющийся оптимально на любой архитектуре, не зря фасткодеры и прочие подобные проекты месяцами вылизывали ветки под конкретные камни и условия
я уже говорил что вполне вероятно на машине автора его асмовый вариант обыгрывает паскалевский
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188975
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
fd00chзато сколько стонов в сторону компилятора delphi, который, якобы, генерит тормозной код

Можно было бы проверить работу на старом древнем Delphi 7,
но библиотеки не компилятся, если выключить ассемблер.
В частности, типы строк смешаны - String и WideString.

type
UniConv.UnicodeString = WideString; { из модуля UniConv.pas }

UnicodeString = UniConv.UnicodeString;

описано как:
Код: pascal
1.
procedure ByteString.ToLowerUnicodeString(var S: UnicodeString);


при этом вызов идёт со String:
Код: pascal
1.
2.
3.
4.
function ByteString.ToLowerString: string;
begin
  ToLowerUnicodeString(Result);
end;



так что с семёркой с отключением ассемблера не склалось,
а без отключения ассемблера вот такие результаты после компиляции в Delphi 7:

автор1) CachedByteWriter ANSI --> UTF8... 985ms done.
2) CachedByteWriter UTF8 --> UTF8... 813ms done.
3) CachedUTF16Writer --> UTF8... 1844ms done.
4) CachedUTF32Writer --> UTF8... 1781ms done.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188988
Печень белого медведя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00chзато сколько стонов в сторону компилятора delphi, который, якобы, генерит тормозной код
Ассемблер сам по себе не обеспечивает преимущества.
Если не ошибаюсь, речь шла о сравнении кода Delphi с си++ - компиляторами (например, от Intel).

Напомню: компилятор дельфийский написан на сях...
...а IDE вполне себе на Delphi.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39188995
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Печень белого медведя, прикол в том, что не только лишь все из стонущих могут написать на ассемблере более производительный код, зато хаять горазд каждый, как и строчить портянки на том же асме
Ну а с производителем процессоров соревноваться в компиляторах загнивающей конторе вообще чревато))
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189000
Печень белого медведя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00chПечень белого медведя, прикол в том, что не только лишь все из стонущих могут написать на ассемблере более производительный код, зато хаять горазд каждый, как и строчить портянки на том же асме
Ну а с производителем процессоров соревноваться в компиляторах загнивающей конторе вообще чревато))
Большинство (за исключением отдельных личностей, вроде ТС) все же понимают, что производительность - вещь далеко не всегда самая важная.
Люди вполне себе и C# с Java используют, и FoxPro, и VB c Python.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189009
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Печень белого медведя...а IDE вполне себе на Delphi.
Когда-то - может быть, а сейчас это дикая и глючная помесь всего со всем.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189010
Печень белого медведя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanПечень белого медведя...а IDE вполне себе на Delphi.
Когда-то - может быть, а сейчас это дикая и глючная помесь всего со всем.
Ой, точно. Начиная с D2005го там треш и угар.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189028
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

При оформлении (шрифт, жирность и пр.) не злоупотребляй, плиз.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189319
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да начали тут про ассемблер/неассемблер :)
Что там в UniConv на ассемблере я уже не помню. Но думаю в данном случае они не влияют, а разница в 16мск - стандартная погрешность GetTickCount. Что до остальных модулей - то вопрос в копировании памяти. На новых интеловских машинах снова стал быстрее REP MOVS. Актуален этот вопрос здесь или нет - я не знаю. Но каким способом копировать память лучше - вопрос открытый. Другого на ассемблере я вроде не писал, старался делать ЯВУ. Небольшое исключение - эмуляция инлайнов на старых компиляторах, но под X64 они поддерживаются.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189400
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUвопрос в копировании памяти. На новых интеловских машинах снова стал быстрее REP MOVS.
из чего следует сделать вывод, что писать стоит на паскале, имхо.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189440
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Нет
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189444
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUdefecator,

НетА на чём тогда?
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189452
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
GatorSOFT FOR YOUdefecator,

НетА на чём тогда?
ТС очень любит ассемблер, вот только ассемблер не любит его, судя по простейшим тестам его же библиотеки
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189510
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Нет :)
Я расцениваю ассемблер как один из инструментов. ЯВУ транслируется в набор машинных команд, ассемблер транслируется в набор машинных команд, просто на ассемблере можно сделать некоторые вещи тоньше. В данном случае речь в первую очередь идёт о копировании памяти. А там на одних машинах могут быть одни результаты, на вторых - другие. И это отличная пища для размышлений, за обнаружение которой тебе спасибо! Кстати если есть возможность - выложи пожалуйста различные варианты с/без ассемблера в исходниках и бинарниках под 2 платформы: x86 и x64. Можно будет погонять на разных машинах, потрейсить дизасм - и в итоге придти к какому-то оптимальному решению, для большинства новых процессоров.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189633
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUМожно будет погонять на разных машинах, потрейсить дизасм - и в итоге придти к какому-то оптимальному решению, для большинства новых процессоровя ранее вопрос задавал, ты фасткодеров обогнал чтоли?
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189706
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,

Ты имеешь ввиду их реализацию Move? Нет, здесь другая специфика. У них Move имеет универсальное применение, а в данном случае речь идёт о копировании небольшого ASCII буфера на стеке в буфер записи (CachedWriter). И в данном тесте речь идёт о числах от 1 до 1000, т.е. копирование от 1 до 4 байт. Если я ничего не путаю.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189725
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТы имеешь ввиду их реализацию Move?да, я о fastmove например от John O'Harrow. думал ты значительные куски разом копируешь
SOFT FOR YOUв данном случае речь идёт о копировании небольшого ASCII буфера на стеке в буфер записи (CachedWriter). И в данном тесте речь идёт о числах от 1 до 1000, т.е. копирование от 1 до 4 байттакие маленькие объемы тогда вроде ч/з movzx/mov делались а куда там rep девать??
SOFT FOR YOUЕсли я ничего не путаюне знай, ты ж писал, а я не смотрел
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39189742
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,

Надо разбираться. Асм-вставки, если я не путаю - сделаны как раз для того, чтобы не дергать по таким вещам стандартный Move, эта тема работает для 0..32 байтов. В случае с x64, там вообще ничего не ассемблировано, тем более фесткода. Все сделано в лоб, тупо. И на этом тесте такой подход оказался выгоднее. Но это не значит, что в целом вопрос копирования памяти не стоит пересматривать и подбирать более оптимальный вариант.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39202466
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка!
Вообщем в UTF16String. toFloat . Число 5.444123456e+300 конвертируется, но если экспа уже 301 и более - нет. Тоже самое с отрицательной экспой. У отрицательной кстати ещё ненормальные числа есть, которые E-314 аж, Power10 их может делать, но прикол с Power10 в том, что иногда у него цепочка зависимости и нужно сделать инструкцию pause после него, а иногда не нужно, в зависимости от числа и степени, надо копать куда-то. Из-за этого скорость скачет в 2(!) раза туда-сюда в зависимости от числа [у меня по меньшей мере].

Читал тему, никакого асма не видел в юнитах(так, пару вставок). Хотите проблем, пожалуйста изврат едишн:
Код: 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.
  .ALIGN 16
@@parse:
  movdqu    xmm1,[r8]      //pwidechar
  pcmpistri xmm3,xmm1,$15  //words + range + negative_polarity
  jb        @@next
  cmp       ecx,r9d        //cmp to length
  cmovg     ecx,r9d
  cmp       ecx,8
  jne       @@next
  psubw     xmm1,xmm4
  pmullw    xmm1,xmm5
  phaddw    xmm1,xmm1
  phaddw    xmm1,xmm1
  movd      eax,xmm1
  movzx     ecx,ax
  shr       eax,16
  imul      ecx,ecx,10000
  add       eax,ecx
  cvtsi2sd  xmm1,eax
  mulsd     xmm0,qword ptr [@@muls+00]   //1e+8
  addsd     xmm0,xmm1
  add       r8,16
  sub       r9d,8
  jg        @@parse
  jmp       @@leave

  .ALIGN 16
@@next:
  movzx     eax,word ptr [r8]
  sub       eax,$30
  cmp       eax,$09
  ja        @@char
  cvtsi2sd  xmm1,eax
  mulsd     xmm0,qword ptr [@@muls+08]  //1e+1
  addsd     xmm0,xmm1
  add       r8,2
  dec       r9d
  jg        @@next
  jmp       @@leave

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

Спасибо за реакцию и тестирование.
В целом - это не ошибка, а заложенное ограничение. Я обратил внимание, что под x64 (стандартная) функция на определённой экспоненте вообще вылетает с эксепшном. И оно не намного больше 300. Кроме того библиотека заточена на максимальную производительность и длину экспоненты в символах тоже имело смысл ограничить. Кстати у меня такие числа переводятся во Float точнее, чем в стандартной либе по Power10. А тем более под x64.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39202557
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUу меня такие числа переводятся во Float точнеехотелось бы услышать методику выявления точности
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39202605
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,

Берём строку, например '5.444123456e+300'
Получаем из неё Float обычным образом и с помощью CachedString
Потом смотрим дельту числа-в-строке и возвращаемого флоата
Где дельта меньше - там и точнее
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39202641
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Печень белого медведяНапомню: компилятор дельфийский написан на сях...
Пруф?
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39202684
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Если можно без офтопиков )
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39202885
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU, я как бы не придираюсь, но всё же интересно: смотрим дельту числа-в-строке и возвращаемого флоататипа так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
const
 sF = '5.444123456e+300';
var 
 d1, d2 : TStringFloatDelta;
begin
 d1 := sF - F1(sF);
 d2 := sF - F2(sF);
 ...


?
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39202924
Точность
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Точность" не должна быть "выше" или "ниже", она должна быть такой же. Ибо поведение должно быть предсказуемым.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39203072
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Применительно к флоатам, вопрос точности всегда актуален, идентичность гарантировать не получится. Как получаются числа с указанием экспоненты? Очень просто - берётся число и умножается на результат Power10, а тот получается многократным перемножением 10 или 1/10, на этом этапе собственно и происходит потеря точности.

Честно говоря, на данном примере мне не удалось сделать так, чтобы результаты различались :). Но к примеру '544412345.6e+300' на x64 выдаёт Exception. В то время как Cached-вариант и стандартный x86 отрабатывают корректно.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39203224
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUидентичность гарантировать не получится Честно говоря, на данном примере мне не удалось сделать так, чтобы результаты различались :)гы, так по ходу "не получится", а по факту "получается постоянно" ?

получается многократным перемножением 10 или 1/10, на этом этапе собственно и происходит потеря точности.А не нужно подменять /10 на *~0.1, тогда и с точностью все хорошо будет. Ой, что это я, тогда ж очень-очень быстро-быстро не получится ))
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39203334
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,

Ну так и дай бог, если получается, правда? )
И да, деление отнимает 30 тактов, смысла которого в данном случае нет. Не просто же так мой "StrToFloat" работает в 3 раза быстрее. Приходится думать головой, как это реализовать )
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39207894
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запись дат теперь стала ещё быстрее, благодаря интересному подходу, который извучил местный форумчанин Шарахов Александр: 19012418
Обновления только что успешно прошли юнит тест, код закоммитил
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39207897
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUЗапись дат теперь стала ещё быстрее, благодаря интересному подходу, который извучил местный форумчанин Шарахов Александр

Тебе предстоит ещё многому научиться:
http://guildalfa.ru/alsha/

особенно вот это:
http://guildalfa.ru/alsha/node/27
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39207918
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Я сомневаюсь. Чувак молодец, но статьи не особо глубокие, в сфере оптимизаций много других интересных тем. Тот же lock-free на Delphi или поиск символа в регистре за одну итерацию с минимумом ветвлений. Чувак, насколько я увидел, вообще злоупотребляет ветвлениями. Оно может на синтетических данных даёт хороший результат, т.к. предсказания прыжков срабатывают, а в боевых условиях данные разнородны, в то время как ложное предсказание обойдётся в 17 тактов. С другой стороны его описание поразрядной сортировки - это что-то с чем-то. Алгоритм-шедевр. И если бы не Александр - возможно я так и не столкнулся бы с этим алгоритмом.

Единственное что бесит - это стиль оформления кода. Ужасно. Хочется выколоть себе глаза :)
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39207941
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЕдинственное что бесит - это стиль оформления кода. Ужасно. Хочется выколоть себе глаза :)

Открой для себя автоматическое форматирование.

P.S. А стиль этот намного старше Delphi, а, может, и старше тебя. Так чта ...
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39207951
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39208063
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЯ сомневаюсьв смысле тебе больше нечему учиться?
SOFT FOR YOUстатьи не особо глубокиеэто скорее заметки на полях
SOFT FOR YOUв сфере оптимизаций много других интересных темкак будто кто-то способен объять необъятное
SOFT FOR YOUЕдинственное что бесит - это стиль оформления кода. Ужасно. Хочется выколоть себе глазаа за твой стиль общения и манеры хочется вырвать тебе язык, чувак
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39208070
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и хочется спросить: "люди, сколько вам лет?"
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39208071
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,

Ну каждый воспринимает информацию по-своему. Я всегда стараюсь общаться вежливо и конструктивно. Кого-то это бесит.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39208074
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57,

Мне 30 скоро. Это имеет какое-то отношение к теме? )
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39208079
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUBarmaley57,

Мне 30 скоро. Это имеет какое-то отношение к теме? )Да нет, в общем. Просто стиль общения в некоторых темах скорее напоминает разборки в детском саду, надувание пузырей и загибание пальцев)
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39208083
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57,

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

Мне 30 скоро. Это имеет какое-то отношение к теме? )

Тогда это со временем пройдет (возможно). Я в 30 лет тоже переворачивал мир.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #39208181
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Прогресс обязан тем, кто переворачивал мир. Я вношу свой скромный вклад.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Официальный релиз библиотеки "CachedTexts"
    #40057401
Фотография Flying-home
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Тебе можно тут вопросы по CachedTexts задавать?

1. В BDS2006 при использовании в проекте одновременно Indy и CachedTexts произошла коллизия определения типа TBytes. Пришлось закомментить определение типа в твоем модуле и добавить в uses Indy. Заработало, но это как-то странно.

2. В XE3 64-битный проект не компилится при добавлении в uses CachedTexts.
[dcc64 Error] UniConv.pas(5792): E2099 Overflow in conversion or arithmetic operation
Код: pascal
1.
Length := Length and (HIGH_NATIVE_BIT_VALUE - 1);


Причем если навести мышку на константу, дельфи показывает ее значение - 0.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057420
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он что, назвал тип TBytes? Цирк с конями...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057438
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flying-home,
Пиши лучше сюда
https://t.me/DelphiCommunity
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057446
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Он что, назвал тип TBytes?

А что такого? Нужно было юнит сетевой библиотеки подключить для алиасинга единственной декларции?
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057453
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно было называть классы так, чтобы названия не пересекались с Delphi-ми.
Когда фантазия хромает - люди используют префиксы. TCB_Butes, например.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057454
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или TCT_Butes, не знаю, как у него там либа называется/сокращается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057469
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Нужно было называть классы так, чтобы названия не пересекались с Delphi-ми.
Когда фантазия хромает - люди используют префиксы.

Не всем нравятся префиксы. Лично мне не нравятся. У нас не глобальное пространство имён, чтобы выдумывать нелепые абревиатуры для идентификаторов.

TBytes появился в RTL только в D2007, поэтому авторы библиотек желающие обеспечить совместимость кода с более старыми версиями вынужны декларировать свой TBytes. Обычно, он декларируется так, что не приводит к проблемам при использовании на версиях после D2006 (на более ранних проблемы перекрытия деклараций возможны, но в дельфях есть механизм их разрешения). Это делают в jcl, funamentals, mormot, zeoslib и ещё куча менее известных.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057474
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flying-home,

Насколько я помню, в Indy что-то типа TIdBytes
В целом да - сделано, чтобы использовать привычный набор типов, в том числе на старых Delphi
Лучше не правь Indy
Для разруливания случаев, когда используются одни и те же имена типов, в модуле явно указывается из какого модуля тип. Например, не TBytes, а CachedTexts.TBytes или IndyЧтоТоТам.TBytes

По вопросам лучше да, пиши в комьюнити
Я там чаще, чем здесь
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057491
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам
Или TCT_Butes, не знаю, как у него там либа называется/сокращается.

Да просто Butes и всё.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057562
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey> авторы библиотек желающие обеспечить
Kazantsev Alexey> совместимость кода с более старыми версиями

С более старым версиями чего, простите?

ъъъъъ> Да просто Butes и всё.

Предлагаю объявлять свои TStrings, TList, TPersistent... integer в конце концов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057576
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
С более старым версиями чего, простите?


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

Насколько я помню, в Indy что-то типа TIdBytes
В целом да - сделано, чтобы использовать привычный набор типов, в том числе на старых Delphi
Лучше не правь Indy
Для разруливания случаев, когда используются одни и те же имена типов, в модуле явно указывается из какого модуля тип. Например, не TBytes, а CachedTexts.TBytes или IndyЧтоТоТам.TBytes

По вопросам лучше да, пиши в комьюнити
Я там чаще, чем здесь

С этим я уже разобрался. А со вторым вопросом что?
ЗЫ В телеге не хочу ничего обсуждать.
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057600
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
...integer в конце концов.

Ты ведь знаешь о типах NativeInt и nativeUInt? Конечно знаешь. Так вот прикол в том, что до версии D2010 их использование очень часто приводило к сносу крыши у компилятора. Поэтому что? Вот-вот
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057605
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey> Совместимость своего кода со старыми версиями дельфей.

А, написать (или скопировать) свой класс, который одноимённый
(и с тем же функционалом) введённому позже стандартному, и всё
это без дефайнов. ОК, классная логика.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057606
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Почему без дефайнов? Когда тип декларирован, для него просто создаётся псевдоним, а когда декларации нет, создаётся декларация (либо псевдоним на аналогичный имеющийся тип). Например:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
 {$IF Declared(TBytes)}

  TBytes = SysUtils.TBytes;

 {$ELSE}

  TBytes = Types.TByteDynArray;

 {$IFEND}
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057618
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey> Почему без дефайнов?


Ну потому что вон выше у гения оптимизации их нет (судя по описанию).

Kazantsev AlexeyКогда тип декларирован, для него просто создаётся псевдоним, а когда декларации нет, создаётся декларация (либо псевдоним на аналогичный имеющийся тип).
Угу. Но согласись, это совсем не то же самое, что ты говорил сначала...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Официальный релиз библиотеки "CachedTexts"
    #40057621
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Ну потому что вон выше у гения оптимизации их нет (судя по описанию).

У него они тоже есть, просто другие. У него декраларация делается с расчётом на XE и выше.

Гаджимурадов Рустам
Но согласись, это совсем не то же самое, что ты говорил сначала...

Да нет, именно об этом и говорил:
Обычно, он декларируется так, что не приводит к проблемам при использовании на версиях после D2006
...
Рейтинг: 0 / 0
83 сообщений из 83, показаны все 4 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Официальный релиз библиотеки "CachedTexts"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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