我有一个c ++应用程序,它喜欢将整数转换为前导零非常快的字符串,在此测试中,整数必须小于100000000,1亿,在g ++编译它--std = c ++ 11 -O3 test2 g ++ 4.8.5中的.cpp -o test2.exe
第一个测试是使用sprintf:
struct timeval tv1,tv2;
char X1[16]={0} ;
int i1 = 9 ;
gettimeofday(&tv1,NULL) ;
for(int idx=0;idx<10000;idx++){
sprintf(X1,"%08d",i1) ;
}
gettimeofday(&tv2,NULL) ;
printf("\n(%d)(%d)\n",tv1.tv_usec,tv2.tv_usec) ;
印刷(900195)(900964),花费769微秒!!!
然后我尝试另一个测试:
int MsgSeqNum = 9 ;
gettimeofday(&tv1,NULL) ;
for(int idx=0;idx<10000;idx++){
char strSeqno[16]={0} ;
fmt::ArrayWriter Seq(strSeqno) ;
Seq.write("{:08d}",MsgSeqNum) ;
}
gettimeofday(&tv2,NULL) ;
printf("\n(%d)(%d)\n",tv1.tv_usec,tv2.tv_usec) ;
我使用spdlog fmt :: ArrayWriter,它使用printf: (321546)(321948),它的成本为402微秒。
然后我尝试使用spdlog fmt :: FormatInt将int转换为string:
char xtmp[16]={0} ;
char strSeqno[16]={0} ;
const char zero[] = "00000000000000" ;
int MsgSeqNum = 119 ;
gettimeofday(&tv1,NULL) ;
for(int idx=0;idx<10000;idx++){
strcpy(xtmp,fmt::FormatInt(MsgSeqNum).c_str()) ;
int ilen = strlen(xtmp) ;
if( ilen >= 8 ){
memcpy(strSeqno,xtmp,8) ;
}else{
memcpy(strSeqno,zero,8-ilen) ;
memcpy(strSeqno+8-ilen,xtmp,ilen);
}
}
gettimeofday(&tv2,NULL) ;
printf("\n(%d)(%d)\n",tv1.tv_usec,tv2.tv_usec) ;
在此测试中,(458194)(458344)打印,耗时150微秒。
然后我尽量不使用strlen函数并修改源代码:
char xtmp[16]={0} ;
char strSeqno[16]={0} ;
const char zero[] = "00000000000000" ;
int MsgSeqNum = 119 ;
gettimeofday(&tv1,NULL) ;
for(int idx=0;idx<10000;idx++){
strcpy(xtmp,fmt::FormatInt(MsgSeqNum).c_str()) ;
if( FixMsgSeqNum >= 10000000 ){
memcpy(strSeqno,xtmp,8) ;
}else if( FixMsgSeqNum >= 1000000 ){
memcpy(strSeqno,zero,1) ;
memcpy(strSeqno+1,xtmp,7) ;
}else if( FixMsgSeqNum >= 100000 ){
memcpy(strSeqno,zero,2) ;
memcpy(strSeqno+2,xtmp,6) ;
}else if( FixMsgSeqNum >= 10000 ){
memcpy(strSeqno,zero,3) ;
memcpy(strSeqno+3,xtmp,5) ;
}else if( FixMsgSeqNum >= 1000 ){
memcpy(strSeqno,zero,4) ;
memcpy(strSeqno+4,xtmp,4) ;
}else if( FixMsgSeqNum >= 100 ){
memcpy(strSeqno,zero,5) ;
memcpy(strSeqno+5,xtmp,3) ;
}else if( FixMsgSeqNum >= 10 ){
memcpy(strSeqno,zero,6) ;
memcpy(strSeqno+6,xtmp,2) ;
}else{
memcpy(strSeqno,zero,7) ;
memcpy(strSeqno+7,xtmp,1) ;
}
}
gettimeofday(&tv2,NULL) ;
printf("\n(%d)(%d)\n",tv1.tv_usec,tv2.tv_usec) ;
我得到了(479313)(479415),它花费了102微秒。
我想知道是否有任何方法可以替换test3的strlen并实现 像test4一样的低延迟?看起来像strlen不够快,但是 在test4中,if ... else非常不干净。