读书人

为什么总看到有人说因为用了StringBui

发布时间: 2012-05-05 17:21:10 作者: rapoo

为什么总看到有人说因为用了StringBuilder所以string.Format一定效率高

C# code
    class Program    {        static void Main(string[] args)        {            var a = Guid.NewGuid().ToString();            var b = Guid.NewGuid().ToString();            var c = Guid.NewGuid().ToString();            var sw = new Stopwatch();            sw.Start();            for (int i = 0; i < 1000000; i++)            {                var s = "123" + a + "456" + b + "789" + c;            }            sw.Stop();            Console.WriteLine(sw.ElapsedMilliseconds);            sw.Restart();            for (int i = 0; i < 1000000; i++)            {                var s = String.Format("123{0}456{1}789{2}", a, b, c);            }            sw.Stop();            Console.WriteLine(sw.ElapsedMilliseconds);        }    }





[解决办法]
String.Format其实内部使用的就是StringBuilder


public static string Format(IFormatProvider provider, string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
builder.AppendFormat(provider, format, args);
return builder.ToString();
}



[解决办法]
你的循环体里面字符串都是一样的当然前者快 字符串驻留机制 试试后面+i
[解决办法]
对于固定长度字符串运算,format没有优势,format优势在于,操作起来更加直观
处理变长度字符串 StringBuilder效率高,越长越高
[解决办法]

测试一下追加字符串才比较有意义

C# code
static void Main(string[] args)        {            var a = Guid.NewGuid().ToString();            var b = Guid.NewGuid().ToString();            var c = Guid.NewGuid().ToString();            var str1 = string.Empty;            var str2 = string.Empty;                       var sw = new Stopwatch();            sw.Start();            for (int i = 0; i < 10000; i++)            {               str1 += string.Format("123{0}456{1}789{2}", a, b, c);                                                }            sw.Stop();                       Console.WriteLine(sw.ElapsedMilliseconds);            sw.Reset();            sw.Start();            StringBuilder sb = new StringBuilder();                       for (int i = 0; i < 10000; i++)            {                sb.AppendFormat("123{0}456{1}789{2}", a, b, c);            }            sw.Stop();                     Console.WriteLine(sw.ElapsedMilliseconds);            sw.Reset();            sw.Start();                      for (int i = 0; i < 10000; i++)            {                str2 += "123" + a + "456" + b + "789" + c;            }            sw.Stop();                      Console.WriteLine(sw.ElapsedMilliseconds);            Console.ReadLine();        }//测试最后的字符串长度都是1170000//1.string.format用时:15973//2.AppendFormat用时:18//3.+用时:16814//追加字符串时2的速度很明显,而2和3速度都快不到哪去,两者不相上下
[解决办法]
http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED#xx367414xx
[解决办法]
探讨

我的时间 还算上了这句话:
StringBuilder sb = new StringBuilder();

[解决办法]
原来楼主是说一次性拼接字符串啊。


是真接用+号;
不用+= 号啊,
那楼主的结果是当然的了, +号只会拼成一个,

而 += 号不同:
比如 a +="abc"; //原先 a="123";
首先, 是变成 a= a+"abc";
接着, 要 一块 内存 ["123"+"abc"]//这里耗时
再将, 引用变量a 指向的内存释放,//这里耗时
最后, 引用变量a 指向新内存 ["123"+"abc"]

所以才会耗时,(拼接字符串不耗时, 是操作内存耗时的)
[解决办法]
string.Format的参数是params object[] args
所以参数如果是值类型,一定要记得加ToString()
比如:
string.Format("{0}{1}{2}", 1,2,3);

string.Format("{0}{1}{2}", 1.ToString(),2.ToString(),3.ToString());
效率低,前者有装箱
[解决办法]

C# code
public static string Format(IFormatProvider provider, string format, params object[] args){    if ((format == null) || (args == null))    {        throw new ArgumentNullException((format == null) ? "format" : "args");    }    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));    builder.AppendFormat(provider, format, args);    return builder.ToString();}
[解决办法]
string.format每次都是重新开辟内存空间
所以如果平凡的对一个对象进行操作,还是用stringbuild好些。
反之用string
[解决办法]
楼主你给的例子很不恰当,你的例子很明显是第一种写法效率高,我不用测试就可以得出的结论。
你把你的例子修改下再测试,那时才是第二种效率高。
C# code
for (int i = 0; i < 1000000; i++){    var s = "123" + a + "456" + b + "789" + c;}
[解决办法]
8#说得很清楚了
频繁用+拼接太奢侈
[解决办法]
上面大部分人根本没明白LZ在说什么。。。。。。。。。。
[解决办法]
对于字符串的大量拼接建议使用StringBuilder,优化了所占的内存和时间。
[解决办法]
我感觉很少遇见能考验StringBuilder 或者 string.Format极限的时候吧....
不过看过帖子后学到很多基本原理,以前只知道+=比format拼接非固定长度慢,stringBuilder又优Format.
但是类似:
string strSql ="SELECT * FORM a where b=?" 这种我还是喜欢用Format ,传值看起来直观点
[解决办法]
感觉很少能遇见考验StringBuilder或者string.Format极限的时候 以前只知道+=弱于 string.format 弱于 stringbuilder 不过类似 string strSql= "SELECT * FROM a where b=? " 这样的字段我还是乐意用Format 最少看起来直观点

读书人网 >C#

热点推荐