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

解决方案 »

  1.   

    t比tmp 回收的能快点 别的没区别
      

  2.   

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

  3.   

    不能说t比tmp更快回收把,只能说t更早的成为垃圾,垃圾回收是在第一代垃圾满时开始回收,所以垃圾回收时间是不确定的
      

  4.   

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

  5.   

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

  6.   

    t每一次循环都要定义,tmp只定义一次。
      

  7.   

    没有任何区别不相信的可以用ildasm.exe反编译一下,看看内容一样与否.
      

  8.   

    10000000次调用test1用时:862939357
    10000000次调用test2用时:466426678
      

  9.   

    t的压栈出栈次数多一点吧,这个损失一般可以不计,最好去看一下IL
      

  10.   

     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?