C# 用于.NET的快速且内存高效的ASCII字符串类

C# 用于.NET的快速且内存高效的ASCII字符串类,c#,.net,string,performance,memory-efficient,C#,.net,String,Performance,Memory Efficient,以前可能有人问过这个问题,但我找不到任何这样的帖子。是否有一个类可以处理ASCII字符串?好处很多: 比较应该更快,因为它只是逐字节比较(而不是使用变量编码的UTF-8) 内存效率高,应该在大字符串中使用大约一半的内存 ToUpper()/ToLower()的更快版本,使用语言不变的查找表 乔恩·斯基特写了一本基础的、经过验证的书,但我想知道是否有人更进一步,完成了这样一门课。我相信会有一些用途,尽管没有人会采取这样的方法,因为所有现有的字符串函数都必须手工重新实现。字符串和字符串之间的转换将分

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

  • 比较应该更快,因为它只是逐字节比较(而不是使用变量编码的UTF-8)
  • 内存效率高,应该在大字符串中使用大约一半的内存
  • ToUpper()/ToLower()的更快版本,使用语言不变的查找表
  • 乔恩·斯基特写了一本基础的、经过验证的书,但我想知道是否有人更进一步,完成了这样一门课。我相信会有一些用途,尽管没有人会采取这样的方法,因为所有现有的字符串函数都必须手工重新实现。字符串和字符串之间的转换将分散在任何地方,使原本简单的程序变得复杂


    有这样的课吗?其中?

    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和其他编码。

    我想我会尽可能多地发布我努力实现系统的结果,以尽可能多的字符串支持和兼容性。它可能并不完美,但如果需要的话,它应该给你一个良好的基础来改进

    为了便于使用,ASCICHAR结构和ASCIIString字符串隐式转换为其本机对应项

    OP提出的替换ToUpper/Lower等的建议以一种比查找列表快得多的方式实现,并且所有操作都像我所能做的那样快速且对内存友好

    抱歉,无法发布源代码,时间太长。请参阅下面的链接

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

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

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


    只需几句注释:.NET字符串在内部使用UTF-16,通过使用重载,可以大大加快比较速度,重载将参数设置为序号。序号比较直接使用UTF-16编码的整数值。它不考虑当前区域性或同一字符符号是否可以由多个unicode代码点描述。比较这些通常返回true,但在使用序数时是错误的。是的,其他一些字符串函数也采用了String比较参数,包括.String比较已经在.NET中进行了优化,实际代码位于CLR内部,并且用C++编写。这是非常重要的,是避免鼓励程序员寻找一种更有效的字符串实现的必要条件,这种实现从根本上说是失败的,因为它只能支持世界各地使用的几种语言。保持旧C或C++代码的人知道这是一个多么大的错误。你考虑压缩字符串了吗?相等性比较会很容易,内存也会大大提高(对于实践中的大多数字符串),但是ToUpper/ToLower/string转换会更加繁重。取决于你真正想做什么,这可能就是你所需要的。这并不能回答所问的问题。这应该是一个评论。你没有足够的代表评论,但这很难。获得一些代表,然后你可以发表评论。你可以用真实的答案回答问题,从而获得声誉。简直太棒了!一个完整的ascistring类,具有与String类API相同的方法的加速实现!出色的工作…@PeterLaCombJr。是的,char结构和string类都是不可变的(唯一的局部变量是readonly)。我纠正了string类中最后一分钟出现的错误,该错误的解析方法不是静态的。@Ashigore-您是否在Github中发布了此代码或为其创建了Nuget包。我想使用它,我可以从粘贴库复制,但我想知道它是否放在社区可以贡献/编辑和更新的地方。