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

node.js做直播网站wordpress评论详情页

node.js做直播网站,wordpress评论详情页,网页设计作业代做,前端开发培训课程在之前的文章中#xff0c;我们介绍了 dotnet 在字符串拼接时可以使用的一些性能优化技巧。比如#xff1a;为StringBuilder设置 Buffer 初始大小使用ValueStringBuilder等等 不过这些都多多少少有一些局限性#xff0c;比如StringBuilder还是会存在new StringBuilder()这样…在之前的文章中我们介绍了 dotnet 在字符串拼接时可以使用的一些性能优化技巧。比如为StringBuilder设置 Buffer 初始大小使用ValueStringBuilder等等 不过这些都多多少少有一些局限性比如StringBuilder还是会存在new StringBuilder()这样的对象分配包括内部的 Buffer。ValueStringBuilder无法用于async/await的上下文等等。都不够的灵活。那么有没有一种方式既能像StringBuilder那样用于async/await的上下文中又能减少内存分配呢其实这可以用到存在很久的一个 Tips那就是想办法复用StringBuilder。目前来说复用StringBuilder推荐两种方式使用 ObjectPool 来创建StringBuilder的对象池如果不想单独创建一个对象池那么可以使用StringBuilderCache使用 ObjectPool 复用这种方式估计很多小伙伴都比较熟悉在.NET Core 的时代微软提供了非常方便的对象池类ObjectPool因为它是一个泛型类可以对任何类型进行池化。使用方式也非常的简单只需要在引入如下 nuget 包dotnet add package Microsoft.Extensions.ObjectPoolNuget 包中提供了默认的StringBuilder池化策略StringBuilderPooledObjectPolicy和CreateStringBuilderPool()方法我们可以直接使用它来创建一个 ObjectPoolvar provider  new DefaultObjectPoolProvider(); // 配置池中StringBuilder初始容量为256 // 最大容量为8192如果超过8192则不返回池中让GC回收 var pool  provider.CreateStringBuilderPool(256, 8192);var builder  pool.Get(); try {for (int i  0; i  100; i){builder.Append(i);}builder.ToString().Dump(); } finally {// 将builder归还到池中pool.Return(builder); }运行结果如下图所示当然我们在 ASP.NET Core 等环境中可以结合微软的依赖注入框架使用它为你的项目添加如下 NuGet 包dotnet add package Microsoft.Extensions.DependencyInjection然后就可以写下面这样的代码从容器中获取ObjectPoolProvider达到同样的效果var objectPool  new ServiceCollection().AddSingletonObjectPoolProvider, DefaultObjectPoolProvider().BuildServiceProvider().GetRequiredServiceObjectPoolProvider().CreateStringBuilderPool(256, 8192);var builder  objectPool.Get(); try {for (int i  0; i  100; i){builder.Append(i);}builder.ToString().Dump(); } finally {objectPool.Return(builder); }更加详细的内容可以阅读蒋老师关于ObjectPool的系列文章[1]。使用 StringBuilderCache另外一个方案就是在.NET 中存在很久的类如果大家翻阅过.NET 的一些代码在有字符串拼接的场景可以经常见到它的身影。但是它和ValueStringBuilder一样不是公开可用的这个类叫StringBuilderCache。下方所示就是它的源码源码链接点击这里[2]namespace System.Text {/// summary为每个线程提供一个缓存的可复用的StringBuilder的实例/summaryinternal static class StringBuilderCache{// 这个值360是在与性能专家的讨论中选择的是在每个线程使用尽可能少的内存和仍然覆盖VS设计者启动路径上的大部分短暂的StringBuilder创建之间的折衷。internal const int MaxBuilderSize  360;private const int DefaultCapacity  16; //  StringBuilder.DefaultCapacity[ThreadStatic]private static StringBuilder? t_cachedInstance;// summary获得一个指定容量的StringBuilder./summary。// remarks如果一个适当大小的StringBuilder被缓存了它将被返回并清空缓存。public static StringBuilder Acquire(int capacity  DefaultCapacity){if (capacity  MaxBuilderSize){StringBuilder? sb  t_cachedInstance;if (sb ! null){// 当请求的大小大于当前容量时// 通过获取一个新的StringBuilder来避免Stringbuilder块的碎片化if (capacity  sb.Capacity){t_cachedInstance  null;sb.Clear();return sb;}}}return new StringBuilder(capacity);}/// summary如果指定的StringBuilder不是太大就把它放在缓存中/summarypublic static void Release(StringBuilder sb){if (sb.Capacity  MaxBuilderSize){t_cachedInstance  sb;}}/// summaryToString()的字符串生成器将其释放到缓存中并返回生成的字符串。/summarypublic static string GetStringAndRelease(StringBuilder sb){string result  sb.ToString();Release(sb);return result;}} }这里我们又复习了ThreadStatic特性用于存储线程唯一的对象。大家看到这个设计就知道它是存在于每个线程的StringBuilder缓存意味着只要是一个线程中需要使用的代码都可以复用它不过它的是复用小于 360 个字符StringBuilder这个能满足绝大多数场景的使用当然大家也可以根据自己项目实际情况调整它的大小。要使用的话很简单我们只需要把这个类拷贝出来变成一个公共的类然后使用相同的测试代码即可。跑分及总结按照惯例跑个分看看这里模拟的是小字符串拼接场景using System.Text; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Order; using BenchmarkDotNet.Running; using Microsoft.Extensions.ObjectPool;BenchmarkRunner.RunBench();[MemoryDiagnoser] [HtmlExporter] [Orderer(SummaryOrderPolicy.FastestToSlowest)] public class Bench {private readonly int[] _arr  Enumerable.Range(0,50).ToArray();[Benchmark(Baseline  true)]public string UseStringBuilder(){return RunBench(new StringBuilder(16));}[Benchmark]public string UseStringBuilderCache(){var builder  StringBuilderCache.Acquire(16);try{return RunBench(builder);}finally{StringBuilderCache.Release(builder);}}private readonly ObjectPoolStringBuilder _pool  new DefaultObjectPoolProvider().CreateStringBuilderPool(16, 256);[Benchmark]public string UseStringBuilderPool(){var builder  _pool.Get();try{return RunBench(builder);}finally{_pool.Return(builder);}}public string RunBench(StringBuilder buider){for (int i  0; i  _arr.Length; i){buider.Append(i);}return buider.ToString();} }结果如下所示和我们想象中的差不多。根据实际的高性能编程来说代码中没有async/await最佳是使用ValueStringBuilder前面文章也说明了这一点代码中尽量复用StringBuilder不要每次都new()创建它在方便依赖注入的场景可以多使用StringBuilderPool这个池化类在不方便依赖注入的场景使用StringBuilderCache会更加方便另外StringBuilderCache的MaxBuilderSize和StringBuilderPool的MaxSize都快可以根据项目类型和使用调整像我们实际中一般都会调整到 256KB 甚至更大。附录本文源码链接https://github.com/InCerryGit/RecycleableStringBuilderExample参考资料[1]系列文章: https://www.cnblogs.com/artech/p/object-pool-01.html[2]源码链接点击这里: https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/Text/StringBuilderCache.cs
http://www.sadfv.cn/news/110736/

