// coded by SiR // // compile: cl region.cpp /link winmm.lib #include #include #define NUM_OF_POINT 10000 #define TRIAL_LOOP 1000 void main(void) { int i, j, k; DWORD startTime, endTime; BOOL tmp; POINT p[NUM_OF_POINT]; BOOL res[NUM_OF_POINT]; // データの準備 for(i = 0; i < NUM_OF_POINT; i ++) { p[i].x = rand( ) % (640+64) -32; p[i].y = rand( ) % (480+64) -32; } for(k = 0; k < 10; k ++) { // optimize code startTime = timeGetTime( ); for(i = 0; i < TRIAL_LOOP; i ++) { for(j = 0; j < NUM_OF_POINT; j ++) { LONG a1 = -16 - p[i].x; LONG a2 = p[i].x - (640+16); LONG a3 = -16 - p[i].y; LONG a4 = p[i].y - (480+16); if((a1 | a2 | a3 | a4) < 0) res[i] = 0; else res[i] = 1; } } endTime = timeGetTime( ); printf(">%ld\n", endTime - startTime); // plain code startTime = timeGetTime( ); for(i = 0; i < TRIAL_LOOP; i ++) { for(j = 0; j < NUM_OF_POINT; j ++) { if(p[i].x < -16 || p[i].x > (640+16) || p[i].y < -16 || p[i].y > (480+16)) res[i] = 0; else res[i] = 1; } } endTime = timeGetTime( ); printf("%ld\n", endTime - startTime); } }