这样代码的区别 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 有什么性能上的区别? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 t比tmp 回收的能快点 别的没区别 那这个t是什么时候回收呢?垃圾回收不是定期执行吗?有没有存在t还没回收的情况下就new object 呢? 不能说t比tmp更快回收把,只能说t更早的成为垃圾,垃圾回收是在第一代垃圾满时开始回收,所以垃圾回收时间是不确定的 tmp三个字母t一个字母,前者省内存 1、垃圾回收当然不是定期执行,而是有空就执行,且不确定何时执行。所以有些时候需要手动GC一下。2、值类型的变量在超出执行程序段时,内存才会被自动释放,但string是引用类型。3、引用类型在托管堆里存放,所以第一种情况,tmp有了(栈里),但是托管堆里没有对象实例,也就是没分配内存。循环时分配,但变量是一个(栈里的那个)。第二种直接建立了内存指针,单变量看似一样都是t,其实每个t都不一样。所以第一种应该比第二种在栈里存的要集中,谁快说不准,理论上二会快。4、释放引用变量string,直接赋值=null就可以了。根本就用不到什么GC神马的。 t每一次循环都要定义,tmp只定义一次。 没有任何区别不相信的可以用ildasm.exe反编译一下,看看内容一样与否. 10000000次调用test1用时:86293935710000000次调用test2用时:466426678 t的压栈出栈次数多一点吧,这个损失一般可以不计,最好去看一下IL 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? 如何用ASP.net中的FileUpload将txt内容写入数据库? 隐藏鼠标 windows服务 为什么会自动停止 在WINCE5。0下,用C#画图问题 关于取日期的问题 VSS 自动签出问题!! 如何更改C#的窗体的Icon属性 如何将子窗体中的数据传回父窗体(简单问题啊,我搞了两天了,在线等) winform 获取当前时间 高分请教:如何在安装项目中生成Uninstall程序? foreach是什么执行流程呢? socket编程,一个客户端怎么根据不同的线路建立两个socket?
垃圾回收不是定期执行吗?
有没有存在t还没回收的情况下就new object 呢?
2、值类型的变量在超出执行程序段时,内存才会被自动释放,但string是引用类型。
3、引用类型在托管堆里存放,所以第一种情况,tmp有了(栈里),但是托管堆里没有对象实例,也就是没分配内存。循环时分配,但变量是一个(栈里的那个)。第二种直接建立了内存指针,单变量看似一样都是t,其实每个t都不一样。
所以第一种应该比第二种在栈里存的要集中,谁快说不准,理论上二会快。
4、释放引用变量string,直接赋值=null就可以了。根本就用不到什么GC神马的。
10000000次调用test2用时:466426678
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?