普通变量与寄存器变量速度对比.docx

上传人:lao****ou 文档编号:953231 上传时间:2024-08-02 格式:DOCX 页数:13 大小:54.49KB
下载 相关 举报
普通变量与寄存器变量速度对比.docx_第1页
第1页 / 共13页
普通变量与寄存器变量速度对比.docx_第2页
第2页 / 共13页
普通变量与寄存器变量速度对比.docx_第3页
第3页 / 共13页
普通变量与寄存器变量速度对比.docx_第4页
第4页 / 共13页
普通变量与寄存器变量速度对比.docx_第5页
第5页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《普通变量与寄存器变量速度对比.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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服