struct POS의 memcmp와 if 의 성능비교
ㅡ,.-)a 심심해서 int형 두개로 구성된 POS 구조체를
memcmp와 if로 성능을 비교해봤습니다. 뭐 물론 당연히
memcmp는 if와 for문으로 되어 있기 때문에 if만 가지고 하는게
빠르겠지만... 삽질을 피하기 위해 문서화 합니다.
typedef struct tagPOS { int x, y; } POS, *PPOS; inline bool __cmp_memcmp__(const POS& pos1, const POS& pos2) { return memcmp(&pos1, &pos2, sizeof(POS)); } inline bool __cmp_compare__(const POS& pos1, const POS& pos2) { return pos1.x == pos2.x && pos1.y == pos2.y; } #define MAXMAX 100000 int main(void) { UINT64 t1; POS pos1, pos2; volatile bool bRet; // avoid optimization... pos1.x = 9; pos2.x = 8; t1 = GetTime(); for ( int i = 0; i < MAXMAX; i++ ) GetTime(); // ready... for ( int i = 0; i < MAXMAX; i++ ) { bRet = __cmp_memcmp__(pos1, pos2); GetTime(); // avoid optimization... } cerr << "MEMCMP : " << GetTime() - t1 << endl; t1 = GetTime(); for ( int i = 0; i < MAXMAX; i++ ) { bRet = __cmp_compare__(pos1, pos2); GetTime(); // avoid optimization... } cerr << "COMPARE: " << GetTime() - t1 << endl; return 0; }
결과
MEMCMP : 455556
COMPARE: 225545
시스템
$ cat /proc/cpuinfoprocessor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 1.80GHz
stepping : 4
cpu MHz : 1796.248
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips : 3538.94$ free
total used free shared buffers cached
Mem: 775056 447760 327296 0 95196 206532
-/+ buffers/cache: 146032 629024
Swap: 522072 0 522072$ uname -a
Linux localhost 2.6.9-1.681_FC3 #1 Thu Nov 18 15:10:10 EST 2004 i686 i686 i386 GNU/Linux$ g++ -v
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
컴파일
$ g++ -O3 mytest.cpp -o mytest
버그가 있네요..
첫번째 tick 을 얻는 시점이 잘 못돼서 엉뚱한 결과를
보여줍니다.
그리고 비교하는 시간과 함수 호출시간의 격차가 너무 커서
제대로 된 결과를 얻기는 힘들것 같습니다. ^^
Re: struct POS의 memcmp와 if 의 성능비교
최근 진보된 하드웨어들은 memcpy, memcmp, strcpy, strcmp ... 등을 위해 속도상 매우 빠른 특별한 인스트럭션들을 지원하기 때문에 반복문(for 등)과 같이 jump 인스트럭션을 사용하지 않습니다. 게다가 많은 컴파일러들이 이들을 intrinsic 으로 지원하기 때문에 함수 호출에 의한 오버헤드도 없습니다.
지금 테스트하신 것은 구조체 크기가 작아서 if 문을 쓴 것이 더 빠를 수 있지만, 크기가 커질수록 memcmp 성능이 for/if 조합을 훨씬 능가합니다.
Orion Project : http://orionids.org
댓글 달기