rc: Move stop_boot() from rc.d/fsck to rc.subr and improve it
[dragonfly.git] / test / sysperf / memcpy.c
1 /*
2  * memcpy.c
3  */
4
5 #include "blib.h"
6
7 int glob[16384];
8
9 void test_using(const char *ctl, char *buf, int bytes, void (*copyf)(const void *s1, void *d, size_t bytes));
10
11 #if 0
12 extern void docopy1(const void *s, void *d, size_t bytes);
13 extern void docopy2(const void *s, void *d, size_t bytes);
14 extern void docopy3(const void *s, void *d, size_t bytes);
15 extern void docopy4(const void *s, void *d, size_t bytes);
16 extern void docopy5(const void *s, void *d, size_t bytes);
17 extern void docopy6(const void *s, void *d, size_t bytes);
18 extern void docopy7(const void *s, void *d, size_t bytes);
19 extern void fpcleanup(void);
20 #endif
21
22 int
23 main(int ac, char **av)
24 {
25     int bytes;
26     char *ptr;
27     char *buf;
28
29     if (ac == 1) {
30         fprintf(stderr, "%s bytes\n", av[0]);
31         exit(1);
32     }
33
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", ptr);
52         exit(1);
53     }
54     if (bytes <= 0 && (bytes & 127)) {
55         fprintf(stderr, "# of bytes must be a multiple of 128\n");
56         exit(1);
57     }
58     buf = mmap(NULL, bytes * 2, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
59     if (buf == MAP_FAILED) {
60         perror("mmap/buffer");
61         exit(1);
62     }
63     bzero(buf, bytes * 2);
64
65     test_using("bcopy", buf, bytes, bcopy);
66 #if 0
67     test_using("docopy1", buf, bytes, docopy1);
68     test_using("docopy2", buf, bytes, docopy2);
69     test_using("docopy3", buf, bytes, docopy3);
70     test_using("docopy4", buf, bytes, docopy4);
71     test_using("docopy5", buf, bytes, docopy5);
72     test_using("docopy6", buf, bytes, docopy6);
73     test_using("docopy7", buf, bytes, docopy7);
74 #endif
75     return(0);
76 }
77
78 void
79 test_using(const char *ctl, char *buf, int bytes, void (*copyf)(const void *s1, void *d, size_t bytes))
80 {
81     int i;
82     int loops;
83     long long us;
84
85     start_timing();
86     for (i = 0; (i & 31) || stop_timing(0, NULL) == 0; ++i) {
87         copyf(buf, buf + bytes, bytes);
88     }
89
90     loops = i * 2;
91     start_timing();
92     for (i = loops - 1; i >= 0; --i) {
93         copyf(buf, buf + bytes, bytes);
94     }
95 #if 0
96     fpcleanup();
97 #endif
98     stop_timing(loops, ctl);
99     us = get_timing();
100     printf("%s %d %5.2f MBytes/sec\n", ctl, bytes, 
101         (double)loops * (double)bytes / (double)us);
102 }
103