string.hのstrcmpの性能比較
2398 ワード
string.hアセンブリに基づいてstrcmpを実現し,通常のstrcmpとサイクル呼び出し回数と文字列検索長さの2緯度について性能対比効果試験を行った.
試験結果は以下の通りであり,マッチング列長が十分な場合には性能が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
#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