用c ++替换strlen的最好方法

时间:2016-11-04 05:14:33

标签: c++ string

我有一个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非常不干净。

0 个答案:

没有答案