首页 / 知识
关于c#:连接字符串的最有效方法?
2023-04-12 19:37:00

Most efficient way to concatenate strings?连接字符串的最有效方法是什么? .NET性能专家RicoMariani就这个问题发表了一篇文章。这并不像人们想象的那么简单。基本建议如下:
另一篇支持此声明的文章来自EricLippert,他详细描述了在一行
有6种类型的字符串连接: 在一个实验中,已经证明,如果单词小于1000(近似值),并且单词大于1000,则使用 有关详细信息,请访问此网站。
从chinh do-stringbuilder开始,速度并不总是更快: 经验法则
大多数时候,StringBuilder是你的最佳选择,但是有一些情况如文章所示,你至少应该考虑每种情况。 如果您在一个循环中操作,那么StringBuilder可能是一种方法;它可以节省定期创建新字符串的开销。不过,在只运行一次的代码中,string.concat可能很好。 然而,RicoMariani(.net optimization guru)编写了一个测验,在最后他说,在大多数情况下,他推荐string.format。 这是我为大型NLP应用程序开发的十年来最快的方法。我有 提高性能有两个关键点;第一个是预先计算所需的确切总大小。当输入是一个数组时,这个步骤很简单,如图所示。对于处理 接下来,考虑到最终字符串的总分配大小,通过在适当的位置构建结果字符串,可以获得最大的性能提升。这样做需要(可能有争议)暂时中止新
完整代码:
我应该提到,这个代码对我自己使用的代码做了轻微的修改。在原来的版本中,我从C调用cpblk il指令来进行实际的复制。为了在这里的代码中实现简单性和可移植性,我将其替换为p/invoke 来自此msdn文章:
因此,如果您信任msdn,那么如果必须执行10个以上的字符串操作/连接,请使用StringBuilder—否则,使用"+"的简单字符串concat就可以了。 另外,请记住,可以告诉StringBuilder分配的初始内存量。
重复附加到尚未预先分配的StringBuilder会导致大量不必要的分配,就像重复连接常规字符串一样。 如果您知道最后一个字符串的长度,可以对其进行琐碎的计算,或者对常见情况进行有根据的猜测(分配太多并不一定是一件坏事),那么您应该向构造函数或容量属性提供此信息。尤其是在运行性能测试以将StringBuilder与其他方法(如String.Concat)进行比较时,这些方法在内部执行相同的操作。您在网上看到的任何测试,如果在比较中不包括StringBuilder预分配,都是错误的。 如果您不能对大小做出任何猜测,那么您可能正在编写一个实用程序函数,它应该有自己的可选参数来控制预分配。 如果要连接字符串文本,还必须指出应该使用
如何:连接多个字符串(C编程指南) 下面可能是连接多个字符串的另一个替代解决方案。
字符串插值 最有效的方法是使用StringBuilder,比如:
@琼西:弦。如果你有一些小东西的话,海螺很好。但是,如果您要连接兆字节的数据,您的程序可能会存储。 尝试这两段代码,您将找到解决方案。
VS
您会发现第一个代码结束得非常快,内存也会很大。 第二个代码可能是内存正常,但需要更长的时间…更长的时间。因此,如果你有一个为很多用户准备的应用程序,并且你需要速度,那么使用第一个。如果你有一个短期的单用户应用程序,也许你可以同时使用两个应用程序,或者第二个应用程序对开发人员来说更"自然"。 干杯。 另一个解决方案: 在循环内部,使用list而不是string。
它非常快。 System.String是不可变的。当我们修改一个字符串变量的值时,一个新的内存被分配给这个新的值,并且以前的内存分配被释放。System.StringBuilder被设计为具有可变字符串的概念,其中可以执行各种操作,而不为修改后的字符串分配单独的内存位置。 这取决于您的使用模式。在string.join、string、concat和string.format之间有一个详细的基准。可以在这里找到:string.format不适用于密集的日志记录。 (这实际上是我对这个问题的回答) 这取决于代码。一般来说,StringBuilder效率更高,但是如果您只连接几个字符串,并将它们放在一行中,那么代码优化可能会为您处理这些字符串。思考代码的外观也很重要:对于较大的集合,StringBuilder将使其更易于阅读,对于较小的集合,StringBuilder只会增加不必要的混乱。 对于两个字符串,您肯定不想使用StringBuilder。在某些阈值之上,StringBuilder开销小于分配多个字符串的开销。 因此,对于更多的2-3个字符串,使用dannysmurf的代码。否则,只需使用+运算符。 |
最新内容
相关内容
python中获取路径的三种方法
python中获取路径的三种方法,工作,代码,情况,培训,下来,路径,文件,也就是,桌面,目录,python中获取路径总结下来分为三种情况:1、获取工作目录python列表有哪些常用方法?
python列表有哪些常用方法?,位置,方法,培训,列表,语法,元素,示例,对象,以上,参数,列表是最常用的Python数据类型,它可以作为一个方括号内的逗Python如何创建对象,有哪些方法
Python如何创建对象,有哪些方法,培训,对象,方法,内容,函数,属性,所在,以上,以下,功能,以下介绍Python创建对象的9种方法。classPoint:def__iniPython静态函数和普通方法的区别
Python静态函数和普通方法的区别,培训,方法,静态,区别,实例,函数,属性,结果,例子,下面,下面通过一个例子,讲解Python静态函数、普通方法、类方python中什么是类方法
python中什么是类方法,培训,方法,实例,静态,定义,参数,函数,内部,变量,属性,python中的类方法,指的是在类中定义的函数,函数在类的内部称为方法python看类里有哪些方法
python看类里有哪些方法,信息,员工,培训,名称,方法,函数,冒号,字符串,语句,结尾,python使用class语句来创建一个新类,class之后为类的名称并以python怎么调用方法
python怎么调用方法,系统,培训,方法,参数,法名,定义,列表,实例,以上,函数,python调用的方法类的方法的定义1、定义一个类deffun_name(self,..python对象与方法的区别是什么
python对象与方法的区别是什么,地址,数据,培训,对象,函数,类型,字符串,方法,表示,身份,python使用对象模型来存储数据,也就是说构造任何类型的python调用方法必须实例化么
python调用方法必须实例化么,代码,培训,方法,静态,工厂,参数,程序,对象,实例,定义,python类中的实例方法和静态方法,在调用时,是有区别的。静态python调用本类方法
python调用本类方法,培训,方法,定义,静态,实例,关键字,以上,更多,内容,python如何调用本类方法要想调用类中的方法,首先要定义一个类,python中python有map方法吗
python有map方法吗,培训,位置,数据,函数,列表,序列,参数,元素,方法,使用方法,python中的map:map()会根据提供的函数对指定序列做映射。第一个python有哪些方法可以解压文件?
python有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大。