]> Creatis software - gdcm.git/blob - Testing/TestInline.cxx
*actual* image length may differ to 1 with Pixel Data Element length!
[gdcm.git] / Testing / TestInline.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: TestInline.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/11/30 11:40:26 $
7   Version:   $Revision: 1.11 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 // This test is expected to 'show' the actual effect on an 'inline' function.
19 // We exchange 2 numbers
20 // - with a macro : this is the quicker (any doubt ?)
21 // - with a function, passing the params by pointer
22 // - with a function, passing the params by reference (exactly same time)
23 // - with an inline function described in the main()
24 //                                                   absolutely NO effect ?!?
25 // - with a function, described in the .h
26 //                                                   absolutely NO effect ?!?
27 // - with an inline function, described in the .h
28 //                                                   absolutely NO effect ?!?
29 //
30 // Which CXX_FLAGS, LINKER_FLAGS, ...,  must we set to see the difference?
31
32 #include "gdcmUtil.h"
33
34 #include <sys/times.h>
35 #include <iostream>
36
37 void        frswap (double &a, double &b);
38 void        fpswap (double *a, double *b);
39 inline void ifrswap(double &a, double &b);
40 inline void ifpswap(double *a, double *b);
41
42 uint8_t     passDirect8(uint8_t a,  uint8_t b);
43 uint8_t     passRef8(uint8_t &a, uint8_t &b);
44 uint8_t     passPtr8(uint8_t *a, uint8_t *b);
45
46 uint16_t     passDirect16(uint16_t a,  uint16_t b);
47 uint16_t     passRef16(uint16_t &a, uint16_t &b);
48 uint16_t     passPtr16(uint16_t *a, uint16_t *b);
49
50 uint32_t     passDirect32(uint32_t a,  uint32_t b);
51 uint32_t     passRef32(uint32_t &a, uint32_t &b);
52 uint32_t     passPtr32(uint32_t *a, uint32_t *b);
53
54 double     passDirect(double a,  double b);
55 double     passRef(double &a, double &b);
56 double     passPtr(double *a, double *b);
57
58 #define           \
59 mswap(a, b)       \
60 {                 \
61    double tmp = a;\
62    a   = b;       \
63    b   = tmp;     \
64 }
65
66 void frswap(double &a, double &b)
67 {
68    double tmp;
69    tmp = a;
70    a   = b;
71    b   = tmp;
72
73 }
74
75 void fpswap(double *a, double *b)
76 {
77    double tmp;
78    tmp = *a;
79    *a  = *b;
80    *b  = tmp;
81
82 }
83
84 inline void ifpswap(double *a, double *b)
85 {
86    double tmp;
87    tmp = *a;
88    *a  = *b;
89    *b  = tmp;
90 }
91
92 inline void ifrswap(double &a, double &b)
93 {
94    double tmp;
95    tmp = a;
96    a   = b;
97    b   = tmp;
98 }
99
100
101 uint32_t passRef32(uint32_t &a, uint32_t &b)
102 {
103    return a + b;
104
105 uint32_t passPtr32(uint32_t *a, uint32_t *b)
106 {
107    return *a + *b;
108
109 uint32_t passDirect32(uint32_t a, uint32_t b)
110 {
111    return a + b;
112
113
114
115 uint16_t passRef16(uint16_t &a, uint16_t &b)
116 {
117    return a + b;
118
119 uint16_t passPtr16(uint16_t *a, uint16_t *b)
120 {
121    return *a + *b;
122
123 uint16_t passDirect16(uint16_t a, uint16_t b)
124 {
125    return a + b;
126
127
128 uint8_t passRef8(uint8_t &a, uint8_t &b)
129 {
130    return a + b;
131
132 uint8_t passPtr8(uint8_t *a, uint8_t *b)
133 {
134    return *a + *b;
135
136 uint8_t passDirect8(uint8_t a, uint8_t b)
137 {
138    return a + b;
139
140
141 float passRefFloat(float &a, float &b)
142 {
143    return a + b;
144
145 float passPtrFloat(float *a, float *b)
146 {
147    return *a + *b;
148
149 float passDirectFloat(float a, float b)
150 {
151    return a + b;
152
153
154 double passRefDouble(double &a, double &b)
155 {
156    return a + b;
157
158 double passPtrDouble(double *a, double *b)
159 {
160    return *a + *b;
161
162 double passDirectDouble(double a, double b)
163 {
164    return a + b;
165
166
167 int TestInline(int argc, char *argv[])
168 {
169
170    // just to know, on every proc
171    std::cout << "Size of short int " << sizeof(short int) << std::endl;
172    std::cout << "Size of int  "      << sizeof(int)       << std::endl;
173    std::cout << "Size of long "      << sizeof(long)      << std::endl;
174    std::cout << "Size of float"      << sizeof(float)     << std::endl;
175    std::cout << "Size of double"     << sizeof(double)    << std::endl;
176    std::cout << "Size of int* "      << sizeof(int*)      << std::endl;
177    std::cout <<  "-----------------" << std::endl;
178    unsigned int nbLoop; 
179    unsigned int i;
180       
181    if (argc > 1)
182       nbLoop = atoi(argv[1]);
183    else
184       nbLoop = 10000000;
185
186    //clock_t r1, r2;
187    struct tms tms1, tms2;
188    
189    double a = 1, b = 2;
190    
191    uint8_t  x8 =1, y8 =2;    
192    uint16_t x16=1, y16=2;    
193    uint32_t x32=1, y32=2;    
194    float  fx =1.0f, fy=1.0f;
195    double dx =1.0 , dy=1.0;
196  // ----------------------------------------
197  
198    std::cout << "Direct "<< std::endl;
199    //r1 = times(&tms1);
200    times(&tms1);   
201    for(i = 0 ; i< nbLoop ; i++)
202    {
203       double tmp;
204       tmp=a;
205       a=b;
206       b=tmp;
207    }
208    //r2 = times(&tms2);
209    times(&tms2);   
210     std::cout 
211         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
212         << std::endl;
213    
214  // ----------------------------------------
215  
216    std::cout << "Use a macro "<< std::endl;
217    //r1 = times(&tms1);
218    times(&tms1);   
219    for(i = 0 ; i< nbLoop ; i++)
220    {
221       mswap (a,b);  
222    }
223    //r2 = times(&tms2);
224    times(&tms2);   
225     std::cout 
226         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
227         << std::endl;
228    
229  // ----------------------------------------
230  
231    std::cout << "Use reference function" << std::endl;
232    //r1 = times(&tms1);
233    times(&tms1);   
234     for(i = 0 ; i< nbLoop ; i++)
235    {
236       frswap (a,b);  
237    }
238    //r2 = times(&tms2);
239    times(&tms2);   
240    std::cout 
241         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
242         << std::endl; 
243    
244  // ----------------------------------------
245   
246    std::cout << "Use pointer function" << std::endl;
247    //r1 = times(&tms1);
248    times(&tms1);   
249     for(i = 0 ; i< nbLoop ; i++)
250    {
251       fpswap (&a, &b);  
252    }
253    //r2 = times(&tms2);
254    times(&tms2);   
255    std::cout 
256         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
257         << std::endl;  
258    
259  // ----------------------------------------
260  
261    std::cout << "Use inline, main-defined reference function" << std::endl;
262    //r1 = times(&tms1);
263    times(&tms1);   
264     for(i = 0 ; i< nbLoop ; i++)
265    {
266       ifrswap (a, b);  
267    }
268    //r2 = times(&tms2);
269    times(&tms2);   
270    std::cout 
271         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
272         << std::endl;    
273    
274  // ----------------------------------------
275  
276    std::cout << "Use inline, main-defined pointer function" << std::endl;
277    //r1 = times(&tms1);
278    times(&tms1);   
279     for(i = 0 ; i< nbLoop ; i++)
280    {
281       ifpswap (&a, &b);  
282    }
283    //r2 = times(&tms2);
284    times(&tms2);   
285    std::cout 
286         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
287         << std::endl;
288
289  // ----------------------------------------
290   
291 //To check the 2 following cases, we just put the two 'static' functions
292 //hifpswap and  hNoifpswap in gdcmUtil.h
293     
294    std::cout << "Use inline, .h defined, WITH inline keyword pointer method"
295              << std::endl;
296    //r1 = times(&tms1);
297    gdcm::Util util;
298    times(&tms1);   
299     for(i = 0 ; i< nbLoop ; i++)
300    {
301       util.hifpswap (&a, &b);
302    }
303    //r2 = times(&tms2);
304    times(&tms2);   
305    std::cout 
306         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
307         << std::endl;  
308
309    
310  // ----------------------------------------
311
312    std::cout << "Use inline, .h defined, NO inline keyword pointer method"
313              << std::endl;
314    //r1 = times(&tms1);
315    times(&tms1);   
316     for(i = 0 ; i< nbLoop ; i++)
317    {
318       util.hNoifpswap (&a, &b);
319    }
320    //r2 = times(&tms2);
321    times(&tms2);   
322    std::cout 
323         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
324         << std::endl; 
325
326  // ----------------------------------------
327
328    std::cout << "Use , .h defined, NO inline keyword pointer method"
329              << std::endl;
330    //r1 = times(&tms1);
331    times(&tms1);   
332     for(i = 0 ; i< nbLoop ; i++)
333    {
334       util.hfpswap (&a, &b);
335    }
336    //r2 = times(&tms2);
337    times(&tms2);   
338    std::cout 
339         << (long) ((tms2.tms_utime)  - (tms1.tms_utime))
340         <<std::endl;
341  
342  // ----------------------------------------
343
344    std::cout << "Use inline, .h defined, WITH inline keyword pointer static method"
345              << std::endl;
346    //r1 = times(&tms1);
347    times(&tms1);   
348     for(i = 0 ; i< nbLoop ; i++)
349    {
350       gdcm::Util::sthifpswap (&a, &b);
351    }
352    //r2 = times(&tms2);
353    times(&tms2);   
354    std::cout 
355         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
356         << std::endl;  
357
358    
359  // ----------------------------------------
360
361    std::cout << "Use inline, .h defined, NO inline keyword pointer static method"
362              << std::endl;
363    //r1 = times(&tms1);
364    times(&tms1);   
365     for(i = 0 ; i< nbLoop ; i++)
366    {
367       gdcm::Util::sthNoifpswap (&a, &b);
368    }
369    //r2 = times(&tms2);
370    times(&tms2);   
371    std::cout 
372         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
373         << std::endl; 
374
375
376  // ----------------------------------------
377  
378    std::cout << "Pass uint_8 param directly"
379              << std::endl;
380    //r1 = times(&tms1);
381    times(&tms1);   
382     for(i = 0 ; i< nbLoop ; i++)
383    {
384       passDirect8 (x8, y8);  
385    }
386    //r2 = times(&tms2);
387    times(&tms2);   
388    std::cout 
389         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
390         << std::endl; 
391
392  // ----------------------------------------
393  
394    std::cout << "Pass uint_8 param as ref"
395              << std::endl;
396    //r1 = times(&tms1);
397    times(&tms1);   
398     for(i = 0 ; i< nbLoop ; i++)
399    {
400       passRef8 (x8, y8);  
401    }
402    //r2 = times(&tms2);
403    times(&tms2);   
404    std::cout 
405         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
406         << std::endl; 
407
408  // ----------------------------------------
409  
410    std::cout << "Pass uint_8 param as ptr"
411              << std::endl;
412    //r1 = times(&tms1);
413    times(&tms1);   
414     for(i = 0 ; i< nbLoop ; i++)
415    {
416       passPtr8 (&x8, &y8);  
417    }
418    //r2 = times(&tms2);
419    times(&tms2);   
420    std::cout 
421         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
422         << std::endl; 
423
424  // ----------------------------------------
425  
426    std::cout << "Pass uint_16 param directly"
427              << std::endl;
428    //r1 = times(&tms1);
429    times(&tms1);   
430     for(i = 0 ; i< nbLoop ; i++)
431    {
432       passDirect16 (x16, y16);  
433    }
434    //r2 = times(&tms2);
435    times(&tms2);   
436    std::cout 
437         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
438         << std::endl; 
439
440  // ----------------------------------------
441  
442    std::cout << "Pass uint_16 param as ref"
443              << std::endl;
444    //r1 = times(&tms1);
445    times(&tms1);   
446     for(i = 0 ; i< nbLoop ; i++)
447    {
448       passRef16 (x16, y16);  
449    }
450    //r2 = times(&tms2);
451    times(&tms2);   
452    std::cout 
453         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
454         << std::endl; 
455
456  // ----------------------------------------
457  
458    std::cout << "Pass uint_16 param as ptr"
459              << std::endl;
460    //r1 = times(&tms1);
461    times(&tms1);   
462     for(i = 0 ; i< nbLoop ; i++)
463    {
464       passPtr16 (&x16, &y16);  
465    }
466    //r2 = times(&tms2);
467    times(&tms2);   
468    std::cout 
469         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
470         << std::endl; 
471
472
473
474  // ----------------------------------------
475
476    std::cout << "Pass uint_32 param directly"
477              << std::endl;
478    //r1 = times(&tms1);
479    times(&tms1);   
480     for(i = 0 ; i< nbLoop ; i++)
481    {
482       passDirect32 (x32, y32);  
483    }
484    //r2 = times(&tms2);
485    times(&tms2);   
486    std::cout 
487         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
488         << std::endl; 
489
490  // ----------------------------------------
491  
492    std::cout << "Pass uint32_t param as ref"
493              << std::endl;
494    //r1 = times(&tms1);
495    times(&tms1);   
496     for(i = 0 ; i< nbLoop ; i++)
497    {
498       passRef32 (x32, y32 );  
499    }
500    //r2 = times(&tms2);
501    times(&tms2);   
502    std::cout 
503         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
504         << std::endl; 
505
506  // ----------------------------------------
507  
508    std::cout << "Pass uint_32 param as ptr"
509              << std::endl;
510    //r1 = times(&tms1);
511    times(&tms1);   
512     for(i = 0 ; i< nbLoop ; i++)
513    {
514       passPtr32 (&x32, &y32);  
515    }
516    //r2 = times(&tms2);
517    times(&tms2);   
518    std::cout 
519         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
520         << std::endl; 
521
522  // ----------------------------------------
523  
524    std::cout << "Pass float param directly"
525              << std::endl;
526    //r1 = times(&tms1);
527    times(&tms1);   
528     for(i = 0 ; i< nbLoop ; i++)
529    {
530       passDirectFloat (fx, fy);  
531    }
532    //r2 = times(&tms2);
533    times(&tms2);   
534
535    std::cout 
536         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
537         << std::endl; 
538
539  // ----------------------------------------
540  
541    std::cout << "Pass float param as ref"
542              << std::endl;
543    //r1 = times(&tms1);
544    times(&tms1);   
545     for(i = 0 ; i< nbLoop ; i++)
546    {
547       passRefFloat (fx, fy);  
548    }
549    //r2 = times(&tms2);
550    times(&tms2);   
551
552    std::cout 
553         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
554         << std::endl; 
555
556  // ----------------------------------------
557  
558    std::cout << "Pass float param as ptr"
559              << std::endl;
560    //r1 = times(&tms1);
561    times(&tms1);   
562     for(i = 0 ; i< nbLoop ; i++)
563    {
564       passPtrFloat (&fx, &fy);  
565    }
566    //r2 = times(&tms2);
567    times(&tms2);   
568
569    std::cout 
570         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
571         << std::endl; 
572
573  // ----------------------------------------
574  
575    std::cout << "Pass double param directly"
576              << std::endl;
577    //r1 = times(&tms1);
578    times(&tms1);   
579     for(i = 0 ; i< nbLoop ; i++)
580    {
581       passDirectDouble (dx, dy);  
582    }
583    //r2 = times(&tms2);
584    times(&tms2);   
585
586    std::cout 
587         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
588         << std::endl; 
589
590  // ----------------------------------------
591  
592    std::cout << "Pass double param as ref"
593              << std::endl;
594    //r1 = times(&tms1);
595    times(&tms1);   
596     for(i = 0 ; i< nbLoop ; i++)
597    {
598       passRefDouble (dx, dy);  
599    }
600    //r2 = times(&tms2);
601    times(&tms2);   
602
603    std::cout 
604         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
605         << std::endl; 
606
607  // ----------------------------------------
608  
609    std::cout << "Pass double param as ptr"
610              << std::endl;
611    //r1 = times(&tms1);
612    times(&tms1);   
613     for(i = 0 ; i< nbLoop ; i++)
614    {
615       passPtrDouble (&dx, &dy);  
616    }
617    //r2 = times(&tms2);
618    times(&tms2);   
619
620    std::cout 
621         << (long) ((tms2.tms_utime)  - (tms1.tms_utime)) 
622         << std::endl; 
623
624    return 0;
625 }