首页 > 编程语言 >C#使用ObjectPool提高StringBuilder性能

C#使用ObjectPool提高StringBuilder性能

时间:2023-03-16 12:57:06浏览次数:41  
标签:index stringBuilderPool C# StringBuilder ObjectPool 使用 stringArray

    在C#中我们知道使用StringBuilder能提高大量字符串拼接的效率,其实StringBuilder的效率也可以提升,那就是使用ObjectPool。本文将介绍怎么使用ObjectPool提高StringBuilder的性能。
一、简介      C# ObjectPool类是一个内置的类库,用于实现对象池模式。它允许您通过在应用程序中创建预定义数量的对象实例,使它们可供重用,使用时不需要每次都创建一个新对象,从而减少了对象创建和销毁的开销。ObjectPool类还提供了对对象池大小和对象的生命周期的控制。
二、使用ObjectPool<StringBuilder>和性能测试    首先新建一个.NET7控制台项目,然后使用nuget包管理器安装ObjectPool包“Microsoft.Extensions.ObjectPool”,也可以使用nuget代码安装。包安装后就可以开始使用它了。代码使用步骤如下:

1、创建StringBuilder的ObjectPool池:

private readonly ObjectPool<StringBuilder> _stringBuilderPool =    new DefaultObjectPoolProvider().CreateStringBuilderPool();

2、请使用 Get() 从池中获取 StringBuilder,如下所示。

var sb = this._stringBuilderPool.Get();

3、像 StringBuilder一样使用,模拟连接数组中的字符串。

for (var index = 0; index < this._stringArray.Length; index++)
{   
 _ = sb.Append(this._stringArray[index]);
}

4、当不再需要StringBuilder 时,将其返回到池中。

_stringBuilderPool.Return(sb);
5、与单独使用StringBuilder 性能测试对比首先使用单例创建一个ObjectPool<StringBuilder>,然后新建一个30万的字符串数组,然后分别使用ObjectPool<StringBuilder>和StringBuilder循环拼接字符串,在使用过程中用Stopwatch 计时,字符串的个数逐渐递减来测试,代码如下:
//引用ObjectPool
using Microsoft.Extensions.ObjectPool;
static void Main(string[] args)
 {
    #region
     //创建测试数组
     List<string> _stringArray=new List<string>();
     for (int i = 0; i <300000; i++)
      {
           _stringArray.Add("欢迎关注公众号:DOTNET开发跳槽"+i);
      }
      //创建Stopwatch 计时
    Stopwatch stopwatch = new Stopwatch();
     stopwatch.Start();
     //创建一个 ObjectPool<StringBuilder>
      ObjectPool<StringBuilder> _stringBuilderPool =new DefaultObjectPoolProvider().CreateStringBuilderPool();
     var sb = _stringBuilderPool.Get();
     for (var index = 0; index < _stringArray.Count; index++)
     {
         _ = sb.Append(_stringArray[index]);
     }
     _stringBuilderPool.Return(sb);
     stopwatch.Stop();
     // 获取TimeSpan值形式的运行时间。
     TimeSpan ts = stopwatch.Elapsed;
    Console.WriteLine($"使用ObjectPool的运行时间:{ts.Ticks}");
    //重新计时
     stopwatch.Restart();
     //使用StringBuilder实现
     StringBuilder sb2 = new StringBuilder();
     for (var index = 0; index < _stringArray.Count; index++)
     {
         _ = sb2.Append(_stringArray[index]);
     }
     stopwatch.Stop();
     TimeSpan ts2 = stopwatch.Elapsed;
     Console.WriteLine($"使用StringBuilder的运行时间:{ts2.Ticks}");
     #endregion
 }

 

 


由测试可以看出,在5万以上ObjectPool<StringBuilder>的效率要高于StringBuilder的,大家使用时可以参考。具体效率根据电脑配置和电脑的使用进程情况来定,非专业测试,以上测试仅供参考。

结语
   本文讲述了C#使用ObjectPool提高StringBuilder性能的方法,并用案例对比测试了使用StringBuilder和使用ObjectPool<StringBuilder>的情况,由测试结果来看,并非在所有情况使用ObjectPool<StringBuilder>效率就高,也正如StringBuilder在数据量小的情况下不推荐使用。另外ObjectPool不止这点功能,它可以加入其它对象,帮助减少对象创建和销毁的开销,并提高应用程序的性能。希望本文对你有所收获,同时欢迎留言吐槽。

参考:微软.NET官方文档

标签:index,stringBuilderPool,C#,StringBuilder,ObjectPool,使用,stringArray
From: https://www.cnblogs.com/xbhp/p/17222138.html

相关文章

  • 41. CF-Graph Coloring
    链接先考虑怎样的图可以染色或者不能染色。容易发现,1和3不能相邻,它们其实是等价的。那么能染色的必要条件就是所有的子图都是二分图。此外,每个二分图都取左部或者右部......
  • gitlab centos安装
    相关配置:1、yum安装相关依赖安装curl,policycoreutils-python,openssh-server服务#yuminstallcurlpolicycoreutils-pythonopenssh-server-y2、启动sshd服务,并激活开......
  • modbusCRC 16校验 本机通过
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespacemodbusCRC16{publicclassCla......
  • JavaScript随笔
    数据类型简单数据类型(原始类型):Undefined、Null、Boolean、Number、String和Symbol复杂数据类型:Object深拷贝与浅拷贝浅拷贝Object.assignArray.prototype.slice()......
  • C#-进程相关的工具类
    /***┌──────────────────────────────────────────────────────────────┐*│描述:进程相关的工......
  • ACP云原生容器工程师 - ASM服务网格概述
    概述技术概要第一代服务网格服务网格基础设施层微服务通信保证请求可靠传递隐藏通信细节减少框架耦合预言无关数据平面边车模式通信代......
  • socket 通讯练习 本机已通过
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Net;usi......
  • 什么是OpenStack?
    最近有人问我,现在这个时代基本上算是一个云计算的时代,传统的网络工程师还有出路吗?有!肯定有!虽然现在是云计算的时代,但是我们发展还远没有预想的那么快。2002年亚马逊(Amazon)提......
  • Object.prototype.toString判断类型的原理
    项目中,我们经常会直接使用Object.prototype.toString用来做类型判断。他基本是几种方法里可以开箱即用、且判断类型最完善了。现在我们来扒皮一下他。具体原理在toString......
  • 传统CV算法总结-边缘检测系列
    第一章概述1.边缘检测概述1.1认识边缘边缘的定义边缘是不同区域的分界线,是周围(局部)灰度值有显著变化的像素点的集合,有幅值与方向两个属性。这个不是绝对的定义,边缘是局......