string.hのstrcmpの性能比較

2398 ワード

string.hアセンブリに基づいてstrcmpを実現し,通常のstrcmpとサイクル呼び出し回数と文字列検索長さの2緯度について性能対比効果試験を行った.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;


static inline int strcmp_asm(const char * cs,const char * ct)
{
    int d0, d1;
    register int __res;
    __asm__ __volatile__(
            "1:\tlodsb
\t" "scasb
\t" "jne 2f
\t" "testb %%al,%%al
\t" "jne 1b
\t" "xorl %%eax,%%eax
\t" "jmp 3f
" "2:\tsbbl %%eax,%%eax
\t" "orb $1,%%al
" "3:" :"=a" (__res), "=&S" (d0), "=&D" (d1) :"1" (cs),"2" (ct)); return __res; } static inline int strcmp_normal(const char * cs,const char * ct) { while(*cs!='\0' && *ct!='\0') { if(*cs != *ct) return *cs1) { loop = atoll(argv[1]); } if(argc>2) { iSamelen = atoll(argv[2]); } printf("input loop:%d,iSamelen:%d
",loop,iSamelen); strcmp_perfom(loop,iSamelen); return 0; }

試験結果は以下の通りであり,マッチング列長が十分な場合には性能が3~4倍劣る.input loop:5000,iSamelen:100000 loop:5000,strcmp_asm,time:468 ms,strcmp_normal,time:1747 ms input loop:50000,iSamelen:10000 loop:50000,strcmp_asm,time:501 ms,strcmp_normal,time:1749 ms input loop:500000,iSamelen:1000 loop:500000,strcmp_asm,time:494 ms,strcmp_normal,time:1787 ms input loop:5000000,iSamelen:100 loop:5000000,strcmp_asm,time:693 ms,strcmp_normal,time:1922 ms input loop:50000000,iSamelen:10 loop:50000000,strcmp_asm,time:1337 ms,strcmp_Normal,time:2424 msはマッチング列が極めて短いシーンで、1,2,4バイトの場合、性能にも1.5~2倍の差があるinput loop:5,000,iSamelen:4 loop:5,000,strcmp_asm,time:849 ms,strcmp_normal,time:1425 ms input loop:50000000,iSamelen:2 loop:50000000,strcmp_asm,time:753 ms,strcmp_normal,time:1130 ms input loop:50000000,iSamelen:1 loop:50000000,strcmp_asm,time:670 ms,strcmp_normal,time:1040 ms