#include #include #include void main(void) { DWORD timesrc, timedst; WORD *src, *dst; src = new WORD[640*480]; dst = new WORD[640*480]; // テーブルの作成 WORD *table; table = new WORD[32768]; for(int i = 0; i < 32768; i ++) { WORD w = i; w &= 0x3DEF; w += 0x3DEF; w &= 0x4210; w >>= 4; w += 0x3DEF; w ^= 0x4210; w &= 0x4210; table[i] = i - w; } srand(timeGetTime( )); // 元イメージ作成 for(i = 0; i < 640*480; i ++) src[i] = rand( ) & 0x7fff; //---------------------------------------- // テーブル使用版 // 1回試行しておく for(int test = 0; test < 100; test ++) for(i = 0; i < 640*480; i ++) dst[i] = table[src[i]]; // 開始 timesrc = timeGetTime( ); for(test = 0; test < 100; test ++) for(i = 0; i < 640*480; i ++) dst[i] = table[src[i]]; timedst = timeGetTime( ); printf("table use: %ld\n", timedst - timesrc); //---------------------------------------- // テーブル未使用版 // 1回試行しておく for(test = 0; test < 100; test ++) { for(i = 0; i < 320*480; i ++) { DWORD sv = *((DWORD*)&(src[i*2])); _asm{ MOV EAX, sv MOV EBX, sv AND EAX, 0x3DEF3DEF ADD EAX, 0x3DEF3DEF AND EAX, 0x42104210 SHR EAX, 4 ADD EAX, 0x3DEF3DEF XOR EAX, 0x42104210 AND EAX, 0x04210421 SUB EBX, EAX MOV sv, EBX } *((DWORD*)&(dst[i*2])) = sv; } } // 開始 timesrc = timeGetTime( ); for(test = 0; test < 100; test ++) { for(i = 0; i < 320*480; i ++) { DWORD sv = *((DWORD*)&(src[i*2])); _asm{ MOV EAX, sv MOV EBX, sv AND EAX, 0x3DEF3DEF ADD EAX, 0x3DEF3DEF AND EAX, 0x42104210 SHR EAX, 4 ADD EAX, 0x3DEF3DEF XOR EAX, 0x42104210 AND EAX, 0x04210421 SUB EBX, EAX MOV sv, EBX } *((DWORD*)&(dst[i*2])) = sv; } } timedst = timeGetTime( ); printf("no table : %ld\n", timedst - timesrc); }