这样代码的区别

jianshao810 2012-03-31 07:57:22

string tmp;
for (int i = 0; i < 10; i++)
tmp = new String(new char[] { 'a', 'b' });
for (int i = 0; i < 10; i++)
{
string t = new String(new char[] { 'a', 'b' });
}



tmp 与 t 有什么性能上的区别?
...全文
330 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
he110w0rld 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

如果你纠结于所谓的“性能”问题,那么就自己写一个测试,分别运行100000次然后计算出平均每一次所花费的时间。关键地,不要停留在10毫秒和9毫秒的差别上,而要知道假设一个应用程序有几条语句万一这样“修改”,对应用程序到底值几毛钱价值?
[/Quote]

very good!
浪漫江湖 2012-04-04
  • 打赏
  • 举报
回复
本人是来凑热闹的,性能真的很重要吗?弄懂原理才是重要的。
he110w0rld 2012-04-03
  • 打赏
  • 举报
回复
大婶们都在讨论这个?
jointan 2012-04-02
  • 打赏
  • 举报
回复
没有任何区别

不相信的可以用ildasm.exe反编译一下,看看内容一样与否.
劼哥stone 2012-04-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

如果你纠结于所谓的“性能”问题,那么就自己写一个测试,分别运行100000次然后计算出平均每一次所花费的时间。关键地,不要停留在10毫秒和9毫秒的差别上,而要知道假设一个应用程序有几条语句万一这样“修改”,对应用程序到底值几毛钱价值?
[/Quote]

我觉得楼主只是想弄清楚这个问题的底层实现,而并不是纠结于“性能”。
orochiheart 2012-04-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

如果你纠结于所谓的“性能”问题,那么就自己写一个测试,分别运行100000次然后计算出平均每一次所花费的时间。关键地,不要停留在10毫秒和9毫秒的差别上,而要知道假设一个应用程序有几条语句万一这样“修改”,对应用程序到底值几毛钱价值?
[/Quote]
good
  • 打赏
  • 举报
回复
如果你纠结于所谓的“性能”问题,那么就自己写一个测试,分别运行100000次然后计算出平均每一次所花费的时间。关键地,不要停留在10毫秒和9毫秒的差别上,而要知道假设一个应用程序有几条语句万一这样“修改”,对应用程序到底值几毛钱价值?
蔡袅 2012-04-02
  • 打赏
  • 举报
回复
区别如下:
变量的作用域
变量的初始化时间

两个变量都是“根”,不存在引用关系,都会很快被GC
startstartsvip 2012-04-02
  • 打赏
  • 举报
回复


string tmp;
for (int i = 0; i < 2; i++)
000000b5 mov dword ptr [rsp+30h],0
000000bd jmp 000000000000016E
{
tmp = new String(new char[] { 'a', 'b' });
000000c2 mov rcx,7FEED8A866Ah
000000cc mov edx,2
000000d1 call FFFFFFFFEEEAB1F0
000000d6 mov qword ptr [rsp+38h],rax
000000db mov rax,qword ptr [rsp+38h]
000000e0 mov rax,qword ptr [rax+8]
000000e4 mov qword ptr [rsp+50h],0
000000ed cmp qword ptr [rsp+50h],rax
000000f2 jae 0000000000000100
000000f4 mov rax,qword ptr [rsp+50h]
000000f9 mov qword ptr [rsp+50h],rax
000000fe jmp 0000000000000105
00000100 call FFFFFFFFEF245F40
00000105 mov rcx,qword ptr [rsp+38h]
0000010a mov rax,qword ptr [rsp+50h]
0000010f mov word ptr [rcx+rax*2+10h],61h
00000116 mov rax,qword ptr [rsp+38h]
0000011b mov rax,qword ptr [rax+8]
0000011f mov qword ptr [rsp+58h],1
00000128 cmp qword ptr [rsp+58h],rax
0000012d jae 000000000000013B
0000012f mov rax,qword ptr [rsp+58h]
00000134 mov qword ptr [rsp+58h],rax
00000139 jmp 0000000000000140
0000013b call FFFFFFFFEF245F40
00000140 mov rcx,qword ptr [rsp+38h]
00000145 mov rax,qword ptr [rsp+58h]
0000014a mov word ptr [rcx+rax*2+10h],62h
00000151 mov rdx,qword ptr [rsp+38h]
00000156 xor ecx,ecx
00000158 call FFFFFFFFED92DDF8
0000015d mov qword ptr [rsp+60h],rax
00000162 nop
for (int i = 0; i < 2; i++)
00000163 mov eax,dword ptr [rsp+30h]
00000167 add eax,1
0000016a mov dword ptr [rsp+30h],eax
0000016e cmp dword ptr [rsp+30h],2
00000173 jl 00000000000000C2
}






