cleaned up a little
[tridge/junkcode.git] / speed.c
1 #include <stdio.h>
2 #include <math.h>
3 #include <sys/time.h>
4
5
6 #define MAX(a,b) ((a)>(b)?(a):(b))
7 #define MIN(a,b) ((a)<(b)?(a):(b))
8
9 /* for solaris */
10 #ifdef SOLARIS
11 #include <limits.h>
12 #include <sys/times.h>
13 struct tms tp1,tp2;
14
15 static void start_timer()
16 {
17   times(&tp1);
18 }
19
20 static double end_timer()
21 {
22   times(&tp2);
23   return((tp2.tms_utime - tp1.tms_utime)/(1.0*CLK_TCK));
24 }
25
26 #elif (defined(LINUX))
27
28 #include <sys/resource.h>
29 struct rusage tp1,tp2;
30
31 static void start_timer()
32 {
33   getrusage(RUSAGE_SELF,&tp1);
34 }
35
36
37 static double end_timer()
38 {
39   getrusage(RUSAGE_SELF,&tp2);
40   return((tp2.ru_utime.tv_sec - tp1.ru_utime.tv_sec) + 
41          (tp2.ru_utime.tv_usec - tp1.ru_utime.tv_usec)*1.0e-6);
42 }
43
44 #else
45
46 #include <sys/time.h>
47
48 struct timeval tp1,tp2;
49
50 static void start_timer()
51 {
52   gettimeofday(&tp1,NULL);
53 }
54
55 static double end_timer()
56 {
57   gettimeofday(&tp2,NULL);
58   return((tp2.tv_sec - tp1.tv_sec) + 
59          (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
60 }
61
62 #endif
63
64 static FILE *f;
65
66 static void dumpval(double val)
67 {
68   fwrite((void *)&val,sizeof(val),1,f);
69 }
70
71
72
73 static void memcpy_test(int size)
74 {
75   int i;
76   int loops = 5.0e8 / size;
77   char *p1 = (char *)malloc(size+100);
78   char *p2 = (char *)malloc(size+100);
79   double t;
80
81   memset(p2,42,size);
82   start_timer();
83
84   for (i=0;i<loops;i++)
85     {
86       memcpy(p1+16,p2,size);
87       memcpy(p2+16,p1,size);
88     }
89
90   t = end_timer();
91   dumpval(*(double *)p1);
92   dumpval(*(double *)p2);
93   free(p1); free(p2);
94
95   printf("%g Mb/S\n",i*2.0*size/(1.0e6*t));
96 }
97
98
99 main()
100 {
101   int loops = 100000;
102   int l;
103   double d=0;
104   double t;
105   int i;
106
107 #define ADD_SIZE 1*1024
108   
109   f = fopen("/dev/null","w");
110   
111   printf("Floating point - sin() - ");
112   l = 1024;
113   start_timer();
114   for (i=0;i<loops;i++)
115     d += sin((double)i);
116   t = end_timer();
117   printf("%g MOPS\n",loops/(1.0e6*t));
118   dumpval(d);
119
120   printf("Floating point - log() - ");
121   l = 1024;
122   start_timer();
123   for (i=0;i<loops;i++)
124     d += log((double)(i+1));
125   t = end_timer();
126   printf("%g MOPS\n",loops/(1.0e6*t));
127   dumpval(d);
128
129   printf("Memcpy - 1kB - ");
130   memcpy_test(1024);
131
132   printf("Memcpy - 100kB - ");
133   memcpy_test(1024*100);
134
135   printf("Memcpy - 1MB - ");
136   memcpy_test(1024*1024);
137
138   printf("Memcpy - 10MB - ");
139   memcpy_test(1024*1024*10);
140
141   loops *= 10;
142   printf("Adding integers - ");
143   l = ADD_SIZE;
144   {
145     int *p1 = (int *)malloc(l*sizeof(int));
146     int sum;
147     for (i=0;i<l;i++)
148       p1[i] = i;
149     start_timer();
150     for (i=0;i<loops/100;i++)
151       {
152         int j;
153         sum = i;
154         for (j=0;j<l;j++)
155           sum += p1[j];
156       }
157     t = end_timer();
158     dumpval(sum);
159     free(p1);
160   }
161   printf("%g MOPS\n",0.01*(loops*l)/(1.0e6*t));
162
163   printf("Adding floats (size %d) - ",sizeof(float));
164   l = ADD_SIZE;
165   {
166     float *p1 = (float *)malloc(l*sizeof(float));
167     float sum;
168     for (i=0;i<l;i++)
169       p1[i] = i;
170     start_timer();
171     for (i=0;i<loops/100;i++)
172       {
173         int j;
174         sum = i;
175         for (j=0;j<l;j++)
176           sum += p1[j];
177       }
178     t = end_timer();
179     dumpval(sum);
180     free(p1);
181   }
182   printf("%g MOPS\n",0.01*(loops*l)/(1.0e6*t));
183
184   printf("Adding doubles (size %d) - ",sizeof(double));
185   l = ADD_SIZE;
186   {
187     double *p1 = (double *)malloc(l*sizeof(double));
188     double sum;
189     for (i=0;i<l;i++)
190       p1[i] = i;
191     start_timer();
192     for (i=0;i<loops/100;i++)
193       {
194         int j;
195         sum = i;
196         for (j=0;j<l;j++)
197           sum += p1[j];
198       }
199     t = end_timer();
200     dumpval(sum);
201     free(p1);
202   }
203   printf("%g MOPS\n",0.01*(loops*l)/(1.0e6*t));
204
205 }