StringBuilder 与 string 性能问题

火爆马甲 2011-11-08 06:10:13
大家好

我写了一段代码 利用LINQ迭代 一个DATATABLE , 迭代返回的是一个按格式返回的字符串, 在匿名方法里 是这样写的:


var format1= @"{{ name:""{0}"",{1}id:""{2}"",parentId:""{3}"",code:'{4}'{5}}}";
return new StringBuilder().AppendFormat(format1,
row["TypeName"],
row["Id"],
row["Id"],
row["Id"],
row["ParentId"],
row["Id"]).ToString();//注意后面还有ToString()

因为有些原因,没有创建 StringBuilder对象,都是动态实例化的。

我知道 StringBuilder 与 string 拼接的性能问题,但是我觉得这样创建的StringBuilder对象还不如string.Format来的自然。

我想知道谁能告诉我在这种情况下,究竟哪个性能高一点??有谁能帮忙测试一下吗?
...全文
240 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
迷迷520 2011-11-09
  • 打赏
  • 举报
回复
DataTableToJson...
铜臂阿铁木 2011-11-09
  • 打赏
  • 举报
回复
当然,在无法重新设计前后台交互的情况下,这种大型的返回结果只能忍了。
铜臂阿铁木 2011-11-09
  • 打赏
  • 举报
回复
推荐lz只返回父节点,当需要子节点的时候再去读取。

因为不管怎样用StringBuilder去优化,或方法如何优化,递归的结果都是string,并且返回值也是string。如同你所说的10w多条Row,即使再怎么优化,使用递归也会有很多的中间结果,加上最终结果的层层叠加,这可不是小数目了。

LrritableMum 2011-11-09
  • 打赏
  • 举报
回复
好吧,我把方法贴出来,虽然有点改动,但感觉差不多....Anyway. 谁能帮我优化一下,我把分给他

/// <summary>
/// DATATABLE转换为Tree形式的JSON格式
/// </summary>
/// <param name="rows"></param>
/// <returns></returns>
private string DataTableToJson(DataRow[] rows)
{
StringBuilder _sBuild;
var q = rows.Select(row => {
var children = row.Table.Select("ParentId='" + row["Id"] + "'");//查询子节点
var json = @"{{ name:""{0}"",{1}id:""{2}"",parentId:""{3}"",code:'{4}'{5}}}";
_sBuild = new StringBuilder();
return _sBuild.AppendFormat(json,
row["TypeName"],
children.Length > 0 ? " open:false," : "",
row["Id"],
row["ParentId"],
row["Id"],
children.Length > 0 ? ",\n childs: " + DataTableToJson(children) : "" //验证其是否含有子节点,如果存在则递归
).ToString();
});
return "[\n" + string.Join(",\n", q.ToArray()) + "\n]";
}

阿非 2011-11-09
  • 打赏
  • 举报
回复
多嵌套一个方法?

return new StringBuilder().AppendFormat(format1,
row["TypeName"],
row["Id"],
row["Id"],
row["Id"],
row["ParentId"],
row["Id"]).ToString();

你是说你要坚持这个?
LrritableMum 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sandy945 的回复:]

你这种情况应该直接使用string.Format
[/Quote]
直接使用 就会多嵌套一个方法。近10万个DataRow迭代加递归 就会多调用多少次方法?所以我坚持我写的,当然没有最好的话。
Daqing 2011-11-09
  • 打赏
  • 举报
回复
StringBuilder的出现时因为它自身有大小的限制,而且是自动变化的,比起string来效率更高,而且tostring方法的也是为了指定它需要转换成字符的起始位置和长度。但是stringbuilder的高性能我们很少用到,因为大量的字符串很少会遇到。多用string,也出于习惯。
LrritableMum 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dalmeeme 的回复:]

这个是string.Format方法的.net源代码:
C# code
public static string Format(IFormatProvider provider, string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ……
[/Quote]
谢谢你帮我 reflect ,如果有人能帮忙些一个测试性能demo ,他将是我我的 哥们。。
火爆马甲 2011-11-09
  • 打赏
  • 举报
回复
我这个迭代方法还具有递归的功效。。
黄亮 2011-11-08
  • 打赏
  • 举报
回复
你过你前后不再追加直接用string.Format。如果后面还有+就用StringBuilder
dalmeeme 2011-11-08
  • 打赏
  • 举报
回复
这个是string.Format方法的.net源代码:
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();
}


dalmeeme 2011-11-08
  • 打赏
  • 举报
回复
直接用string.Format比较好,该方法内部也是用StringBuilder实现的。
阿非 2011-11-08
  • 打赏
  • 举报
回复
你这种情况应该直接使用string.Format
Flashcom 2011-11-08
  • 打赏
  • 举报
回复
只是这么简单的几个值的拼接,用string就可以了

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