for (int i = 0; i < 2; i++)
0000019e mov dword ptr [rsp+34h],0
000001a6 jmp 0000000000000257
{
string t = new String(new char[] { 'a', 'b' });
000001ab mov rcx,7FEED8A866Ah
000001b5 mov edx,2
000001ba call FFFFFFFFEEEAB1F0
000001bf mov qword ptr [rsp+40h],rax
000001c4 mov rax,qword ptr [rsp+40h]
000001c9 mov rax,qword ptr [rax+8]
000001cd mov qword ptr [rsp+68h],0
000001d6 cmp qword ptr [rsp+68h],rax
000001db jae 00000000000001E9
000001dd mov rax,qword ptr [rsp+68h]
000001e2 mov qword ptr [rsp+68h],rax
000001e7 jmp 00000000000001EE
000001e9 call FFFFFFFFEF245F40
000001ee mov rcx,qword ptr [rsp+40h]
000001f3 mov rax,qword ptr [rsp+68h]
000001f8 mov word ptr [rcx+rax*2+10h],61h
000001ff mov rax,qword ptr [rsp+40h]
00000204 mov rax,qword ptr [rax+8]
00000208 mov qword ptr [rsp+70h],1
00000211 cmp qword ptr [rsp+70h],rax
00000216 jae 0000000000000224
00000218 mov rax,qword ptr [rsp+70h]
0000021d mov qword ptr [rsp+70h],rax
00000222 jmp 0000000000000229
00000224 call FFFFFFFFEF245F40
00000229 mov rcx,qword ptr [rsp+40h]
0000022e mov rax,qword ptr [rsp+70h]
00000233 mov word ptr [rcx+rax*2+10h],62h
0000023a mov rdx,qword ptr [rsp+40h]
0000023f xor ecx,ecx
00000241 call FFFFFFFFED92DDF8
00000246 mov qword ptr [rsp+78h],rax
0000024b nop
for (int i = 0; i < 2; i++)
0000024c mov eax,dword ptr [rsp+34h]
00000250 add eax,1
00000253 mov dword ptr [rsp+34h],eax
00000257 cmp dword ptr [rsp+34h],2
0000025c jl 00000000000001AB
}





看到有区别的大声喊啊, win7 64,


其实探讨性能上区别这个没有大意义, 因为最终你都不知编译器 CLR 还有

你的那个CPU 是怎么优化的 例如 caching?

ycproc 2012-04-02
  • 打赏
  • 举报
回复
一个是定义
一个是接收

仅此而已
  • 打赏
  • 举报
回复
t的压栈出栈次数多一点吧,这个损失一般可以不计,最好去看一下IL
大江东流 2012-04-02
  • 打赏
  • 举报
回复
10000000次调用test1用时:862939357
10000000次调用test2用时:466426678
lcgod 2012-04-01
  • 打赏
  • 举报
回复
t每一次循环都要定义,tmp只定义一次。
kid_wang 2012-04-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

那这个t是什么时候回收呢?
垃圾回收不是定期执行吗?
有没有存在t还没回收的情况下就new object 呢?
[/Quote]
1、垃圾回收当然不是定期执行,而是有空就执行,且不确定何时执行。所以有些时候需要手动GC一下。
2、值类型的变量在超出执行程序段时,内存才会被自动释放,但string是引用类型。
3、引用类型在托管堆里存放,所以第一种情况,tmp有了(栈里),但是托管堆里没有对象实例,也就是没分配内存。循环时分配,但变量是一个(栈里的那个)。第二种直接建立了内存指针,单变量看似一样都是t,其实每个t都不一样。
所以第一种应该比第二种在栈里存的要集中,谁快说不准,理论上二会快。
4、释放引用变量string,直接赋值=null就可以了。根本就用不到什么GC神马的。
muyi66 2012-04-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

你最开始就理解错了,局部变量就只能是函数内的局部变量,没有什么所谓的循环体内的局部变量,那只是编辑器限制了可见性,进入函数的第一步就是给所有局部变量分配空间和赋初值


应该是这样才能解释
[/Quote]没错,编译器是这么做的。但要说两个循环的差别,那就是第二个的变量会更早失效——尽管还在函数内,但已经不能访问它了。
hhddzz 2012-03-31
  • 打赏
  • 举报
回复
一样的吧

而且感觉就算退出循环,变量t也不会被释放什么的,应该还是引用着最后一个字符串。
jianshao810 2012-03-31
  • 打赏
  • 举报
回复
你最开始就理解错了,局部变量就只能是函数内的局部变量,没有什么所谓的循环体内的局部变量,那只是编辑器限制了可见性,进入函数的第一步就是给所有局部变量分配空间和赋初值


应该是这样才能解释
色拉油 2012-03-31
  • 打赏
  • 举报
回复
纯属玩笑,个人感觉差别不大,如楼上几位所言,垃圾回收时间不同[Quote=引用 6 楼 的回复:]

tmp三个字母t一个字母,前者省内存
[/Quote]
色拉油 2012-03-31
  • 打赏
  • 举报
回复
tmp三个字母t一个字母,前者省内存
kkgoose 2012-03-31
  • 打赏
  • 举报
回复
mark,个人感觉是一样
加载更多回复(4)

110,534

社区成员

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

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

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