【问题标题】:Fast and memory efficient ASCII string class for .NET用于 .NET 的快速且内存高效的 ASCII 字符串类
【发布时间】:2013-05-28 00:44:17
【问题描述】:

这可能以前被问过,但我找不到任何这样的帖子。是否有使用 ASCII 字符串的类?好处很多:

  1. 比较应该更快,因为它只是逐个字节(而不是使用可变编码的 UTF-8)
  2. 内存效率高,在大字符串中应该使用大约一半的内存
  3. 使用语言不变的查找表的 ToUpper()/ToLower() 的更快版本

Jon Skeet 写了一个基本的AsciiString implementation 并证明了 #2,但我想知道是否有人更进一步并完成了这样的课程。我确信会有用处,尽管通常没有人会采用这样的方法,因为所有现有的 String 函数都必须手动重新实现。 String AsciiString 之间的转换会分散在各处,使原本简单的程序变得复杂。

有这样的课程吗?在哪里?

【问题讨论】:

  • 只是几个 cmets:.NET 字符串在内部使用 UTF-16,您可以通过使用带有 StringComparison 参数并将其设置为 Ordinal 的 String.Compare 重载来加快比较速度。
  • 序数比较直接使用 UTF-16 编码的整数值。它没有考虑当前的文化或相同的字符符号是否可以由多个 unicode 代码点描述。比较这些通常返回 true,但使用序数时返回 false。
  • 是的,其他一些字符串函数也采用 StringComparison 参数,包括String.IndexOf
  • 字符串比较已经在 .NET 中进行了高度优化,实际代码位于 CLR 中并且是用 C++ 编写的。这是非常重要的,必须避免激励程序员寻找更有效的字符串实现,这种实现从根本上被破坏了,因为它只能支持世界范围内使用的几种语言。任何维护旧 C 或 C++ 代码的人都知道这是一个多么大的错误。
  • 你考虑过压缩你的字符串吗?相等比较会很容易,并且内存会大大提高(对于实践中的大多数字符串),但是 ToUpper/ToLower/string 转换会更加繁重。根据您真正想要做的事情,这可能就是您所需要的。

标签: c# .net string performance memory-efficient


【解决方案1】:

我想我会发布我努力实现所描述的系统的结果,该系统具有尽可能多的字符串支持和兼容性。它可能并不完美,但它应该为您提供一个不错的基础,以便在需要时进行改进。

为了便于使用,ASCIIChar 结构和 ASCIIString 字符串隐式转换为它们的本地对应物。

OP 关于替换 ToUpper/Lower 等的建议已以比查找列表更快的方式实现,并且所有操作都尽可能快速且内存友好。

抱歉无法发布来源,太长了。请参阅下面的链接。

  • ASCIIChar - 替换 char,将值存储在字节而不是 int 中,并为字符串类提供支持方法和兼容性。实现可用于 char 的虚拟所有方法和属性。

  • ASCIIChars - 为每个有效的 ASCII 字符提供静态属性以便于使用。

  • ASCIIString - 替换字符串,将字符存储在字节数组中,并实现几乎所有可用于字符串的方法和属性。

【讨论】:

  • 简直太棒了!一个完整的 ASCIIString 类,具有与 String 类 API 相同的方法的加速实现!很棒的工作....
  • @PeterLaCombJr。是的,char 结构和字符串类都是不可变的(唯一的局部变量是只读的)。
  • 我纠正了 Parse 方法不是静态的字符串类中的最后一分钟错误。
  • @Ashigore - 您是否在 Github 上发布了此代码或为其创建了 Nuget 包。我想使用它,我可以从 pastebin 复制,但我想知道它是否已放在社区可以贡献/编辑和更新的地方。
【解决方案2】:

Dotnet 没有直接的 ASCII 字符串支持。字符串是 UTF16,因为 Windows API 仅适用于 ASCII(onr char - 一个字节)或 UTF16。 Utf8 将是最好的解决方案(java 使用它),但 .NET 不支持它,因为 Windows 不支持。


Windows API 可以在字符集之间进行转换,但 Windows api 仅适用于 1 字节字符或 2 字节字符,因此如果您在 .NET 中使用 UTF8 字符串,则必须每次都转换它们,这会影响性能。 Dotnet 可以通过 BinaryWriter/BinaryReader 或简单的 StreamWriter/StreamReader 使用 UTF8 和其他编码。

【讨论】:

  • 这不能回答所提出的问题。应该是评论。您没有足够的代表发表评论,但这很难。获得一些代表,然后您可以发表评论。您可以通过用真实答案回答问题来获得代表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2011-06-09
相关资源
最近更新 更多