| 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 |
| 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 |
| 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 |
{ |
{ |
| 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%%)", |
| 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 |