Faster approach to checking for an all-zero buffer in C?

后端 未结 20 2392
孤独总比滥情好
孤独总比滥情好 2020-12-03 05:33

I am searching for a faster method of accomplishing this:

int is_empty(char * buf, int size) 
{
    int i;
    for(i = 0; i < size; i++) {
        if(buf[         


        
20条回答
  •  半阙折子戏
    2020-12-03 05:46

    Four functions for testing zeroness of a buffer with simple benchmarking:

    #include  
    #include  
    #include  
    #include  
    
    #define SIZE (8*1024) 
    char zero[SIZE] __attribute__(( aligned(8) ));
    
    #define RDTSC(var)  __asm__ __volatile__ ( "rdtsc" : "=A" (var)); 
    
    #define MEASURE( func ) { \ 
      uint64_t start, stop; \ 
      RDTSC( start ); \ 
      int ret = func( zero, SIZE ); \ 
      RDTSC( stop ); \ 
      printf( #func ": %s   %12"PRIu64"\n", ret?"non zero": "zero", stop-start ); \ 
    } 
    
    
    int func1( char *buff, size_t size ){
      while(size--) if(*buff++) return 1;
      return 0;
    }
    
    int func2( char *buff, size_t size ){
      return *buff || memcmp(buff, buff+1, size-1);
    }
    
    int func3( char *buff, size_t size ){
      return *(uint64_t*)buff || memcmp(buff, buff+sizeof(uint64_t), size-sizeof(uint64_t));
    }
    
    int func4( char *buff, size_t size ){
      return *(wchar_t*)buff || wmemcmp((wchar_t*)buff, (wchar_t*)buff+1, size/sizeof(wchar_t)-1);
    }
    
    int main(){
      MEASURE( func1 );
      MEASURE( func2 );
      MEASURE( func3 );
      MEASURE( func4 );
    }
    

    Result on my old PC:

    func1: zero         108668
    func2: zero          38680
    func3: zero           8504
    func4: zero          24768

提交回复
热议问题