当前位置: 首页 > news >正文

高明建网站服务做文学网站算不算开公司

高明建网站服务,做文学网站算不算开公司,沈阳网站建设管理,网站推广工作如何做本文主要分析C#字符串拼接产生GC的原因#xff0c;以及介绍名为ZString的库#xff0c;它可以将字符串生成的内存分配为零。 在C#中#xff0c;字符串拼接通常有三种方式#xff1a; 直接使用号连接#xff1b;string.format;使用StringBuilder#xff1b; 下面分别细…本文主要分析C#字符串拼接产生GC的原因以及介绍名为ZString的库它可以将字符串生成的内存分配为零。 在C#中字符串拼接通常有三种方式 直接使用号连接string.format;使用StringBuilder 下面分别细述。 故事的开始 首先简单介绍下String类型。C# String 类型内部是“UTF-16”字节字符串。 与普通对象一样它有一个对象头并在堆内存中分配。同样字符串基本上只能由“新字符串”生成。StringBuilder.ToStringEncoding.GetString等最后也调用new string来分配一个新字符串。 即使是相同的字符串值“new string”生成的字符串也会分配在不同的内存空间中。只有常量字符串从称为实习生池的应用程序共享空间获取固定引用。 var x new string(new[] { f, o, o }); var y new string(new[] { f, o, o }); var z foo; var u foo; var v String.Intern(x);// different reference: x ! y ! z Console.WriteLine(Object.ReferenceEquals(x, y)); // false Console.WriteLine(Object.ReferenceEquals(x, z)); // false// same reference: z u v Console.WriteLine(Object.ReferenceEquals(z, u)); // true Console.WriteLine(Object.ReferenceEquals(z, v)); // true// same value Console.WriteLine(x y x z x u x v); // true 如果你想从intern池中获取可以使用String.Intern方法。Intern方法是从Intern池中获取的。如果不存在则注册并返回其引用。由于Intern池中注册的内存无法删除因此可能很难很好地使用它。 拼接String.Concat 使用号连接时C# 编译器会进行专门处理将其转换为 String.Concat。 string.Concat(object arg0, object arg1) string.Concat(object arg0, object arg1, object arg2) string.Concat(params object[] values) string.Concat(string str0, string str1) string.Concat(string str0, string str1, string str2) string.Concat(string str0, string str1, string str2, string str3) string.Concat(params string[] values) 不同的编译器版本处理稍有不同。例如Visual Studio 2019 的 C# 编译器 (int x) (string y) (int z) 的结果将为“String.Concat(x.ToString(), y, z.ToString())”。但是Visual Studio 2017 的 C# 编译器将是“String.Concat((object)x, y, (object)z)”如果连接非字符串参数将使用对象重载。因此发生了结构装箱。 如果我们连接的字符不匹配上方的重载比如连接了5个字符那么就会产生一个“params array”的分配同样会造成额外的GC。 针对上述情况ZString提供了最多15个参数的泛型重载且在内部使用了“Utf16ValueStringBuilder”在StringBuilder小节中有解释因此几乎可以完全避免数字类型的字符串转换分配。 StringBuilder “StringBuilder”是一个以“char[]”作为临时缓冲区的类。StringBuilder.Append()方法用于写入缓冲区StringBuilder.ToString() 生成最终字符串。 public class SimpleStringBuilder {char[] buffer;int offset;public void Append(string value){value.CopyTo(0, buffer, offset, value.Length);offset value.Length;}public override string ToString(){return new string(buffer, 0, offset);} } 如果要连接多个字符串应避免使用“”因为每个“”都会生成一个新字符串。StringBuilder 避免生成这个临时的新字符串而是将其复制到“char[]”。 当追加数字以及某些类型时.NET Standard 2.0Unity 等和 .NET Standard 2.1.NET Core 3.0 等之间的行为会有所不同。 // .NET Standard 2.0 public StringBuilder Append(int value) {return Append(value.ToString(CultureInfo.CurrentCulture)); }// .NET Standard 2.1 public StringBuilder Append(int value) {return AppendSpanFormattable(value); }private StringBuilder AppendSpanFormattableT(T value)where T : ISpanFormattable {if (value.TryFormat(RemainingCurrentChunk,out int charsWritten, format: default, provider: null)){m_ChunkLength charsWritten;return this;}return Append(value.ToString()); } 对于 .NET Standard 2.0它Append时调用了ToString方法。但在 .NET Standard 2.1 中“ISpanFormattable.TryFormat”将其直接写入缓冲区而不通过字符串。ISpanFormattable这个接口是internal的 。但是通过检查 [ ISpanFormattable.references ]您可以看到哪种类型实现了此接口。 通过ZString可以避免添加数字类型时的字符串分配。在 .NET Standard 2.1 中ZString 使用它们的TryFormat。在.NET Standard 2.0中ZString使用移植的TryFormat方法。 API 本身与 StringBuilder 几乎相同。但是它必须用“using”括起来。 // using ZString.CreateStringBuilder instead of new StringBuilder using (var sb ZString.CreateStringBuilder()) {sb.Append(enemy.Name);sb.Append( Current HP:);sb.Append(enemy.Hp);sb.Append( Current MP:);sb.Append(enemy.Mp);if (addStatus){sb.Append( Status:);sb.Append(enemy.Status);}return sb.ToString(); } ZString.CreateStringBuilder ()方法的返回值“Utf16ValueStringBuilder”是一个结构体所以避免了分配到StringBuilder的堆内存。此外由于用于内部写入的“char[]”缓冲区是从ArrayPool获取的因此避免了缓冲区分配。这也是为什么需要通过“using”返回缓冲区。 String.Format 由于 String.Format 的参数只能接受对象因此会发生装箱。 // conversion of String interpolation is rewrited to following by C# compiler ${enemy.Name} Current Hp:{enemy.Hp} Current Mp:{enemy.Mp};// string.Object(string, object, object, object) String.Format({0} Current Hp:{1} Current Mp:{2}, enemy.Name, enemy.Hp, enemy.Mp);// String.Format can avoid params array until 3 arguments string string.Format(string format, object arg0) string string.Format(string format, object arg0, object arg1) string string.Format(string format, object arg0, object arg1, object arg2) string string.Format(string format, params object[] args) 此外与 StringBuilder.Append 一样在 .NET Standard 2.0 中也会发生字符串转换分配。 与“ZString.Concat”一样“ZString.Format”具有最多 15 个参数的通用重载。即使在.NET Standard 2.0环境下通过TryFormat直接转换也能实现零分配。 终极秘诀 ZString 的内部实现是零分配。但当最后总要输出一个字符串还是会产生GC。但是如果适用的库具有接受字符串以外的内容的 API则也可以避免最终的字符串生成并且可以实现完全零分配。例如TextMeshPro有一个名为“SetCharArray(char[] sourceText, int start, int length)”的API可以直接给出它并且可以避免字符串生成。 TMP_Text tmp;// create StringBuilder using(var sb ZString.CreateStringBuilder()) {sb.Append(foo);sb.AppendLine(42);sb.AppendFormat({0} {1:.###}, bar, 123.456789);// direct write(avoid string alloc) to TextMeshProtmp.SetText(sb);// SetText(Utf16ValueStringBuilder) is the same as followingvar buffer sb.AsArraySegment();tmp.SetCharArray(buffer.Array, buffer.Offset, buffer.Count); }// convinient helper to use ZString.Format tmp.SetTextFormat(Position: {0}, {1}, {2}, x, y, z);// other ZString direct write utilities .AsSpan() .AsMemory() .TryCopyTo(Spanchar, out int writtenChars); 参考文献 ZString — Zero Allocation StringBuilder for .NET Core and Unity.
http://www.zqtcl.cn/news/491086/

