普通变量与寄存器变量速度对比文档格式.docx
《普通变量与寄存器变量速度对比文档格式.docx》由会员分享,可在线阅读,更多相关《普通变量与寄存器变量速度对比文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
对于C程序,寄存器变量是不能取址的:
几种线程本地存储变量和普通变量的性能比较God一直致力于研究高并发服务端的开发,这次要优化的是libGod库中的线程本地存储变量,线程本地存储变量访问非常频繁,优化后库的性能应该会提高不少。
已知的线程本地存储方法有boost中的thread_specific_ptr类,gcc中的__thread关键字,pthread中的pthread_getspecific函数。
这次测试这3中本地存储以及普通变量之间的性能差别,代码如下:
#include《iostream》
#include《stdio.h》
#include《pthread.h》
#include《boost/thread/thread.hpp》
#include《boost/thread/tss.hpp》
usingnamespacestd;
classC{
public:
C(inta){
m_a=a;
printf(“C()%d\n”,m_a);
}
~C(){
printf(“~C()%d\n”,m_a);
private:
intm_a;
};
#defineTM3
#ifTM==1
boost:
:
thread_specific_ptr《C》pc;
constchar*testType=“boost”;
#elifTM==2
__threadC*pc;
constchar*testType=“__thread”;
#elifTM==3
pthread_key_tpc;
constchar*testType=“pthread”;
#else
C*pc;
constchar*testType=“normal”;
#endif
voidboostthreadFunc(){
pc.reset(newC(10));
pc=newC(20);
if(pthread_key_create("
cout《《“pthread_key_create”《《endl;
return;
if(pthread_setspecific(pc,newC(30))){
cout《《“pthread_setspecific”《《endl;
intswitches=5000000;
inti=switches;
structtimevaltm_start,tm_end;
getTImeofday(
while(i--){
C*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=pc.get();
C*c10=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();
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();
C*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*c10=pc;
C*c11=pc;
C*c12=pc;
C*c13=pc;
C*c14=pc;
C*c15=pc;
C*c16=pc;
C*c17=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*c28=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;
C*c1=(C*)pthread_getspecific(pc);
C*c2=(C*)pthread_getspecific(pc);
C*c3=(C*)pthread_getspecific(pc);
C*c4=(C*)pthread_getspecific(pc);
C*c5=(C*)pthread_getspecific(pc);
C*c6=(C*)pthread_getspecific(pc);
C*c7=(C*)pthread_getspecific(pc);
C*c8=(C*)pthread_getspecific(pc);
C*c9=(C*)pthread_getspecific(pc);
C*c10=(C*)pthread_getspecific(pc);
C*c11=(C*)pthread_getspecific(pc);
C*c12=(C*)pthread_getspecific(pc);
C*c13=(C*)pthread_getspecific(pc);
C*c14=(C*)pthread_getspecific(pc);
C*c15=(C*)pthread_getspecific(pc);
C*c16=(C*)pthread_getspecific(pc);
C*c17=(C*)pthread_getspecific(pc);
C*c18=(C*)pthread_getspecific(pc);
C*c19=(C*)pthread_getspecific(pc);
C*c20=(C*)pthread_getspecific(pc);
C*c21=(C*)pthread_getspecific(pc);
C*c22=(C*)pthread_getspecific(pc);
C*c23=(C*)pthread_getspecific(pc);
C*c24=(C*)pthread_getspecific(pc);
C*c25=(C*)pthread_getspecific(pc);
C*c26=(C*)pthread_getspecific(pc);
C*c27=(C*)pthread_getspecific(pc);
C*c28=(C*)pthread_getspecific(pc);
C*c29=(C*)pthread_getspecific(pc);
C*c30=(C*)pthread_getspecific(pc);
C*c31=(C*)pthread_getspecific(pc);
C*c32=(C*)pthread_getspecific(pc);
C*c33=(C*)pthread_getspecific(pc);
C*c34=(C*)pthread_getspecific(pc);
C*c35=(C*)pthread_getspecific(pc);
C*c36=(C*)pthread_getspecific(pc);
C*c37=(C*)pthread_getspecific(pc);
C*c38=(C*)pthread_getspecific(pc);
C*c39=(C*)pthread_getspecific(pc);
C*c40=(C*)pthread_getspecific(pc);
C