《普通变量与寄存器变量速度对比.docx》由会员分享,可在线阅读,更多相关《普通变量与寄存器变量速度对比.docx(13页珍藏版)》请在第一文库网上搜索。
1、普通变量与寄存器变量速度对比寄存器变量速度比普通变量存取速度快。对于C程序,寄存器变量不能取地址,编译器会报错。对于也程序,可以对寄存器变量进行取址操作,编译器不会报错,但是取出来的地址似乎不是寄存器地址,而是内存地址,不知道是不是C+编译器在涉及取址运算时将寄存器变量自动转换成普通变量来处理。1、只有普通运算man.cppTB4567891011#inc1udeusingnamespacestdintmain(intargc,char*argv)Cjtni,sum=0:for(i1)i=100000000)i+)sum+ijcout,summsumend1jreturn0;1E:softwa
2、recpp_data_structureTestRegisterVariab1eTestRegisterVsum=987459712Processexitedafter0.7177secondswithreturnva1ue0请按任意键继续.man.cpp#inc1udeusingnamespacestdintmain(n,argcchar*argv)registerini,sum0;7891011for(iT1ii=100000000;i+)sum+i;)coutsum=,sumend1jreturn0;1,E:softwarecpp_data_structureTestRegisterVa
3、riab1eTestRegisterVaIswn=987459712Processexitedafter0.I11secondswithreturnva1ue0请按任意键继续.对于上述的普通累加运算而言,采用普通变量耗时0.7177秒,采用寄存器变量耗时0.111秒,速度上确实有明显的差别。2、涉及取址运算main.cpp#inc1udeusingnamespacestdjHTB4 5 6789101112intmain(intargc,char*argv)inti,sum=0;for(i=1)i=100000000)i+)sum+15coutsum=,sumend1jcout&sum=Jsu
4、m)end1return05E:softwarecpp_datastructureTestRegisterVariab1eTestRegisterVsum=987459712也SUm=0x6ffe38Processexitedafter0.7867secondswithreturnva1ue0请按任意键继续.man.cpp1 #inc1ude2 usingnamespacestd3intmain(intargc,char*argv)registerinti,sum=0j7 -891011 1for(i=1)i1000000005i+)sum+ijcoutsum=,sumend15coutH&s
5、umm&sum)end15return0;E:softwarecpp_data_structureTestRegisterVariab1eTestRegisterVariab1e.sum=987459712也Sum-0x6ffe3cProcessexitedafter0.4792secondswithreturnva1ue0请按任意键继续.如果涉及取址运算,米用普通变量耗时0.7867秒,米用寄存器变量耗时0.4792秒,速度上的差别就没有那么显著了。大家可以发现两种变量取出的地址分别是0x6ffc38和0x6ffe3c,是连续的两个地址,那都是内存地址。不能确定,是不是C+编译器在涉及取址运
6、算时自动将寄存器变量当成普通变量来处理。实际使用时,底层硬性环境的实际情况对寄存器变量的使用会有一些限制。每个函数中只有很少的变量可以保存在寄存器中,且只允许某些类型的变量。但是,过量的寄存器声明并没有什么害处,这是因为编译器可以忽略过量的或者不支持的寄存器变量声明。另外,无论寄存器变量实际上是不是存放在寄存器中,它的地址都是不能访问的。在不同的机器中,对寄存器变量的数目和类型的具体限制也是不同的。一一C程序设计语言(第二版)BrainW.Kernighan&DennisM.Ritchie#inc1udestdio.hHTB-12345678301C11对于C程序,寄存器变量是不能取址的:in
7、tmain()registerinti,sum=0jfor(iIji100000000ji+)sum+ijPrintf(sum=%dn”,sum);return0;brintf(&sum=%dn”,8surn);几种线程本地存储变量和普通变量的性能比较God一直致力于研究高并发服务端的开发,这次要优化的是IibGod库中的线程本地存储变量,线程本地存储变量访问非常频繁,优化后库的性能应该会提高不少。已知的线程本地存储方法有boost中的threadspecificptr类,gcc中的_thread关键字,pthread中的pthread_getspecific函数。这次测试这3中本地存储以及普
8、通变量之间的性能差别,代码如下:#inc1udeiostreamftinc1udestdio.hinc1udepthread.hinc1udeoostthread/thread.hpp#inc1udeboostthread/tss.hppusingnamespacestd;c1assCpub1ic:C(inta)ma二a;printf(“C()%dn,m_a);“COprintf(C()%dnw,ma);private:intma;;SdefineTM3# ifTM=1boost:thread_specific_ptrCpc;constchar*testType=boost”;# CIifTM
9、=2_threadC*pc;constchar*testType=thread,;# e1ifTM=3pthread_key_tpc;constchar*testType=pthread”;#e1seC*pc;constchar*testType=norma1”;#endifvoidboostthreadFunc()# ifTM=1pc.reset(newC(10);#e1ifTM=2pc=newC(20);fte1ifTM=3if(pthread_key_create(&pc,NU11)coutpthread_key_create,end1;return;if(pthread_setspec
10、ific(pc,newC(30)coutpthread_setspecific,end1;return;)fte1sepc=newC(20);ftendifintswitches=5000000;inti=switches;structtimeva1tmstart,tmend;gettimeofday(&tm_start,NU11);whiIe(i-)#ifTM=1C*c1=pc.get();C*c2=pc.get();C*c3=pc.get();C*c4=pc.get();C*c5=pc.get();C*c6=pc.get();C*c7=pc.get();C*c8=pc.get();C*c9
11、=pc.get();C*c1=pc.get();C*c11=pc.get();C*c12=pc.get();C*c13=pc.get();C*c14=pc.get();C*c15=pc.get();C*c16=pc.get();C*c17=pc.get();C*c18=pc.get();C*c19=pc.get();C*c20=pc.get();C*c21=pc.get()C*c22=pc.get()C*c23=pc.get()C*c24=pc.get()C*c25=pc.get()C*c26=pc.get()C*c27=pc.get()C*c28=pc.get()C*c29=pc.get()
12、C*c30=pc.get()C*c31=pc.get()C*c32=pc.get()C*c33=pc.get()C*c34=pc.get()C*c35=pc.get()C*c36=pc.get()C*c37=pc.get()C*c38=pc.get()C*c39=pc.get()C*c40=pc.get()#e1ifTM=2C*c1=pc;C*c2=pc;C*c3=pc;C*c4-pc;C*c5=pc;C*c6=pc;C*c7=pc;C*c8-pc;C*c9=pc;C*c1=pc;C*c11=pc;C*c12=pc;C*c13=pc;C*c14=pc;C*c15=pc;C*c16=pc;C*c
13、17=pc;C*c18=pc;C*c19=pc;C*c20-pc;C*c21=pc;C*c22=pc;C*c23=pc;C*c24=pc;C*c25=pc;C*c26=pc;C*c27=pc;C*c29=pc;C*c30=pc;C*c31=pc;C*c32=pc;C*c33=pc;C*c34=pc;C*c35=pc;C*c36=pc;C*c37=pc;C*c38=pc;C*c39=pc;C*c40=pc;#e1ifTM=3C*c1=(C*)pthread_getspecific(pc);C*c2=(C*)pthread_getspecific(pc);C*c3=(C*)pthread_gets
14、pecific(pc);C*c4=(C*)pthreadgetspecific(pc);C*c5=(C*)pthread_getspecific(pc);C*c6=(C*)pthread_getspecific(pc);C*c7=(C*)pthread_getspecific(pc);C*c8=(C*)pthreadgetspecific(pc);C*c9=(C*)pthread_getspecific(pc);C*c1=(C*)pthread_getspecific(pc);C*c11=(C*)pthread_getspecific(pc);C*C12=(C*)pthread_getspecific(p