根据以下单元测试方法,StringBuilder比字符串要慢得多.重新位置,每个人都说StringBuilder的速度更快?我想念什么吗? [TestMethod] public void StringReplace() { DateTime date = DateTime.Now; string template = File.ReadAllText("file.txt"); for (int i = 0; i
以下是关于 stringbuilder 的编程技术问答
由于大量字符串:创建对日志应用程序状态,我们在应用程序中面临非常糟糕的性能. 我们计划至少搬到构建器上的构建器. 我的一种混乱是: 作为字符串构建器称为: StringBuilder sb = new StringBuilder(); sb.append("Very big String object...."); 如果我是对的,"非常大的字符串对象...."仍然是一个仍然在存储器中创建非常大的字符串对象(不可变)的构造函数,该对象保留在字符串池中. 那么,在这种情况下,字符串构建器的用途是什么?因为它肯定会创建一个对象,但会收集垃圾. 但是使用字符串构造器(双Qoutes)创建的字符串"非常大的字符串对象...."仍在内存池中. 解决方案 你不对. "Very big String object...."是一个编译时常数,而不是构造函数,代表它的String对象将进入常数池,每次需要时都可以重复使用.将创建的对象是实际的构建器,其支持称字符数组以及添
正在尝试创建一个良好的代码位,以创建长度(从运行时属性文件读取x)的数量,基于DB生成的序列编号(y),然后是保存文件时使用了文件夹名称. 到目前为止,我提出了三个想法,其中最快的想法是最后一个想法,但是我感谢人们对此可能有任何建议... 1)实例化具有初始容量X的字符串构造器. 2)实例化具有初始容量X的字符串构造器.长度 3)创建一个新的Math.pow(10,X)并添加Y.在新数字上使用string.valueof(),然后substring(1)IT. 显然可以将第二个分为外环和内环部分. 那么,有什么提示吗?使用10,000次迭代的前循环,我从前两个迭代中获得了类似的时间,第三种方法大约要快十倍.这看起来正确吗? 下面的完整测试方法代码... // Setup test variables int numDigits = 9; int testNumber = 724; int numIterations
以下for (Element el : els) entireText += el.text(); 在具有〜64个元素的容器上,每个元素包含〜1kb(总计在〜64kb中),这个简单的循环大约需要 8秒 在典型的低端Android手机上. 这种缓慢的表现使我感到惊讶,因为我的印象是Java编译器将A + B + C替代的表达式替代new StringBuilder(A).append(B).append(C).toString(). . 不是吗? 我缺少什么? 解决方案 这种缓慢的表现令我感到惊讶,因为我在 印象是Java编译器像A + B + C替代表达式 使用新的StringBuilder(a).append(b).append(c).toString(). ,因此编译器创建代码: for (Element el : els) entireText = new StringBuilder(entireText).append(el.te
我有一个传统的Java文件,该文件使用字符串串联来构建巨大的字符串对象.这是一个严重的性能问题. String test="I am a very bad programmer" +"to use concatenation" +"Instead of StringBuilder" +" or StringBuffer"; to StringBuilder strBuilder= new StringBuilder(); strBuilder.append("I am a bad programmer"); strBuilder.append("to use concatenation"); strBuilder.append("Instead of StringBuilder"); strBuilder.append(" or StringBuffer"); String str= strBuilder.toString(); 基本上,我需要在Java中使用一个存根,只
假设我有以下字符串常数: const string constString1 = "Const String 1"; const string constString2 = "Const String 2"; const string constString3 = "Const String 3"; const string constString4 = "Const String 4"; 现在我可以通过两种方式附加字符串: 选项1: string resultString = constString1 + constString2 + constString3 + constString4; option2: string resultString = string.Format("{0}{1}{2}{3}",constString1,constString2,constString3,constString4); internally string.fo
可能的重复: string.format.format效率与StringBuilder一样有效 c#字符串输出:格式或contat? 绩效优先级是什么,应该偏爱以下每个条件的条件是什么: String.Format("{0}, {1}", city, state); 或 city + ", " + state; 或 StringBuilder sb = new StringBuilder(); sb.Append(city); sb.Append(", "); sb.Append(state); sb.ToString(); 解决方案 编译器将尽可能优化字符串concat,例如,刚刚分解为换行目的的字符串通常可以优化为单个字符串文字. 与变量的串联将被编译到String.Concat 中 StringBuilder如果您要做几次(我猜想超过10个),则可能会快得多.在需要时调整其内部缓冲区的大小. 我亲自使用String.Forma
我一直在想在Java中实现charAt charAt函数 这是什么复杂性? 另外,StringBuffer/StringBuilder中的deleteCharAt()? 解决方案 对于String,StringBuffer和StringBuilder,charAt()是一个恒定的时间操作. 对于StringBuffer和StringBuilder,deleteCharAt()是线性时间操作. StringBuffer和StringBuilder具有非常相似的性能特征.主要区别在于前者是synchronized(螺纹安全),而后者则不是. 其他解决方案 让我们依次查看这些方法中每种方法的相应实际Java实现(仅相关代码).那本身将回答他们的效率. string.charat: public char charAt(int index) { if ((index = value.length)) {
我有一个名为stb_Swap_Tabu的A StringBuilder用于存储课程的名称, 我正在使用以下方法来查找课程: stb_Swap_Tabu.ToString.Contains("CourseName") 就我而言,性能是最重要的问题. 有更快的方法吗? 解决方案 StringBuilder并非真正用于所有字符串目的.如果您确实需要搜索一个,则必须编写自己的方法. 有几种适合不同情况的字符串搜索算法. 以下是Knuth-Morris-Pratt算法的简单实现,该算法仅关心序数匹配(没有案例折叠,没有与培养有关的整理,只是对编码匹配的简单编码点).它具有一些初始Θ(m)顶部,其中m是寻求单词的长度,然后在Θ(n)中找到n是与所寻求的单词的距离,或者是整个字符串构建器的长度不在.这击败了简单的char-char比较,即Θ((n-m+1) m)(其中O()符号描述上限,Θ()描述了上限和下限). 这都说,听起来确实像创建列表可能是手头任务的更好方法
我有一个有关使用StringBuilder的性能的问题. 在很长的循环中,我正在操纵StringBuilder,然后将其传递给另一种方法: for (loop condition) { StringBuilder sb = new StringBuilder(); sb.append("some string"); . . . sb.append(anotherString); . . . passToMethod(sb.toString()); } 在每个循环周期中实例化StringBuilder是一个很好的解决方案吗?而称为删除更好,如以下内容吗? StringBuilder sb = new StringBuilder(); for (loop condition) { sb.delete(0, sb.length); sb.append("some string"); . . . sb
假设我在C#中有一个StringBuilder,可以做到这一点: StringBuilder sb = new StringBuilder(); string cat = "cat"; sb.Append("the ").Append(cat).(" in the hat"); string s = sb.ToString(); 这会像具有: 一样高效或更有效 string cat = "cat"; string s = String.Format("The {0} in the hat", cat); 如果是这样,为什么? 编辑 经过一些有趣的答案,我意识到我可能应该在问的问题上有些清楚.我并不是在问哪个在串联时更快,但是在 上更快地注入 一个字符串. 在上面的两种情况下,我都想将一个或多个字符串注入预定义模板字符串的中间. 对不起,混乱 解决方案 注意:当当前版本是.NET 2.0时,此答案是编写的.这可能不再适用于以后的版本.
在上一个问题关于格式化至CSV格式, 使用StringBuilder将比String.Join快.这是真的吗? 解决方案 简短答案:这取决于. 长答案:如果您已经有一系列串联在一起(与定界符),则String.Join是最快的方法. String.Join可以浏览所有字符串以确定所需的确切长度,然后再次复制所有数据.这意味着将涉及 no 涉及额外的复制. 唯一的下行是它必须两次通过字符串,这意味着可能比必要的爆炸量更多的次数. . 如果您不事先将字符串作为数组,则使用StringBuilder>可能会更快 - 但在某些情况下不会.如果使用StringBuilder意味着要做很多副本,则构建数组,然后调用String.Join可能会更快. 编辑:这是指String.Join的单个呼叫与StringBuilder.Append的一堆电话.在最初的问题中,我们有两个不同级别的String.Join调用,因此每个嵌套的调用都会创建一个中间字符串.换句话说,它更加
给定2 toString()实现,以下是一个优选: public String toString(){ return "{a:"+ a + ", b:" + b + ", c: " + c +"}"; } 或 public String toString(){ StringBuilder sb = new StringBuilder(100); return sb.append("{a:").append(a) .append(", b:").append(b) .append(", c:").append(c) .append("}") .toString(); } ? 更重要的是,鉴于我们只有3个属性,它可能不会有所作为,但是在什么时候您会从+ concat切换到StringBuilder? 解决方案 版本1是优选的,因为它较短,编译器实际上将其变
我不明白为什么 system.out.println(name) outputs sam 而不会受到该方法的cont函数的影响,而 system.out.println (名称)输出 sam4 是该方法的附加方法的结果.为什么会影响StringBuilder而不影响字符串?通常,对对象引用的调用方法会影响呼叫者,因此我不明白为什么字符串结果保持不变.预先感谢 public static String speak(String name) { name = name.concat("4"); return name; } public static StringBuilder test(StringBuilder names) { names = names.append("4"); return names; } public static void main(String[] args) { String name = "Sam";
在c#pinvoke中,我如何传递字符串缓冲区,以使c dll填充并返回? Pinvoke声明是什么? C函数声明为 int GetData(char* data, int buflength); 在C#中,我将其声明为 [DllImport(DllName)] static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen); 正确吗?我正在传递像这样的字符串构成变量 int bufferLength = 32; StringBuilder data = new StringBuilder(bufferLength); int result = GetData(data, bufferLength); 我想知道这是正确的吗? 谢谢 解决方案 我相信这是正确的. [DllImport(DllNam
我是Java的初学者,这是我在Stackoverflow上的第一篇文章.尽管我的初始代码与此处的其他帖子相似,但我的问题与实现StringBuilder有关,因此该帖子的原因. 我已经创建了一个方法 **Initial code** private static String padAgain(String result,int padNum) { String str = ""; for(int i = padNum; i >= 0; i--) { str = String.format("%" + padNum + "s", result).replace(" ", "*"); } return str; } 使用String.format方法,用空格(或特殊字符)的字符串左垫.我在程序中使用同样的方法
我正在寻找一种用00000在.dat文件中覆盖某些零件的方法.为此,我有一个带有此类内容的StringBuilder: "00000000 0000000000000000 " 现在,我正在寻找一种用零覆盖文件中的零件的方法,而Justs则将零件的内容保留在空格中. 所以如果我有 "AUEUIGHEVjerhvgm,eiouhegfwoedjkjjjjjjjjjjjjjjje" 我希望它变成 "00000000Vjerhvgm,eio0000000000000000jjjjjjjjjje" 这种方法是否存在?还是我应该以另一种方式完成此任务? 解决方案 var byteCharZero = Convert.ToByte('0'); var stringBuilder = new StringBuilder(" 00000000 0000000000000000 "
情况是,我正在将WCF调用到远程服务器上,该服务器返回XML文档作为字符串. 大多数时候,这个回报值是几个K,有时几十个K,偶尔几百K,但很少可能是几个兆字节(第一个问题是我没有办法知道) . 这些罕见的场合引起了悲伤.我得到了启动的堆栈跟踪: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. at System.Xml.BufferBuilder.AddBuffer() at System.Xml.BufferBuilder.AppendHelper(Char* pSource, Int32 count) at System.Xml.BufferBuilder.Append(Char[] value, Int32 start, Int32 count) at System.Xml.XmlTextReaderImpl.P