memcmp, memcpy 에 대한 질문

declspec의 이미지

100KB 짜리 버퍼가 있는데
여기 있는 내용을 memcpy 를 이용해서
다른 버퍼에 함수호출 한번해서 복사하는것하고

1byte 짜리 char 형 변수를 하나 두고
버퍼를 char 형 배열로 본다음에
루프를 돌면서 1바이트씩 읽어서 다른쪽 버퍼로 직접
a[i] = b[i]; 식으로 옮기는 거랑
어떤 차이가 있나요?

memcpy 가 더 빠를까요?
빠르다면 왜 빠를까요?

마찬가지로 메모리 내용을 비교할때 memcpy 로 비교하는것이
직접 == 연산자를 써서 변수에 1~4바이트씩 담아서
비교하는것보다 빠른가요?

그리고 윈도우 API 의 BitBlt 함수를 사용할때
크기 100짜리의 그림을 DC 에 복사하는데 1의 시간이 걸린다면
크기 1000짜리의 그림을 DC 에 복사하려면 10의 시간이 걸릴까요?
BitBlt 함수를 이용해서 비트맵 버퍼에 있는것을
DC 버퍼로 옮기는 것은(메모리DC로) memcpy 보다 빠를까요? 느릴까요? 비슷할까요?

질문이 많지만 정말 궁금합니다~

익명 사용자의 이미지

1) 프로그램이 메모리를 읽거나 쓸때는 1Byte씩이 아니고 register의 크기 (4bytes, 8bytes 등)만큼하기 때문에
1byte씩 처리하기 위해서는 일단 register에 내용을 채우고 또다시 byte씩 처리해야 하기 때문에
1byte씩 처리하는 것이 훨씬 느릴꺼 같습니다.

2) memory를 비교하는 것은 type의 개념이 없이 해당주소에 있는 메모리의 내용이 동일한지 보는 것이고,
( a == b ) 는 a 와 b의 값이 같은 지 비교하는 것으로 a와 b의 type에 맞는
operator '==' 가 정의되어 있어야 합니다.

3) 먼저 그 그림이 어디 있는냐에 따라서 빠르다 늦다가 달라집니다. (디스크 / 캐시 / 메모리 / ..)
고려해야 될 사항은,
- 디스크 I/O 는 page 단위로 처리가 된다.
- 초기 access, 즉 원하는 이미지의 맨처음 위치를 읽어 오는 시간 과
- 이미지 내에서의 sequential read는 속도 차이가 많다.

즉, (정확한 수치야 매번 다르겠지만) 100byte를 읽어오는 시간과 1000byte를 읽어오는 시간은
꼭 10배가 걸리는 것이 아니고, A(시작지점 data access) + B(sequential access time) 에서
A가 B보다 상대적으로 아주 크다고 보면, 두 경우의 시간적 차이는 크지 않을 거라고 생각됩니다.

만약, 5Mbytes 하고 50Mbytes를 비교하면 이미지 크기에 비례하여 시간차가 나지 않을까 합니다.


winner의 이미지

궁금하신 거면 실험해보세요.
실험결과가 이해가 안 가신다면 그 실험과정과 결과를 가지고 다시 질문하시기 바랍니다.

declspec의 이미지

실험을 해보니
= 나 == 연산자를 직접 써서 일일히 하는거보다
memcpy, memcmp 가 훨씬 빠르네요

80MB 의 버퍼에 대해서
1바이트씩 = 를 써서 옮긴것과
한번에 memcpy 한것과 속도가
수십배정도 차이났습니다.

== 연산과 memcmp 도 마찬가지이구요
그 내부적인 이유는 실험으로 알수없으니
궁금하군요

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

winner의 이미지

퉁명스런 대답을 따라주셔서 제가 찾아보고 답변하지 않을 수가 없었네요. ^_^
우선 http://ftp.gnu.org/gnu/glibc/ 를 보시면 Linux memcpy source 를 확인하실 수 있습니다.
정확히 확인해본 것은 아닙니다만 memcpy와 memcmp의 성능이 월등한 이유는 Assembly로 작업되어 SIMD를 활용했기 때문일 겁니다.

익명 사용자의 이미지

memcpy, memcmp 가 어떻게 구현되어 있는지 검토하시면 도움을 될 것 같습니다.

lovian의 이미지

1바이트씩 해보셨으니
unsigned int 타입으로 해보시는것도 좋을 듯 하네요.

그리고 little endian / big endian 를 찾아보시면, 힌트가 조금은 될 것 같네요.

-----------------
한글을 사랑합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.