#include <limits.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
static unsigned char *sleep_arg[] = {
"0.001","0.002","0.004","0.005",
};
#define N ( sizeof( sleep_arg) / sizeof( sleep_arg[0]))
static unsigned char *com_args[] = { "sleep",(char *) NULL,(char *) NULL };
static void d_com( void)
{
int status;
if ( !fork()){
execv("/bin/sleep",com_args);
perror( NULL);
kill( getppid(),SIGINT);
exit( 1);
}
wait( &status);
}
static struct timespec nanosleep_req = {0};
static void d_sys( void)
{
nanosleep( &nanosleep_req,NULL);
}
static void f_iter( int r[],void ( *func)( void))
{
int j;
struct timeval tv_before,tv_after;
r[0] = INT_MAX;
r[1] = 0;
r[2] = 0;
for ( j = 0; j < 100; j++){
int val;
gettimeofday( &tv_before,NULL);
( *func)();
gettimeofday( &tv_after,NULL);
val = ( tv_after.tv_sec - tv_before.tv_sec) * 1000000
+ tv_after.tv_usec - tv_before.tv_usec;
( val < r[0]) && ( r[0] = val);
( r[1] < val) && ( r[1] = val);
r[2] += val;
}
r[2] /= 100;
}
int main( int argc,char **argv)
{
int i;
for ( i = 0; i < N; i++){
int r_com[3],r_sys[3];
com_args[1] = sleep_arg[i];
f_iter( r_com,d_com);
nanosleep_req.tv_nsec = strtod( sleep_arg[i],NULL) * 1.0e9;
f_iter( r_sys,d_sys);
printf("%s %d-%d,%d %d-%d,%d\n",
sleep_arg[i],
r_com[0],r_com[1],r_com[2],r_sys[0],r_sys[1],r_sys[2]);
}
return 0;
}
I2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqc2xlZXBfYXJnW10gPSB7CiAgIjAuMDAxIiwiMC4wMDIiLCIwLjAwNCIsIjAuMDA1IiwKfTsKI2RlZmluZSBOICggc2l6ZW9mKCBzbGVlcF9hcmcpIC8gc2l6ZW9mKCBzbGVlcF9hcmdbMF0pKQoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKmNvbV9hcmdzW10gPSB7ICJzbGVlcCIsKGNoYXIgKikgTlVMTCwoY2hhciAqKSBOVUxMIH07CnN0YXRpYyB2b2lkIGRfY29tKCB2b2lkKQp7CiAgaW50IHN0YXR1czsKICBpZiAoICFmb3JrKCkpewogICAgZXhlY3YoIi9iaW4vc2xlZXAiLGNvbV9hcmdzKTsKICAgIHBlcnJvciggTlVMTCk7CiAgICBraWxsKCBnZXRwcGlkKCksU0lHSU5UKTsKICAgIGV4aXQoIDEpOwogIH0KICB3YWl0KCAmc3RhdHVzKTsKfQoKc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBuYW5vc2xlZXBfcmVxID0gezB9OwpzdGF0aWMgdm9pZCBkX3N5cyggdm9pZCkKewogIG5hbm9zbGVlcCggJm5hbm9zbGVlcF9yZXEsTlVMTCk7Cn0KCnN0YXRpYyB2b2lkIGZfaXRlciggaW50IHJbXSx2b2lkICggKmZ1bmMpKCB2b2lkKSkKewogIGludCBqOwogIHN0cnVjdCB0aW1ldmFsIHR2X2JlZm9yZSx0dl9hZnRlcjsKICByWzBdID0gSU5UX01BWDsKICByWzFdID0gMDsKICByWzJdID0gMDsKICBmb3IgKCBqID0gMDsgaiA8IDEwMDsgaisrKXsKICAgIGludCB2YWw7CiAgICBnZXR0aW1lb2ZkYXkoICZ0dl9iZWZvcmUsTlVMTCk7CiAgICAoICpmdW5jKSgpOwogICAgZ2V0dGltZW9mZGF5KCAmdHZfYWZ0ZXIsTlVMTCk7CiAgICB2YWwgPSAoIHR2X2FmdGVyLnR2X3NlYyAtIHR2X2JlZm9yZS50dl9zZWMpICogMTAwMDAwMAogICAgICArIHR2X2FmdGVyLnR2X3VzZWMgLSB0dl9iZWZvcmUudHZfdXNlYzsKICAgICggdmFsIDwgclswXSkgJiYgKCByWzBdID0gdmFsKTsKICAgICggclsxXSA8IHZhbCkgJiYgKCByWzFdID0gdmFsKTsKICAgIHJbMl0gKz0gdmFsOwogIH0KICByWzJdIC89IDEwMDsKfQoKaW50IG1haW4oIGludCBhcmdjLGNoYXIgKiphcmd2KQp7CiAgaW50IGk7CiAgZm9yICggaSA9IDA7IGkgPCBOOyBpKyspewogICAgaW50IHJfY29tWzNdLHJfc3lzWzNdOwogICAgY29tX2FyZ3NbMV0gPSBzbGVlcF9hcmdbaV07CiAgICBmX2l0ZXIoIHJfY29tLGRfY29tKTsKICAgIG5hbm9zbGVlcF9yZXEudHZfbnNlYyA9IHN0cnRvZCggc2xlZXBfYXJnW2ldLE5VTEwpICogMS4wZTk7CiAgICBmX2l0ZXIoIHJfc3lzLGRfc3lzKTsKICAgIHByaW50ZigiJXMgJWQtJWQsJWQgJWQtJWQsJWRcbiIsCgkgICBzbGVlcF9hcmdbaV0sCgkgICByX2NvbVswXSxyX2NvbVsxXSxyX2NvbVsyXSxyX3N5c1swXSxyX3N5c1sxXSxyX3N5c1syXSk7CiAgfQogIHJldHVybiAwOwp9Cg==