ホームに戻る
 実行時間の測定

;
;   アセンブラ
;

segment .code USE32

global _s

_s: resb 8

global _mmx

_mmx:
  push    ebp
  mov     ebp, esp
  mov     edx, [ebp+8]

  mov     dword [_s], 0x00000000
  mov     dword [_s + 4], 0x00000000
  movq    mm0, [_s]

  xor     eax, eax

@1:
  movq    [edx + eax*8], mm0

  inc     eax
  cmp     eax, 8
  jl      short @1

  emms

  leave
  ret
__end__mmx

/*
*   C言語
*/

#include <stdio.h>
#include <time.h>

extern void mmx(char *p);

int main()
{
  int i;
  unsigned char p[8 * 8];
  clock_t start, end;

  start = clock();

  for(i = 0; i < 1000000; i++){
    mmx(p);
  }

  end = clock();
  printf("\n\n%.2f秒かかりました\n", (double)(end-start)/CLOCKS_PER_SEC);

  printf("\n");

  for(i = 0; i < 8; i++){
    printf("%02d\n", p[i]);
  }

  return 0;
}


このプログラムについて

mmx 関数は8×8バイトのバッファに 0 を埋める。
一度に8バイトのコピーができるので mmx 関数内のループは8回。

mmx 関数は100万回のループで実行されその時間を表示します。

mov で _s に 0x00000000 を代入する処理は、
最初から入れておけば手間が要らないし効率も良いのですが、
サンプルなのであえてこういうかたちにしてみました。

inserted by FC2 system