struct POS의 memcmp와 if 의 성능비교

purewell의 이미지

ㅡ,.-)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;
}

결과

Quote:
MEMCMP : 455556
COMPARE: 225545

시스템

Quote:

$ cat /proc/cpuinfo

processor : 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)

컴파일

Quote:
$ g++ -O3 mytest.cpp -o mytest
Forums: 
익명 사용자의 이미지

첫번째 tick 을 얻는 시점이 잘 못돼서 엉뚱한 결과를
보여줍니다.

  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...
  } 

그리고 비교하는 시간과 함수 호출시간의 격차가 너무 커서
제대로 된 결과를 얻기는 힘들것 같습니다. ^^

체스맨의 이미지

purewell wrote:
memcmp는 if와 for문으로 되어 있기 때문에

최근 진보된 하드웨어들은 memcpy, memcmp, strcpy, strcmp ... 등을 위해 속도상 매우 빠른 특별한 인스트럭션들을 지원하기 때문에 반복문(for 등)과 같이 jump 인스트럭션을 사용하지 않습니다. 게다가 많은 컴파일러들이 이들을 intrinsic 으로 지원하기 때문에 함수 호출에 의한 오버헤드도 없습니다.

지금 테스트하신 것은 구조체 크기가 작아서 if 문을 쓴 것이 더 빠를 수 있지만, 크기가 커질수록 memcmp 성능이 for/if 조합을 훨씬 능가합니다.

Orion Project : http://orionids.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.