相关文章:

  • 正规的网店平台有哪些北京公司排名seo
  • 网页制作素材库哪个网站上海门户网站开发
  • 做网站 分辨率应该是多少做阿里巴巴网站要多少钱
  • 有专业做外贸的网站吗千岛湖网站建设
  • 百度怎么做开锁网站中国咖啡网站建设方案
  • 新网站不被收录郑州网站建设培训学校
  • 网站群建设意见征集北京做网站报价
  • 网站建设开发费会计处理山东省住房和城乡建设厅二建查询
  • 市工商局网站建设情况襄阳网站seo诊断
  • 动漫做那个视频网站单网页网站如何做
  • 企业网站名是什么意思广州公共交易中心
  • 做网站那家好沈阳做网站公司哪家好
  • 现在做一个网站大概多少钱中国住房城乡建设部网站
  • 高端企业网站建设核心秦皇岛网站制作人才招聘
  • 网站制作花多少钱简历模板表格
  • 泰安专业网站开发公司网页设计师常逛网站
  • 百度收录万网空间的网站需要多久推广seo网站
  • 个体工商户可以做网站备案吗微信app下载安装官方版2023
  • 内贸在什么网站做做网站需要提供哪些信息
  • 物流网站怎么做推广网页程序开发语言
  • 静态网站跟动态网站开发的层次
  • 公司购买网站怎么做分录被k掉的网站怎么做才能有收录
  • 网页制作相关网站网络卖货平台有哪些
  • 国内网站都要备案吗快速做网站的软件
  • 遂宁市住房和城乡建设局网站自己的网站怎么做美工
  • 资阳网站建设公司中国菲律宾概念股
  • 网站优化报价wordpress 获取别名
  • 自适应网站如何做mip微信网站公司
  • 网站建设改版升级wordpress 艺术家
  • 百度怎么网站排名python做网站的开发