Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/mty-makai/mty.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 119 by notanpe, Fri Apr 13 03:09:02 2007 UTC revision 120 by notanpe, Sat Apr 14 12:22:49 2007 UTC
# Line 693  set_salt(signed char *code, Line 693  set_salt(signed char *code,
693  }  }
694    
695  static  static
696  unsigned long  uint32_t
697  usec()  usec()
698  {  {
699      static uint32_t epoch = 0;
700      uint32_t sec, msec;
701    
702  #if !defined(WIN32)  #if !defined(WIN32)
703    struct timeval tv;    struct timeval tv;
704    gettimeofday(&tv, NULL);    gettimeofday(&tv, NULL);
705    return 100UL * tv.tv_sec + (tv.tv_usec / 10000);    sec = tv.tv_sec;
706      msec = tv.tv_usec / 10000;
707  #else  #else
708    struct timeb tm;    struct timeb tm;
709    ftime(&tm);    ftime(&tm);
710    return 100UL * tm.time + tm.millitm / 10;    sec = tm.time;
711      msec = tm.millitm / 10;
712  #endif  #endif
713    
714      if ( epoch == 0 ) {
715       epoch = sec;
716      }
717    
718      return ((sec - epoch) * 100 + msec);
719  }  }
720    
721  static  static
# Line 771  main(int argc, char *argv[]) Line 782  main(int argc, char *argv[])
782    
783    int xhash_loaded;    int xhash_loaded;
784    
785  #define LOOP_FACTOR 100000UL    /* こんなもんでいいか */  #define LOOP_FACTOR 128000      /* こんなもんでいいか */
786  #define UPDATE_INTERVAL 8       /* 速度表示の間隔 秒 */  #define UPDATE_INTERVAL 8       /* 速度表示の間隔 秒 */
787  #define AVG_SPD 500000UL        /* 平均速度の初期値 trips/s */  #define AVG_SPD 480000          /* 平均速度の初期値 trips/s */
788    struct status {    struct status {
789      unsigned long startTime;    /* 開始時刻 ミリ秒 */      uint32_t startTime; /* 開始時刻 ミリ秒 */
790      unsigned long lastTime;     /* 最後に表示した時刻 ミリ秒 */      uint32_t lastTime;  /* 最後に表示した時刻 ミリ秒 */
791      double        lastLoopCnt;  /* 最後に表示した時のループ回数 */      uint32_t loop;      /* 総検索個数 % LOOP_FACTOR */
792      unsigned long loop;         /* ループ回数 % LOOP_FACTOR */      uint32_t mloop;     /* 総検索個数 / LOOP_FACTOR */
793      unsigned long mloop;        /* ループ回数 / LOOP_FACTOR */      uint32_t lastloop;  /* 最後に表示した時の loop */
794    } status;    } status;
795    unsigned long upd_int = AVG_SPD * UPDATE_INTERVAL;    uint32_t upd_int = AVG_SPD * UPDATE_INTERVAL;
796  /*  /*
797   平均速度 (trips/s) * UPDATE_INTERVAL が ULONG_MAX を超えると発狂する。   平均速度 (trips/s) * UPDATE_INTERVAL が UINT32_MAX を超えると発狂する。
798   ULONG_MAX = 4294967295, 平均速度 = 100Mtrips/s なら、   UINT32_MAX = 4294967295, 平均速度 = 100Mtrips/s なら、
799   4294967295 / (100 * 1000 * 1000) = 42.949 秒までにすること。   4294967295 / (100 * 1000 * 1000) = 42.949 秒まで。(和良
800   LOOP_FACTOR が平均速度より十分小さければ、ほぼ指定間隔になる。   LOOP_FACTOR が平均速度より十分小さければ、ほぼ指定間隔になる。
801     LOOP_FACTOR * UINT32_MAX + LOOP_FACOTR 個検索するとオーバーフローする。w
802   */   */
803    
804  #if 0  #if 0
# Line 860  main(int argc, char *argv[]) Line 872  main(int argc, char *argv[])
872    nblk_hit = nblk_total = 0;    nblk_hit = nblk_total = 0;
873    nap_hit = nap_total = 0;    nap_hit = nap_total = 0;
874    cr = 0;    cr = 0;
875      memset( &status, 0, sizeof( struct status ) );
876    status.startTime = status.lastTime = usec();    status.startTime = status.lastTime = usec();
   status.lastLoopCnt = 0;  
   status.loop = 0;  
   status.mloop = 0;  
