Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
Проект на гитхабе: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:49 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
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. Простой пример парсинга: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:49 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
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. Поддерживаемые форматы даты: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:50 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:50 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
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. На выходе будет: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:51 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
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. Если поменять опции на -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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 20:51 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, 1. Установки не требует? 2. Под Лазарь работа проверялась? 3. Дока на русском в архиве тоже есть или только тут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 11:26 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
авторКод находится в модуле "CachedTexts.pas" и зависит от двух других библиотек: CachedBuffers и UniConv. Если CachedTexts использует эти библиотеки, они обязаны быть в наличии в дистрибутиве CachedTexts, чтобы взял и пользуешься, а не начинаешь рыскать, где это взять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 11:35 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
Док, Установки не требует, дока на русском вся здесь и по сути является переводом README.md со страницы на гитхабе. Под Лазарем не проверялась, т.к. Фрипаскаль не является целевым компилятором, но задел под FPC имеется. Т.е. если под FPC будут обнаружены баги, то правиться они будут относительно быстро. Тестирование проводилось на Delphi6-XE10 под процессоры x86 и x64. defecator, Это организовано с помощью гитовских сабмодулей. В папке "lib". Исходники подтягиваются либо стандартными командами Git, либо с помощью батника "update.bat". Но если Git не установлен - тогда придётся вручную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 12:58 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
Таки вот что я заметил, потыкав в демку "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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 15:33 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
Видимо, не всегда ассемблерная лапша "одинаково полезна" для здоровья... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 17:05 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
просто аффтар переоценил свои скиллы Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 17:15 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
возможно автор тюнил под конкретную/свою архитектуру/машину а так там такой разброс возможен по линейкам что впору делать отдельные ветки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 17:28 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
defecator, А чем "ассемблирование выключал"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 19:55 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
vavan, Да, скорее всего дело в способе копирования памяти. Надо разбираться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 19:57 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUdefecator, А чем "ассемблирование выключал"? CashedTexts.pas - в заголовке закомментил блок: Код: pascal 1. 2. 3. Для CashedBuffers.pas ровно то же самое, только пришлось кое-что поправить на эту тему в плане того, что там уже пошло смешение {$IFDEF CPUINTEL} и {$IFDEF CPUX86} А в модуле UniConv.pas выключить по простому этот макрос не удалось, так как там хаос из проверок - где-то проверяется IFDEF CPUX86, где-то - {$IFDEF CPUINTEL} Там требуется в модуле серьёзно поработать метлой. Подозреваю, что отключение ассемдлера и в UniConv.pas ещё бы прибавило быстродействия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 20:02 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUскорее всего дело в способе копирования памятиа у тебя там асм только в копировании? и твое копирование быстрее фасткодерского? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 09:17 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
vavanSOFT FOR YOUскорее всего дело в способе копирования памятиа у тебя там асм только в копировании? и твое копирование быстрее фасткодерского? АСМ там везде, где нужно и где не нужно, причём сначала писалось на паскале, а потом тот же кусок переписывался на ассемблере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 09:49 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
В режиме 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 10:57 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
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. Как ни странно, но стало ещё быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 11:19 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
Hello, Defecator! You wrote on 10 марта 2016 г. 11:27:08: Defecator> Как ни странно, но стало ещё быстреебраво! Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 11:27 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
Отключение ассемблера в модуле UniConv.pas даёт незначительный прирост быстродействия, так что там можно оставить и забить, если не упарываться десятком миллисекунд. А вот отключение ассемблера в остальных двух модулях даёт существенный прирост скорости. Возникает вопрос - а зачем тогда там длинные ассемблерные портянки ? Что они такого дают, если только всё портят ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 11:31 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
defecatorпричём сначала писалось на паскале, а потом тот же кусок переписывался на ассемблере.Я это замечал сто лет назад, довольно парадоксально было обнаруживать замедление от тотального переписывания на ассемблер. Потом плюнул на это дело. Оптимальный алгоритм на паскале всегда будет быстрее неоптимального алгоритма на ассемблере. А себестоимость нахождения оптимального алгоритма, отладки и сопровождения на паскале гораздо ниже ассемблерного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 12:31 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
зато сколько стонов в сторону компилятора delphi, который, якобы, генерит тормозной код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 12:37 |
|
||
|
Официальный релиз библиотеки "CachedTexts"
|
|||
|---|---|---|---|
|
#18+
компилятор/оптимизатор дельфи безусловно оставляет желать лучшего но увы редко существует код выполняющийся оптимально на любой архитектуре, не зря фасткодеры и прочие подобные проекты месяцами вылизывали ветки под конкретные камни и условия я уже говорил что вполне вероятно на машине автора его асмовый вариант обыгрывает паскалевский ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 12:50 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39188782&tid=2037462]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
149ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 487ms |

| 0 / 0 |
