string.Format时,值类型要不要加ToString,或者说是装箱还是ToString性能高

游北亮
博客专家认证
2011-05-03 02:38:06
加精
今天有个同事跟我说,在string.Format时,后面的值类型参数都要加上tostring,这样会提高很大的性能
比如:
不要用
string.Format("{0}", 100);
改用:
string.Format("{0}", 100.ToString());

于是查看了一下il代码,发现2者的区别是
前者进行了装箱:box int32
后者是:call instance string [mscorlib]System.Int32::ToString()

参考:http://msdn.microsoft.com/en-us/library/ms173196(v=vs.80).aspx
说能提高20倍

但是我测试循环20*100万次,性能差距只有20ms左右,我的测试代码:
int a = 1000000;
int b = 4000000;
int l = 1000000;
Stopwatch sw = new Stopwatch();
for(int i=0;i<20;i++)
{
sw.Reset();
sw.Start();
for(int m = 0;m<l;m++)
{
string.Format("{0}", a+m);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int m = 0; m < l; m++)
{
string.Format("{0}", (b+m).ToString());
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.WriteLine();
}


btw:我安装了ReSharper插件,这个插件碰到string.Format("{0}", 100.ToString());
时,总是提示:Redundant Object.Tostring call,并叫我干掉ToString,如果真有大的性能问题,那这个ReSharper岂不是误人子弟?
...全文
2952 157 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
157 条回复
切换为时间正序
请发表友善的回复…
发表回复
ax258 2013-10-17
  • 打赏
  • 举报
回复
一个是调用Int32的toString 转化成string,再转化成object传入format函数中, 一个是直接转化成object 传入format函数中, 第一个没有装箱 但有两次类型转换,第二个有装箱, 经测试性能上几乎无差别。
yojinlin 2012-02-06
  • 打赏
  • 举报
回复
學習了。
larissa523 2012-02-06
  • 打赏
  • 举报
回复
学习了。
吹风的兔子 2012-02-02
  • 打赏
  • 举报
回复
代码1: string 参数 = (string.Empty+Request["URL参数"]).Trim();

代码2: string 参数 = Request["URL参数"];
if(string.IsNullOrEmpty(参数)) 参数=string.Empty;
参数=参数.Trim();

代码3: string 参数 = (Request["URL参数"] as string ?? string.Empty).Trim();


这三种代码,最后的 “参数” 都是 不为 null 的;
那个代码效率高,哪个代码更容易理解.....

你会写 第二种 的悲催代码吗???
KLL 2011-05-12
  • 打赏
  • 举报
回复
jfzr
zhongzhijian2011 2011-05-12
  • 打赏
  • 举报
回复
加上更好吧, 我习惯加上的.
wys46 2011-05-12
  • 打赏
  • 举报
回复
其实还是看项目的需求吧,如果应用的人不多这点小问题就不用较汁了,如果很多人使用就要注意点啊,但是还是提倡加吧
bwangel 2011-05-11
  • 打赏
  • 举报
回复
加ToString会废掉所有String.Format的丰富的格式化操作符.因为你全把参数当成了字符串.
如果对象为NULL,你加ToString还会抛异常.
bwangel 2011-05-11
  • 打赏
  • 举报
回复
加ToString无聊透顶
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ojlovecd 的回复:]

我从来都是偷懒,不加ToString的……
但加上确实是一个好的习惯
[/Quote]

我我也是
niaoked 2011-05-11
  • 打赏
  • 举报
回复
不加ToString()肯定会存在的装箱的操作。
系统会重新生成一个对象。
在性能上会有一定的影响,具体数量级就要取决你使用的规模。

我觉得还是加上比较好,毕竟对效率提高有好处,不管效果有多明显。积少成多嘛。
同时也是一个意识和习惯问题。
火星大能猫 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 microtry 的回复:]

1.楼主的问题跟性能无关,
我的编程习惯是:避免隐式类型转换

2.
引用 12 楼 dreamrising 的回复:
想起来一个故事,说中国和印度程序员写程序的风格问题,中国程序员把很多时间花在优化上。。。

事实上,我们的团队根本不懂什么性能优化,才会有那么多人浪费大量的时间在莫名其妙的所谓性能问题上,
很多人只会纸上谈兵,面向对象天天挂在嘴上,却不懂在团队中怎么实践职责……
[/Quote]

我觉得中国很少有程序员把时间花在性能和代码优化上.都是作坊式生成.
hl362496158 2011-05-10
  • 打赏
  • 举报
回复
有些工具互相之间就是冲突的!想我以前弄JSLint的时候很多没错的再工具上面多报错了,我觉得只要自己认为真的是好的那 就用吧!!
Senny_01 2011-05-09
  • 打赏
  • 举报
回复
社区医疗保健
Iamagril 2011-05-09
  • 打赏
  • 举报
回复
数据少的时候都差不多,当数据庞大时就有区别了,加上 toString() 最好
Daqing 2011-05-09
  • 打赏
  • 举报
回复
看到此贴,表示大家都蛮会过日子,精打细算啊!
danjiewu 2011-05-09
  • 打赏
  • 举报
回复
就按lz说的测试数据,多打10个字只是为了运行20*100万次后能节省20ms时间,这效率太差了。
实际上这条语句可能一辈子也运行不了20*100万次,如果真的会运行这么多次那么根本也不应该用String.Format了,所以这种优化毫无意义。
feisheng512 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 fengyarongaa 的回复:]
每次我都加上了

只是要用在合适的地方而已
[/Quote]

尽管这些的影响微乎其微,但这样的回答还是蛮理智的...
redfoxlee 2011-05-08
  • 打赏
  • 举报
回复
我觉得还是看你应用的场景吧。构造的字符串不大的话,省略tostring代码看起来也许更简洁些。所谓的性能问题是根据场景不同而不同的,有的时候也并没有想像的那么夸张。
  • 打赏
  • 举报
回复
[Quote=引用 126 楼 thestarmm 的回复:]
太抠了,这种性能何必放在眼里,对于现在的服务器来说,真没必要,
好好的做好设计,做好业务逻辑,这些地方才是会出性能问题的
[/Quote]
嗯,同意。
加载更多回复(94)

111,100

社区成员

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

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

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