877    /* 探索ループだぞっと */    /* 探索ループだぞっと */
878    for (;;)    for (;;)
879          {          {
# Line 978  main(int argc, char *argv[]) Line 988  main(int argc, char *argv[])
988            if ( status.loop >= upd_int )            if ( status.loop >= upd_int )
989                  {                  {
990  /*  /*
991   ここで更新間隔のチェックをすれば、高速マシンでヘンな速度表示が最初だけ出る   ここで更新間隔のチェックをすれば、高速マシンで誤差の大きい速度表示が
992   のを防げる。   出るのを防げる。
993   だがそれをすると普通のマシンでムダな usec() 呼び出しをすることになる。   だがそれをすると普通のマシンでムダな usec() 呼び出しをすることになる。
994   だからやらない。決して手抜きではない。   だからやらない。決して手抜きではない。
995   */   */
996                    time_t curTime;                    uint32_t curTime, diffTime;
997                    int a, b;                    int a, b, c;
                   double loopCnt, zoneCnt;  
998    
999    #ifdef SPDEBUG
1000      putchar( '\n' );
1001      printf( "mloop = %d, loop = %d\n", status.mloop, status.loop );
1002    #endif
1003                      curTime = usec();
1004                      diffTime = curTime - status.lastTime;
1005                      b = (status.loop - status.lastloop) * 100 / diffTime;
1006                    status.mloop += ( status.loop / LOOP_FACTOR );                    status.mloop += ( status.loop / LOOP_FACTOR );
1007                    status.loop %= LOOP_FACTOR;                    status.loop %= LOOP_FACTOR;
1008                    curTime = usec();                    diffTime = curTime - status.startTime;
1009                    loopCnt = (double)status.mloop * LOOP_FACTOR + status.loop;                    if ( diffTime >= 1000000000 ) {
1010                    zoneCnt = loopCnt - status.lastLoopCnt;                     c = 1000000;
1011                    a = loopCnt * 100 / (curTime - status.startTime);                    } else if ( diffTime >= 100000000 ) {
1012                    b = zoneCnt * 100 / (curTime - status.lastTime);                     c = 100000;
1013                      } else if ( diffTime >= 10000000 ) {
1014                       c = 10000;
1015                      } else if ( diffTime >= 1000000 ) {
1016                       c = 1000;
1017                      } else if ( diffTime >= 100000 ) {
1018                       c = 100;
1019                      } else if ( diffTime >= 10000 ) {
1020                       c = 10;
1021                      } else {
1022                       c = 1;
1023                      }
1024                      a = status.mloop * (LOOP_FACTOR / (10 * c)) / (diffTime / c);
1025                    upd_int = b * UPDATE_INTERVAL;                    upd_int = b * UPDATE_INTERVAL;
1026                      upd_int = upd_int / LOOP_FACTOR * LOOP_FACTOR;
1027    #ifdef SPDEBUG
1028    {
1029    #ifndef USE_MMX
1030      double d;
1031      d = ((double)status.mloop * LOOP_FACTOR / 1000.0) / ((double)diffTime / 100.0);
1032      printf( "d = %f\n", d );
1033    #endif
1034      printf( "mloop = %d, loop = %d\n", status.mloop, status.loop );
1035      printf( "%d - %d = %d\n", curTime, status.startTime, curTime - status.startTime );
1036      printf( "%d - %d = %d\n", curTime, status.lastTime, curTime - status.lastTime );
1037      printf( "c = %d\n", c );
1038      printf( "upd_int = %d\n", upd_int );
1039    }
1040    #endif
1041                      status.lastTime = curTime;
1042                      status.lastloop = status.loop;
1043  #if DEBUG>=1  #if DEBUG>=1
1044                    fprintf(stderr,                    fprintf(stderr,
1045                            "%5d/%5d(%3d%%)",                            "%5d/%5d(%3d%%)",
# Line 1010  main(int argc, char *argv[]) Line 1055  main(int argc, char *argv[])
1055                    nap_hit = nap_total = 0;                    nap_hit = nap_total = 0;
1056  #endif  #endif
1057                    fprintf( stderr,                    fprintf( stderr,
1058                          "%6d.%03dktrips/s [%6d.%03dktrips/s]\r",                          "%6dktrips/s [%6d.%03dktrips/s]\r",
1059                          a / 1000, a % 1000,                          a, b / 1000, b % 1000 );
                         b / 1000, b % 1000 );  
                   status.lastTime = curTime;  
                   status.lastLoopCnt = loopCnt;  
1060                    cr++;                    cr++;
1061                  }                  }
1062  #if 1  #if 1

Legend:
Removed from v.119  
changed lines
  Added in v.120

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26