电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

三种字符串加法运算的效率问题


发布日期:2022/10/7
 

using System;

using SystemText;

namespace ConsoleApplication

{

class Program

{

private const int loopTimes = ;

static void Main(string[] args)

{

string str = stringEmpty;

string str = stringEmpty;

StringBuilder sb = new StringBuilder();

DateTime timeStart = DateTimeNow;

for (int i = ; i < loopTimes; i++)

{

str += iToString();

str += iToString();

str += iToString();

}

ConsoleWriteLine(stringFormat(字符串直接做加法运行{}次的时间是:{} loopTimes DateTimeNowSubtract(timeStart)));

timeStart = DateTimeNow;

for (int i = ; i < loopTimes; i++)

{

str += stringFormat({}{}{} i i i);

}

ConsoleWriteLine(stringFormat(字符串format运行{}次的时间是:{} loopTimes DateTimeNowSubtract(timeStart)));

timeStart = DateTimeNow;

for (int i = ; i < loopTimes; i++)

{

sbAppend(i);

sbAppend(i);

sbAppend(i);

}

ConsoleWriteLine(stringFormat(stringbuilder运行{}次的时间是:{} loopTimes DateTimeNowSubtract(timeStart)));

}

}

} 字符串直接做加法运行次的时间是::: 字符串format运行次的时间是::: stringbuilder运行次的时间是:::

字符串直接做加法运行次的时间是::: 字符串format运行次的时间是::: stringbuilder运行次的时间是:::

从上面的两次循环可以看出来

字符串直接做加法相当于的n次方(每一次加法都会留下一个副本) 字符串format相当于(的n次方)/X (X >= && X <=) (format方法每次只留下一个副本不管里面有几个参数 注 : 最多只能有个参数) stringbuilder相当于n * (从始至终都只有本身)

看了上面稍微业余点的说明相信大家明白了为什么技术主管在抽查代码的时候看到一堆的字符串加法会火冒三丈了吧(而且这些副本的销毁是有GC控制的时间不能确定所以短时间进行了海量的字符串加法运算内存会爆掉的)所以技术主管骂人也就可以理解了: 一方面是效率问题令一方面是内存消耗在此之外技术主管也看到了你本身的令一个问题:你根本就是一个垃圾代码的制造者!

结论:如果是少量的加法运算可以使用StringFormat()如果是类似循环的加法运算别想了肯定是StringBuilderAppend()

上一篇:Lambda表达式的一般应用

下一篇:使用DataAdapter执行批量更新