【发布时间】:2013-05-28 00:44:17
【问题描述】:
这可能以前被问过,但我找不到任何这样的帖子。是否有使用 ASCII 字符串的类?好处很多:
- 比较应该更快,因为它只是逐个字节(而不是使用可变编码的 UTF-8)
- 内存效率高,在大字符串中应该使用大约一半的内存
- 使用语言不变的查找表的 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