日期:2014-05-20  浏览次数:20932 次

string.Format时,值类型要不要加ToString,或者说是装箱还是ToString性能高
今天有个同事跟我说,在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左右,我的测试代码:
C# code
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岂不是误人子弟?

------解决方案--------------------
这个问题前几天讨论过,http://topic.csdn.net/u/20110427/16/c193244f-9870-4030-a1c7-4378d3c69129.html其实这里面即使有性能损耗也是微乎其微的,绝对可以忽略不计,在实际应用中也很少会有这么大量使用的情况吧
------解决方案--------------------
我从来都是偷懒,不加ToString的……
但加上确实是一个好的习惯
------解决方案--------------------
我之前使用string.Concat,貌似比string.Format效率要高,具体我没测试过,楼主可以试试
------解决方案--------------------
没有必要加了,format会自动调用对象的Tostring()。
不会有太大性能差。
------解决方案--------------------
探讨

没有必要加了,format会自动调用对象的Tostring()。
不会有太大性能差。

------解决方案--------------------
会有性能提升的,不能忽略,如果你这个地方忽略一点,那个地方也会略一点,最后积累起来,你的程序就会慢很多。

主动调用ToString,那就是直接操作堆栈里的int,这样肯定快

如果不主动调用,就会把int传给string.Format
这个操蛋的函数的参数都是object类型,
这样参数传递的时候就会发生类型转换,而且是从值类型int到引用类型,会装箱,从堆栈到堆
之后那个format函数会调用object的ToString,操作的是已经装箱到堆里的那个int,必然会慢
------解决方案--------------------
想起来一个故事,说中国和印度程序员写程序的风格问题,中国程序员把很多时间花在优化上。。。
------解决方案--------------------
探讨

想起来一个故事,说中国和印度程序员写程序的风格问题,中国程序员把很多时间花在优化上。。。

------解决方案--------------------
要优化也要优化在瓶颈上,瓶颈要通过试验定位和确定。
值加ToString影响代码阅读,不是好的习惯。

比如下列代码用德文显示今天的股价。string.Format可以使用一个CultureInfo统一对所有的参数进行格式话。这种情况下使用ToString将更麻烦,也需要更多的维护。
C# code

CultureInfo de = new CultureInfo("de-de");
string report = string.Format(de, "{0:D}: {1:C}", DateTime.Now, 1234.23);
// Dienstag, 3. Mai 2011: 1.234,23 €

------解决方案--------------------
挺有意思的问题,但我不懂,各位继续讨论,占楼学习。
------解决方案--------------------
这类问题我好像在哪看到过。。其实也就一个习惯问题吧。。。

不过对技术感兴趣的,可以研究。。


------解决方案--------------------
探讨
是,尤其是大站点,超过千万pv的时候,加起来就很可观了

------解决方案--------------------
没有必要