相关文章:

  • 冠县企业做网站推广官方静态网站模板
  • aspnet网站开发实战2021网站你懂我意思正能量
  • 网站关键字优化教程电商自建站
  • wordpress 演示站网站开发基础培训
  • 大型企业网站优化手机网站解析
  • 自助开通网站找源码的网站
  • farfetch 购物网站wordpress主题+演示数据
  • 门户网站cms程序网站死链
  • 凡诺网站建设江苏网站关键词优化优化
  • 下载中国建设银行官网站珠海知名网站
  • 网站技术方案上海最近新闻事件
  • 怎么做家具定制网站常见的管理系统
  • 全网营销培训公司旺道seo优化
  • 如何运营一个公众号重庆seo报价
  • 网站后台设置网站地图阿里巴巴数据分析官网
  • 网站免费维护期是多少wordpress数据库thinkphp
  • 温州网站建设 seo天河手机建网站
  • 珠海手机网站建设费用腾讯云远程安装wordpress
  • 网站开发项目视频网页编辑快捷键
  • 云溪网络建站宝盒专业做网站服务
  • 去哪学做网站深圳住房和建设局网站
  • 百度竞价推广收费seo服务公司深圳
  • 网站建设手机登录密码是什么啊云南网络公司网站建设
  • 影响网站收录的因素微页制作网站模板
  • 成都网站建设技巧乐清网站优化
  • 有什么做服装的网站自媒体网站大全
  • 郑州网站建设 智巢网站开发实训指导书
  • 一个空间建多个网站企业文化墙设计
  • 电商网站seo优化域名策划方案
  • 怎么做网站 教学网络设备管理系统