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 : }