首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

这样代码的区别,该如何解决

2012-05-05 
这样代码的区别C# code string tmpfor (int i 0 i 10 i++)tmp new String(new char[] { a, b

这样代码的区别

C# code
 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 有什么性能上的区别?

[解决办法]
性能上没多少差别,但t只在循环体里有定义,出了循环体就消失了。也就是说你的第二个循环其实什么效果都没有就结束了。
[解决办法]
t比tmp 回收的能快点 别的没区别
[解决办法]
探讨
那这个t是什么时候回收呢?
垃圾回收不是定期执行吗?
有没有存在t还没回收的情况下就new object 呢?

[解决办法]
mark,个人感觉是一样
[解决办法]
tmp三个字母t一个字母,前者省内存
[解决办法]
纯属玩笑,个人感觉差别不大,如楼上几位所言,垃圾回收时间不同
探讨

tmp三个字母t一个字母,前者省内存

[解决办法]
一样的吧

而且感觉就算退出循环,变量t也不会被释放什么的,应该还是引用着最后一个字符串。
[解决办法]
探讨

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


应该是这样才能解释

[解决办法]
探讨

那这个t是什么时候回收呢?
垃圾回收不是定期执行吗?
有没有存在t还没回收的情况下就new object 呢?

[解决办法]
t每一次循环都要定义,tmp只定义一次。
[解决办法]
没有任何区别

不相信的可以用ildasm.exe反编译一下,看看内容一样与否.
[解决办法]
一个是定义
一个是接收

仅此而已
[解决办法]
区别如下:
变量的作用域
变量的初始化时间

两个变量都是“根”,不存在引用关系,都会很快被GC
[解决办法]
如果你纠结于所谓的“性能”问题,那么就自己写一个测试,分别运行100000次然后计算出平均每一次所花费的时间。关键地,不要停留在10毫秒和9毫秒的差别上,而要知道假设一个应用程序有几条语句万一这样“修改”,对应用程序到底值几毛钱价值?
[解决办法]
10000000次调用test1用时:862939357
10000000次调用test2用时:466426678
[解决办法]
t的压栈出栈次数多一点吧,这个损失一般可以不计,最好去看一下IL
[解决办法]

Assembly code
 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             } 


[解决办法]
大婶们都在讨论这个?

热点排行