#include #include #include #include unsigned *buff = NULL; unsigned bsize; unsigned repeat; unsigned mask; #define LOAD 0x1000000 struct rusage ru_before, ru_after; void mkbuff(unsigned size) { unsigned mm; if (buff != NULL) free(buff); if ((buff = (unsigned *)malloc(size + sizeof(unsigned))) == NULL) { fprintf(stderr, "MALLOC\n"); exit(-1); } bsize = size / sizeof(unsigned); repeat = LOAD / bsize; mask = 0xffffffff - bsize; for (mm = 0x80000000; (mm & bsize) == 0; mm >>= 1) { mask -= mm; } } void test() { int i, j, k; for (i = 0; i < repeat; i++) { for (j = 0; j < bsize; j++) { buff[j] = buff[j + 1]; } } } void test0() { int i, j, k; for (j = 0; j < bsize-10; j++) { buff[j] = buff[j + 1]; } } main() { unsigned i; unsigned tb, ta; for (i = 256; i < 0x8000000; i <<= 1) { mkbuff(i); test0(); getrusage(RUSAGE_SELF, &ru_before); test(); getrusage(RUSAGE_SELF, &ru_after); tb = ru_before.ru_utime.tv_usec + ru_before.ru_utime.tv_sec * 1000000; ta = ru_after.ru_utime.tv_usec + ru_after.ru_utime.tv_sec * 1000000; printf("%d %d \n", i, ta - tb); } }