Быстрый и эффективный для хранения данных класс ASCII для .NET.
Это может быть задано раньше, но я не могу найти таких сообщений. Есть ли класс для работы с ASCII-строками? Преимущества многочисленны:
- Сравнение должно быть более быстрым с момента его просто байта для байта (вместо UTF-8 с переменной кодировкой)
- Эффективная память, должна использовать примерно половину памяти в больших строках.
- Более быстрые версии ToUpper()/ToLower(), которые используют Look-Up-Table, которая является языковым инвариантом
Jon Skeet написал базовую реализацию AsciiString и доказал # 2, но мне интересно, кто-то сделал это дальше и завершил такой класс. Я уверен, что будут использоваться, хотя никто не будет использовать такой маршрут, поскольку все существующие функции String должны быть повторно реализованы вручную. И конверсии между String < > AsciiString будут разбросаны повсюду, что усложняет простую программу.
Есть ли такой класс? Где?
Ответы
Ответ 1
Я думал, что опубликую результаты моих усилий по внедрению системы, как описано с такой поддержкой и совместимостью, как я мог. Это, возможно, не идеально, но оно должно дать вам достойную базу для улучшения при необходимости.
Строка ASCIIChar и строка ASCIIString неявно преобразуются в их собственные копии для удобства использования.
Предложение OP для замещения ToUpper/Lower и т.д. было реализовано гораздо быстрее, чем список поиска, и все операции такие же быстрые и удобные для памяти, как я мог их сделать.
Извините, не мог опубликовать источник, это было слишком долго. См. Ссылки ниже.
-
ASCIIChar - Заменяет char, сохраняет значение в байте вместо int и предоставляет методы поддержки и совместимость для строки класс. Реализует виртуальные все методы и свойства, доступные для char.
-
ASCIIChars - Предоставляет статические свойства для каждого из допустимых символов ASCII для удобства использования.
-
ASCIIString - Заменяет строку, сохраняет символы в массиве байтов и реализует практически все методы и свойства, доступные для строки.
Ответ 2
Dotnet не поддерживает прямую строку ASCII. Строки - это UTF16, потому что Windows API работает с ASCII (onr char - один байт) или только с UTF16. Utf8 будет лучшим решением (Java использует его), но .NET не поддерживает его, потому что Windows этого не делает.
Windows API может конвертировать между кодировками, но windows api работает только с 1 байт-символами или 2 байтовыми символами, поэтому, если вы используете строки UTF8 в .NET, вы должны преобразовывать их каждый раз, что влияет на производительность. Dotnet может использовать UTF8 и другие блокировки через BinaryWriter/BinaryReader или простой StreamWriter/StreamReader.