xref: /dragonfly/test/sysperf/memcpy.c (revision 678e8cc6)
1 /*
2  * memcpy.c
3  *
4  * $DragonFly: src/test/sysperf/memcpy.c,v 1.1 2004/04/29 16:14:53 dillon Exp $
5  */
6 
7 #include "blib.h"
8 
9 int glob[16384];
10 
11 void test_using(const char *ctl, char *buf, int bytes, void (*copyf)(const void *s1, void *d, size_t bytes));
12 
13 #if 0
14 extern void docopy1(const void *s, void *d, size_t bytes);
15 extern void docopy2(const void *s, void *d, size_t bytes);
16 extern void docopy3(const void *s, void *d, size_t bytes);
17 extern void docopy4(const void *s, void *d, size_t bytes);
18 extern void docopy5(const void *s, void *d, size_t bytes);
19 extern void docopy6(const void *s, void *d, size_t bytes);
20 extern void docopy7(const void *s, void *d, size_t bytes);
21 extern void fpcleanup(void);
22 #endif
23 
24 int
25 main(int ac, char **av)
26 {
27     int bytes;
28     char *ptr;
29     char *buf;
30 
31     if (ac == 1) {
32 	fprintf(stderr, "%s bytes\n", av[0]);
33 	exit(1);
34     }
35 
36     bytes = strtol(av[1], &ptr, 0);
37     switch(*ptr) {
38     case 'k':
39     case 'K':
40 	bytes *= 1024;
41 	break;
42     case 'm':
43     case 'M':
44 	bytes *= 1024 * 1024;
45 	break;
46     case 'g':
47     case 'G':
48 	bytes *= 1024 * 1024 * 1024;
49 	break;
50     case 0:
51 	break;
52     default:
53 	fprintf(stderr, "suffix '%s' not understood\n");
54 	exit(1);
55     }
56     if (bytes <= 0 && (bytes & 127)) {
57 	fprintf(stderr, "# of bytes must be a multiple of 128\n");
58 	exit(1);
59     }
60     buf = mmap(NULL, bytes * 2, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
61     if (buf == MAP_FAILED) {
62 	perror("mmap/buffer");
63 	exit(1);
64     }
65     bzero(buf, bytes * 2);
66 
67     test_using("bcopy", buf, bytes, bcopy);
68 #if 0
69     test_using("docopy1", buf, bytes, docopy1);
70     test_using("docopy2", buf, bytes, docopy2);
71     test_using("docopy3", buf, bytes, docopy3);
72     test_using("docopy4", buf, bytes, docopy4);
73     test_using("docopy5", buf, bytes, docopy5);
74     test_using("docopy6", buf, bytes, docopy6);
75     test_using("docopy7", buf, bytes, docopy7);
76 #endif
77     return(0);
78 }
79 
80 void
81 test_using(const char *ctl, char *buf, int bytes, void (*copyf)(const void *s1, void *d, size_t bytes))
82 {
83     int i;
84     int loops;
85     long long us;
86 
87     start_timing();
88     for (i = 0; (i & 31) || stop_timing(0, NULL) == 0; ++i) {
89 	copyf(buf, buf + bytes, bytes);
90     }
91 
92     loops = i * 2;
93     start_timing();
94     for (i = loops - 1; i >= 0; --i) {
95 	copyf(buf, buf + bytes, bytes);
96     }
97 #if 0
98     fpcleanup();
99 #endif
100     stop_timing(loops, ctl);
101     us = get_timing();
102     printf("%s %d %5.2f MBytes/sec\n", ctl, bytes,
103 	(double)loops * (double)bytes / (double)us);
104 }
105 
106