问个关于装箱的性能问题...

TimLeaf 2009-04-03 02:43:15
int a = 0;

Object b = a 与 a.ToString()
这两句...在性能上有什么差别?
...全文
251 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluedodo 2009-05-21
  • 打赏
  • 举报
回复
学习了
TimLeaf 2009-04-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 Garnett_KG 的回复:]
引用
你看的什么书?赶紧丢掉去...纯属胡说八道...

Console.WriteLine(值类型 + "," + 引用类型);
Console.WriteLine(值类型.ToString() + "," + 引用类型);
Console.WriteLine(值类型.ToString() + "," + 引用类型.ToString());
完全一样没有任何区别...

Console.WriteLine(值类型 + "," + string);
Console.WriteLine(值类型.ToString() + "," + string);
完全一样没有任何区别...

首先str…
[/Quote]
呵呵...Jeffrey Richter的作品啊...
以前我也是这样认为的,所以不知不觉引入了很多装箱的操作,浪费了一些不必要的性能。
现在似乎明白一些了...
谢谢大家...
vrhero 2009-04-04
  • 打赏
  • 举报
回复
哦...不好意思,想当然了...确实是我错了...lz请无视13楼的答复...
Garnett_KG 2009-04-04
  • 打赏
  • 举报
回复
[Quote]
你看的什么书?赶紧丢掉去...纯属胡说八道...

Console.WriteLine(值类型 + "," + 引用类型);
Console.WriteLine(值类型.ToString() + "," + 引用类型);
Console.WriteLine(值类型.ToString() + "," + 引用类型.ToString());
完全一样没有任何区别...

Console.WriteLine(值类型 + "," + string);
Console.WriteLine(值类型.ToString() + "," + string);
完全一样没有任何区别...

首先string类型是一种特殊的引用类型...其次在这种情况下+运算符会自动调用值类型或引用类型对象的ToString方法,并不存在装拆箱操作...
[/Quote]


我看你才是纯属胡说八道!

未装箱的值类型虽然没有类型对象指针,但却可以调用类型继承或是重载的虚方法,因为CLR正好可以call指令去调用这些虚方法
(不是callvirt)

Console.WriteLine(值类型 + "," + 引用类型);
>>>
值类型类型必须boxing.

Console.WriteLine(值类型.ToString() + "," + 引用类型);
>>>
不会发生任何boxing.


int i = 10;
object o=new object();

//(1)
Console.WriteLine(i.ToString() + "," + o);
//(2)
Console.WriteLine(i + "," + o);

//(1)的IL代码
IL_000c: call instance string [mscorlib]System.Int32::ToString()
IL_0011: ldstr ","
IL_0016: ldloc.1
IL_0017: call string [mscorlib]System.String::Concat(object,
object,
object)
IL_001c: call void [mscorlib]System.Console::WriteLine(string)

//(2)的IL代码
IL_0023: box [mscorlib]System.Int32
IL_0028: ldstr ","
IL_002d: ldloc.1
IL_002e: call string [mscorlib]System.String::Concat(object,
object,
object)
IL_0033: call void [mscorlib]System.Console::WriteLine(string)



啥也不说了,自己看IL代码吧。





vrhero 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 TimLeaf 的回复:]
呵呵...
没有产生装箱...我也是这样认为的...
如果有装箱的话性能上有缺陷...
不过装箱的原理也是返回一个引用类型...
而a.ToString 返回的也是一个引用类型...
它们之间性能上有差别吗?
书上有这样一个例子Console.WriteLine(值类型, + "," + 引用类型);
它说进一步的优化方法是这样:Console.WriteLine(值类型.ToString() + "," + 引用类型);
按照书上说的,性能仿佛是值类型.ToString() > 装箱操作...
可是原理却仿佛又一样~[/Quote]
你看的什么书?赶紧丢掉去...纯属胡说八道...

Console.WriteLine(值类型 + "," + 引用类型);
Console.WriteLine(值类型.ToString() + "," + 引用类型);
Console.WriteLine(值类型.ToString() + "," + 引用类型.ToString());
完全一样没有任何区别...

Console.WriteLine(值类型 + "," + string);
Console.WriteLine(值类型.ToString() + "," + string);
完全一样没有任何区别...

首先string类型是一种特殊的引用类型...其次在这种情况下+运算符会自动调用值类型或引用类型对象的ToString方法,并不存在装拆箱操作...
only_lonely 2009-04-04
  • 打赏
  • 举报
回复
额···
TimLeaf 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cppfaq 的回复:]
我估计楼主是想问
a.ToString()
这句有没有产生装箱.

没有。
[/Quote]
呵呵...
没有产生装箱...我也是这样认为的...
如果有装箱的话性能上有缺陷...
不过装箱的原理也是返回一个引用类型...
而a.ToString 返回的也是一个引用类型...
它们之间性能上有差别吗?
书上有这样一个例子Console.WriteLine(值类型, + "," + 引用类型);
它说进一步的优化方法是这样:Console.WriteLine(值类型.ToString() + "," + 引用类型);
按照书上说的,性能仿佛是值类型.ToString() > 装箱操作...
可是原理却仿佛又一样~
cppfaq 2009-04-03
  • 打赏
  • 举报
回复
我估计楼主是想问
a.ToString()
这句有没有产生装箱.

没有。
十八道胡同 2009-04-03
  • 打赏
  • 举报
回复
不知道,顶!
TimLeaf 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wartim 的回复:]
你看书看一半的?。。。
我记得相关书上的例子说的是一个
Console.Write(。。。+。。。)的例子,然后
如果直接传object会发生3次装箱
而先ToString就不会发生这么多装箱,具体例子忘了
[/Quote]
呃...书确实没有看完...
不过那一章是看完了...
其实我想问的就是
Object b = a 与 a.ToString()
这两句...在性能上有什么差别?

装箱什么的,我大概明白了...
zgke 2009-04-03
  • 打赏
  • 举报
回复
object b b是引用a

a.ToString() 返回一个STRING的引用...不知道你想比什么?
wartim 2009-04-03
  • 打赏
  • 举报
回复
你看书看一半的?。。。
我记得相关书上的例子说的是一个
Console.Write(。。。+。。。)的例子,然后
如果直接传object会发生3次装箱
而先ToString就不会发生这么多装箱,具体例子忘了
  • 打赏
  • 举报
回复
没有看出有共同点~~~
TimLeaf 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bulong0721 的回复:]
有可比性吗?
[/Quote]
嗯...
Object b = a;是装箱...
a.ToString() 返回的是一个String的引用...
TimLeaf 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 niitnanfeng 的回复:]
你自己去看看c#技术内幕一书。
[/Quote]
正在看.NET 框架设计...
貌似a.ToString()性能好一点?
niitnanfeng 2009-04-03
  • 打赏
  • 举报
回复
你自己去看看c#技术内幕一书。
bulong0721 2009-04-03
  • 打赏
  • 举报
回复
有可比性吗?

111,126

社区成员

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

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

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