1 // Author: Suleiman Souhlal (suleiman@google.com)
2 
3 #include <stdio.h>
4 #include <err.h>
5 #include <stdint.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <sys/mman.h>
9 #include <fcntl.h>
10 
11 #define O_NOATIME     01000000
12 
13 inline uint64_t
rdtsc(void)14 rdtsc(void)
15 {
16 	int64_t tsc;
17 
18 	__asm __volatile("rdtsc" : "=A" (tsc));
19 	return (tsc);
20 }
21 
22 int
main(int argc,char ** argv)23 main(int argc, char **argv)
24 {
25 	struct stat st;
26 	uint64_t e, s, t;
27 	char *p, q;
28 	long i;
29 	int fd;
30 
31 	if (argc < 2) {
32 		printf("Usage: %s <file>\n", argv[0]);
33 		return (1);
34 	}
35 
36 	if ((fd = open(argv[1], O_RDWR | O_NOATIME)) < 0)
37 		err(1, "open");
38 
39 	if (fstat(fd, &st) < 0)
40 		err(1, "fstat");
41 
42 	p = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
43 
44 	t = 0;
45 	for (i = 0; i < 1000; i++) {
46 		*p = 0;
47 		msync(p, 4096, MS_SYNC);
48 		s = rdtsc();
49 		*p = 0;
50 		__asm __volatile(""::: "memory");
51 		e = rdtsc();
52 		if (argc > 2)
53 			printf("%d: %lld cycles %jd %jd\n", i, e - s, (intmax_t)s, (intmax_t)e);
54 		t += e - s;
55 	}
56 
57 	printf("average time: %lld cycles\n", t / 1000);
58 
59 	return (0);
60 }
61