#include #include #include #include #include #define K 1024LL #define print_bps(x) do { \ if (x < K) \ printf(" %14lf B/Sec", x); \ else if (x < K * K) \ printf(" %14lfd KB/Sec", x / K); \ else if (x < K * K * K) \ printf(" %14lf MB/Sec", x / K / K); \ else \ printf(" %14lf GB/Sec", x / K / K / K); \ } while (0) long long local_atoll(const char *str) { unsigned int i; long long length = -1, unit = 1; if (!isdigit(str[0])) goto out_err; for (i = 1; i < strlen(str); i++) { switch (str[i]) { case 'B': case 'b': break; case 'K': if (str[i + 1] != 'B') goto out_err; else goto kilo; case 'k': if (str[i + 1] != 'b') goto out_err; kilo: unit = K; break; case 'M': if (str[i + 1] != 'B') goto out_err; else goto mega; case 'm': if (str[i + 1] != 'b') goto out_err; mega: unit = K * K; break; case 'G': if (str[i + 1] != 'B') goto out_err; else goto giga; case 'g': if (str[i + 1] != 'b') goto out_err; giga: unit = K * K * K; break; case 'T': if (str[i + 1] != 'B') goto out_err; else goto tera; case 't': if (str[i + 1] != 'b') goto out_err; tera: unit = K * K * K * K; break; case '\0': /* only specified figures */ unit = 1; break; default: if (!isdigit(str[i])) goto out_err; break; } } length = atoll(str) * unit; goto out; out_err: length = -1; out: return length; } static double timeval2double(struct timeval *ts) { return (double)ts->tv_sec + (double)ts->tv_usec / (double)1000000; } void do_memcpy(long long len, int prefault) { void *src, *dst; struct timeval tv_start, tv_end, tv_diff; double res; src = calloc(1, len); dst = calloc(1, len); if (prefault) memcpy(dst, src, len); gettimeofday(&tv_start, NULL); memcpy(dst, src, len); gettimeofday(&tv_end, NULL); timersub(&tv_end, &tv_start, &tv_diff); free(src); free(dst); res = (double)((double)len / timeval2double(&tv_diff)); print_bps(res); if (prefault) printf("\t(with prefault)"); printf("\n"); } int main(int argc, char *argv[]) { long long len = -1; char ch; int prefault = 0; while( (ch=getopt(argc, argv, "l:") ) != -1 ) { switch(ch) { case 'l': len = local_atoll(optarg); if (len < 0) { printf("Invalid size\n"); return 0; } else printf("# Copying %s Byte ...\n", optarg); break; default: return; } } do_memcpy(len, 1); return 0; }