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左右,我的测试代码:
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()。
不会有太大性能差。
不全对。format是会自动调用Tostring(),但是它的参数是object类型的,你传进去值类型会先被装箱成object,然后再调用装箱后的对象的Tostring。而不是值类型上的Tostring方法了,所以好的习惯还是加上为好
------解决方案-------------------- 会有性能提升的,不能忽略,如果你这个地方忽略一点,那个地方也会略一点,最后积累起来,你的程序就会慢很多。
主动调用ToString,那就是直接操作堆栈里的int,这样肯定快
如果不主动调用,就会把int传给string.Format
这个操蛋的函数的参数都是object类型,
这样参数传递的时候就会发生类型转换,而且是从值类型int到引用类型,会装箱,从堆栈到堆
之后那个format函数会调用object的ToString,操作的是已经装箱到堆里的那个int,必然会慢
------解决方案-------------------- 想起来一个故事,说中国和印度程序员写程序的风格问题,中国程序员把很多时间花在优化上。。。
------解决方案-------------------- 引用: 想起来一个故事,说中国和印度程序员写程序的风格问题,中国程序员把很多时间花在优化上。。。
我认为优化是非常必要的
WF 关于动态加载复杂状态机工作流的有关问题