#include #include #include #include #include volatile unsigned sink; double second() { struct timeval tv; gettimeofday(&tv,0); return tv.tv_sec + 1e-6 * tv.tv_usec; } int main(int argc, char *argv[]) { int doWrite = 1; unsigned size = 80 * 1024 * 1024; int letter; while ((letter = getopt(argc, argv, "s:wrvh?" )) != -1) { switch(letter) { case 's': size = atoi(optarg) * 1024 * 1024; break; case 'w': doWrite = 1; break; default: fprintf(stderr,"useup [-s mb][-w]\n"); exit(1); } } int *base = (int*) mmap(0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, 0, 0); if (base == MAP_FAILED) { perror("mmap failed"); exit(1); } int *end = base + size/4; while (1) { double start = second(); if (doWrite) for (int *p = base; p < end; p += 1024) *p = 0; else { unsigned sum = 0; for (int *p = base; p < end; p += 1024) sum += *p; sink = sum; } printf("%f\n",1000*(second() - start)); } }