Test_1

중첩된 메모리로의 이동(원본 메모리 주소 < 목적 메모리 주소)

모든 test코드엔 include 와 main함수 정의는 넣지 않았습니다.

모든 test코드엔 아래 내용을 포함합니다.

#define MOVE_LEN 1500
#define SHIFT_LEN 3
int loop_cnt = 100000;
char array[MOVE_LEN + SHIFT_LEN];
const char *orig_src = array;
char *orig_dest = array + SHIFT_LEN;

모든 테스트는 5번씩 진행하였고, 결과는 평균치입니다.


1. 1-byte씩 이동

  const char *src;
  char *dest;
  size_t move_len;
  while (loop_cnt--) {
    move_len = MOVE_LEN;
    src = orig_src + move_len;
    dest = orig_dest + move_len;
    while (move_len--)
      *--dest = *--src;
  }

결과 :

  MT7621 : real 3.90s / user 3.90s / sys 0s
  CN6330 : real 5.20s / user 5.20s / sys 0s
  PC     : real 0.59s / user 0.59s / sys 0s

2. 2-bytes씩 이동

  const char *src;
  char *dest;
  size_t move_len, temp;
  while (loop_cnt--) {
    move_len = MOVE_LEN;
    src = orig_src + move_len;
    dest = orig_dest + move_len;
    if ((long)dest & 1) {
      char *cdest = dest;
      const char *csrc = src;
      *--cdest = *--csrc;
      dest = cdest;
      src = csrc;
      move_len--;
    }
    temp = move_len >> 1;
    if (temp) {
      short *sdest = dest;
      const short *ssrc = src;
      temp--;
      do
        *--sdest = *--ssrc;
      while (temp--);
      dest = sdest;
      src = ssrc;
    }
    if (move_len & 1) {
      char *cdest = dest;
      const char *csrc = src;
      *--cdest = *--csrc;
    }
  }

결과 :

  MT7621 : real 23.40s / user 8.50s / sys 14.90s
  CN6330 : real  2.90s / user 2.90s / sys 0s
  PC     : real  0.30s / user 0.30s / sys 0s

3. 4-byte씩 이동

  const char *src;
  char *dest;
  size_t move_len, temp;
  while (loop_cnt--) {
    move_len = MOVE_LEN;
    src = orig_src + move_len;
    dest = orig_dest + move_len;
    if ((long)dest & 1) {
      char *cdest = dest;
      const char *csrc = src;
      *--cdest = *--csrc;
      dest = cdest;
      src = csrc;
      move_len--;
    }
    if (move_len > 2 && (long)dest & 2) {
      short *sdest = dest;
      const short *ssrc = src;
      *--sdest = *--ssrc;
      dest = sdest;
      src = ssrc;
      move_len -= 2;
    }
    temp = move_len >> 2;
    if (temp) {
      int *idest = dest;
      const short *isrc = src;
      temp--;
      do
        *--idest = *--isrc;
      while (temp--);
      dest = idest;
      src = isrc;
    }
    if (move_len & 2) {
      short *sdest = dest;
      const short *ssrc = src;
      *--sdest = *--ssrc;
      dest = sdest;
      src = ssrc;
    }
    if (move_len & 1) {
      char *cdest = dest;
      const char *csrc = src;
      *--cdest = *--csrc;
    }
  }

결과 :

  MT7621 : real 11.65s / user 4.46s / sys 7.0s
  CN6330 : real  1.60s / user 1.60s / sys 0s
  PC     : real  0.16s / user 0.16s / sys 0s

4. 8-byte씩 이동

  const char *src;
  char *dest;
  size_t move_len, temp;
  while (loop_cnt--) {
    move_len = MOVE_LEN;
    src = orig_src + move_len;
    dest = orig_dest + move_len;
    if ((long)dest & 1) {
      char *cdest = dest;
      const char *csrc = src;
      *--cdest = *--csrc;
      dest = cdest;
      src = csrc;
      move_len--;
    }
    if (move_len > 2 && (long)dest & 2) {
      short *sdest = dest;
      const short *ssrc = src;
      *--sdest = *--ssrc;
      dest = sdest;
      src = ssrc;
      move_len -= 2;
    }
    if (move_len > 4 && (long)dest & 4) {
      int *idest = dest;
      const int *isrc = src;
      *--idest = *--isrc;
      dest = idest;
      src = isrc;
      move_len -= 4;
    }
    temp = move_len >> 3;
    if (temp) {
      long long *ldest = dest;
      const long long *lsrc = src;
      temp--;
      do
        *--ldest = *--lsrc;
      while (temp--);
      dest = ldest;
      src = lsrc;
    }
    if (move_len & 4) {
      int *idest = dest;
      const int *isrc = src;
      *--idest = *--isrc;
      dest = idest;
      src = isrc;
    }
    if (move_len & 2) {
      short *sdest = dest;
      const short *ssrc = src;
      *--sdest = *--ssrc;
      dest = sdest;
      src = ssrc;
    }
    if (move_len & 1) {
      char *cdest = dest;
      const char *csrc = src;
      *--cdest = *--csrc;
    }
  }

결과 :

  MT7621 : 테스트X
  CN6330 : real 0.90s / user 0.90s / sys 0s
  PC     : real 0.09s / user 0.09s / sys 0s

results matching ""

    No results matching ""