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