More minor IPI work.
[dragonfly/vkernel-mp.git] / test / sysperf / memzero.c
blobd25a94f451689f9802fd3380a3c117b71f6e3050
1 /*
2 * memzero.c
4 * $DragonFly: src/test/sysperf/memzero.c,v 1.1 2004/04/29 18:14:53 dillon Exp $
5 */
7 #include "blib.h"
9 int glob[16384];
11 void test_using(const char *ctl, char *buf, int bytes, void (*zerof)(void *d, size_t bytes));
13 extern void dozero1(void *d, size_t bytes);
14 extern void dozero2(void *d, size_t bytes);
15 extern void dozero3(void *d, size_t bytes);
16 extern void dozero4(void *d, size_t bytes);
17 extern void dozero5(void *d, size_t bytes);
18 extern void dozero6(void *d, size_t bytes);
19 extern void dozero7(void *d, size_t bytes);
20 extern void fpcleanup(void);
22 int
23 main(int ac, char **av)
25 int bytes;
26 char *ptr;
27 char *buf;
29 if (ac == 1) {
30 fprintf(stderr, "%s bytes\n", av[0]);
31 exit(1);
34 bytes = strtol(av[1], &ptr, 0);
35 switch(*ptr) {
36 case 'k':
37 case 'K':
38 bytes *= 1024;
39 break;
40 case 'm':
41 case 'M':
42 bytes *= 1024 * 1024;
43 break;
44 case 'g':
45 case 'G':
46 bytes *= 1024 * 1024 * 1024;
47 break;
48 case 0:
49 break;
50 default:
51 fprintf(stderr, "suffix '%s' not understood\n");
52 exit(1);
54 if (bytes <= 0 && (bytes & 127)) {
55 fprintf(stderr, "# of bytes must be a multiple of 128\n");
56 exit(1);
59 buf = mmap(NULL, bytes * 2, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
60 if (buf == MAP_FAILED) {
61 perror("mmap/buffer");
62 exit(1);
64 bzero(buf, bytes * 2);
66 test_using("bzero", buf, bytes, (void *)bzero);
67 test_using("dozero1", buf, bytes, dozero1);
68 test_using("dozero2", buf, bytes, dozero2);
69 test_using("dozero3", buf, bytes, dozero3);
70 test_using("dozero4", buf, bytes, dozero4);
71 test_using("dozero5", buf, bytes, dozero5);
72 test_using("dozero6", buf, bytes, dozero6);
73 test_using("dozero7", buf, bytes, dozero7);
74 return(0);
77 void
78 test_using(const char *ctl, char *buf, int bytes, void (*zerof)(void *d, size_t bytes))
80 int i;
81 int loops;
82 long long us;
84 start_timing();
85 for (i = 0; (i & 31) || stop_timing(0, NULL) == 0; ++i) {
86 zerof(buf, bytes);
89 loops = i * 2;
90 start_timing();
91 for (i = loops - 1; i >= 0; --i) {
92 zerof(buf, bytes);
94 fpcleanup();
95 stop_timing(loops, ctl);
96 us = get_timing();
97 printf("%s %d %5.2f MBytes/sec\n", ctl, bytes,
98 (double)loops * (double)bytes / (double)us);