日期:2014-05-18  浏览次数:20702 次

这样代码的区别
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 
000001