1 : /** 2 : * @file test.cpp 3 : * @brief 4 : * @author tenk* 5 : * @date 2010-?? 6 : * @note 7 : */ 8 : 9 : #include <stdio.h> 10 : //#include <stdlib.h> 11 : 12 : #include "pix32_resize.h" 13 : 14 : 15 : // =========================================================================== 16 : 17 : static unsigned XorShiftRand_seed_[2]; 18 : 19 : void XorShiftRand64_init(unsigned s) { 20 : XorShiftRand_seed_[0] = s = 1812433253U * (s ^ (s>>30)) + 1; 21 : XorShiftRand_seed_[1] = 1812433253U * (s ^ (s>>30)) + 2; 22 : } 23 : 24 : unsigned XorShiftRand64(void) { 25 : enum { A =10, B =13, C =10 }; // [10,13,10][8,9,22][2,7,3][23,3,24] 26 : unsigned t, y; 27 : unsigned* a = XorShiftRand_seed_; 28 : t = a[0]; 29 : t = (t ^ (t<<A)); 30 : a[0] = y = a[1]; 31 : t = (y ^ (y>>C)) ^ (t ^ (t>>B)); 32 : a[1] = t; 33 : return t; 34 : } 35 : 36 : 37 : 38 : // =========================================================================== 39 : unsigned test_buf [ 640 * 480 ]; 40 : unsigned test_buf2[ 1920 * 1080 ]; 41 : unsigned test_dmy_counter = 0; 42 : 43 : static void test_init1(void) { 44 : unsigned x, y; 45 : 46 : XorShiftRand64_init(0); 47 : for (y = 0; y < 480; ++y) { 48 : for (x = 0; x < 640; ++x) { 49 : test_buf[y * 640 + x] = XorShiftRand64(); 50 : } 51 : } 52 : } 53 : 54 : static void test_1(void) { 55 : pix32_resize(test_buf2, 1920, 1080, test_buf, 640, 480); 56 : } 57 : 58 : 59 : 60 : // =========================================================================== 61 : // 時間計測関係 62 : #ifndef PERFCNT_TICK_T 63 : #if 0 //def _WIN32 64 : #include <windows.h> 65 : typedef unsigned __int64 PERFCNT_TICK_T; 66 : static inline PERFCNT_TICK_T PERFCNT_getTick() { PERFCNT_TICK_T c; QueryPerformanceCounter((LARGE_INTEGER*)&c); return c; } 67 : static inline PERFCNT_TICK_T PERFCNT_tickPerSec() { static PERFCNT_TICK_T s = 0; if (!s) QueryPerformanceFrequency((LARGE_INTEGER*)&s); return s; } 68 : #elif 0 //defined LINUX 69 : #include <sys/resource.h> 70 : typedef unsigned long long PERFCNT_TICK_T; 71 : static inline PERFCNT_TICK_T PERFCNT_getTick() { struct rusage t; getrusage(RUSAGE_SELF, &t); return t.ru_utime.tv_sec * 1000000ULL + t.ru_utime.tv_usec; } 72 : #define PERFCNT_tickPerSec() 1000000ULL 73 : #else 74 : #include <time.h> 75 : typedef clock_t PERFCNT_TICK_T; 76 : #define PERFCNT_getTick() clock() 77 : #define PERFCNT_tickPerSec() CLOCKS_PER_SEC 78 : #endif 79 : #endif 80 : 81 : 82 : 83 : // =========================================================================== 84 : // 計測&チェック 85 : 86 : typedef void (*test_func_t)(); 87 : 88 : 89 : static double benchmark(test_func_t test, size_t count, unsigned flags, const char* ttl) 90 : { 91 : PERFCNT_TICK_T start_tick; 92 : PERFCNT_TICK_T elapsed; 93 : unsigned j; 94 : double e; 95 : unsigned char verboss = (unsigned char)(flags & 1); 96 : if (verboss) { 97 : printf("\t%s:start\n", ttl); 98 : } 99 : start_tick = PERFCNT_getTick(); // 計測開始 100 : for (j = 0; j < count; ++j) { 101 : test(); 102 : } 103 : elapsed = PERFCNT_getTick() - start_tick; // 計測終了 104 : e = elapsed * 1.0 / (PERFCNT_tickPerSec() * count); 105 : if (verboss) { 106 : printf("\t%s:end (%f)\n", ttl, e * 1000000.0); 107 : } 108 : 109 : for (j = 0; j < 1920*1080; ++j) { 110 : test_dmy_counter += test_buf2[j]; 111 : } 112 : return e; // 計測された時間. 113 : } 114 : 115 : 116 : 117 : 118 : static void test_all(unsigned count, unsigned flags, const char* name) 119 : { 120 : enum { N = 64 }; 121 : const char* nm[N] = {0}; 122 : double elaped[N] = { 0 }; 123 : unsigned j; 124 : 125 : if (name == 0) 126 : printf("\nテスト計測(%9d回実行の平均) (ミリ秒)\n", count ); 127 : name = (name) ? name : "test"; 128 : 129 : test_init1(); 130 : 131 : // いくつかのテスト呼び出し. 132 : { 133 : unsigned k = 0; 134 : nm[k] = name ; elaped[k] = benchmark(test_1, count, flags, nm[k]); ++k; 135 : // nm[k] = "test 2" ; elaped[k] = benchmark(test_2, count, flags, nm[k]); ++k; 136 : } 137 : 138 : for (j = 0; j < N; ++j) { 139 : double e; 140 : if (nm[j] == 0) 141 : continue; 142 : printf(",%-21s ,", nm[j]); 143 : e = elaped[j] * 1000.0; 144 : if (e > 0) 145 : printf("%12.3f,", e); 146 : else 147 : printf("%12s,", "---"); 148 : printf("\n"); 149 : } 150 : printf("// 最適化回避の意味なし出力 %d\n", test_dmy_counter); 151 : } 152 : 153 : 154 : 155 : // =========================================================================== 156 : 157 : /** 使い方. 158 : */ 159 : static int usage() 160 : { 161 : printf( "usage>test [-opts] file(s)\n" 162 : " テストルーチン.\n" 163 : " -cN 試行回数の指定\n" 164 : " -v 経過メッセージを増やす\n" 165 : ); 166 : return 1; 167 : } 168 : 169 : 170 : 171 : /** メイン. 172 : */ 173 : int main(int argc, const char* argv[]) 174 : { 175 : int i; 176 : unsigned count = 1; 177 : unsigned flags = 0; 178 : const char* name = NULL; 179 : 180 : if (argc < 2) 181 : return usage(); 182 : 183 : // オプション取得. 184 : for (i = 1; i < argc; ++i) { 185 : const char* a = argv[i]; 186 : if (a[0] == '-') { 187 : if (a[1] == 'v') { 188 : flags = 1; // verboss; 189 : } else if (a[1] == 'c') { 190 : count = strtol(a+2,0,0); 191 : if (count < 1) 192 : count = 1; 193 : } else if (a[1] == 't') { 194 : name = a+2; 195 : } else { 196 : return usage(); 197 : } 198 : } 199 : } 200 : 201 : test_all(count, flags, name); 202 : 203 : return 0; 204 : }