X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=Testing%2FTestInline.cxx;h=e7fcfeeb1513868edbcda3875a79fdb158544bbd;hb=9be2f6ae96caf2a9a4619ea3e4f8ceb762f2c035;hp=774830a3ec445199d45b3421e6e35867a8e2c372;hpb=fc4772b3f243c1b435c18c78c2d1965cfdf57114;p=gdcm.git diff --git a/Testing/TestInline.cxx b/Testing/TestInline.cxx index 774830a3..e7fcfeeb 100755 --- a/Testing/TestInline.cxx +++ b/Testing/TestInline.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestInline.cxx,v $ Language: C++ - Date: $Date: 2005/11/30 11:40:26 $ - Version: $Revision: 1.11 $ + Date: $Date: 2007/09/28 07:35:49 $ + Version: $Revision: 1.15 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -20,7 +20,7 @@ // - with a macro : this is the quicker (any doubt ?) // - with a function, passing the params by pointer // - with a function, passing the params by reference (exactly same time) -// - with an inline function described in the main() +// - with an inline function described in the .cxx // absolutely NO effect ?!? // - with a function, described in the .h // absolutely NO effect ?!? @@ -31,7 +31,20 @@ #include "gdcmUtil.h" +#ifdef _MSC_VER +#include +#define GET_TIME(a) a=clock() +#define HOW_LONG(b,a) \ + std::cout << (double) (b-a) << std::endl +#else #include +#define GET_TIME(a) times(&a) +#define HOW_LONG(b,a) \ + std::cout \ + << (long) ((b.tms_utime) - (a.tms_utime)) \ + << std::endl +#endif + #include void frswap (double &a, double &b); @@ -63,13 +76,14 @@ mswap(a, b) \ b = tmp; \ } +// ============= no inline + void frswap(double &a, double &b) { double tmp; tmp = a; a = b; b = tmp; - } void fpswap(double *a, double *b) @@ -78,9 +92,10 @@ void fpswap(double *a, double *b) tmp = *a; *a = *b; *b = tmp; - } +// ============= inline + inline void ifpswap(double *a, double *b) { double tmp; @@ -167,459 +182,397 @@ double passDirectDouble(double a, double b) int TestInline(int argc, char *argv[]) { +#ifdef _MSC_VER + clock_t tms1, tms2; +#else + struct tms tms1, tms2; +#endif + +// ==================================================================== + + std::cout << std::endl << std::endl + << "Just to be sure : sizes of native types" << std::endl + << "=======================================" + << std::endl << std::endl; // just to know, on every proc + std::cout << "Size of char " << sizeof(char) << std::endl; std::cout << "Size of short int " << sizeof(short int) << std::endl; - std::cout << "Size of int " << sizeof(int) << std::endl; - std::cout << "Size of long " << sizeof(long) << std::endl; - std::cout << "Size of float" << sizeof(float) << std::endl; - std::cout << "Size of double" << sizeof(double) << std::endl; - std::cout << "Size of int* " << sizeof(int*) << std::endl; - std::cout << "-----------------" << std::endl; + std::cout << "Size of int " << sizeof(int) << std::endl; + std::cout << "Size of long " << sizeof(long) << std::endl; + std::cout << "Size of float " << sizeof(float) << std::endl; + std::cout << "Size of double " << sizeof(double) << std::endl; + std::cout << std::endl; + std::cout << "Size of char* " << sizeof(char*) << std::endl; + std::cout << "Size of short int*" << sizeof(short int*)<< std::endl; + std::cout << "Size of int* " << sizeof(int*) << std::endl; + std::cout << "Size of double* " << sizeof(double*) << std::endl; + std::cout << "-----------------" << std::endl; + + // ==================================================================== + unsigned int nbLoop; unsigned int i; if (argc > 1) nbLoop = atoi(argv[1]); else - nbLoop = 10000000; + nbLoop = 100000000; - //clock_t r1, r2; - struct tms tms1, tms2; - - double a = 1, b = 2; - uint8_t x8 =1, y8 =2; uint16_t x16=1, y16=2; uint32_t x32=1, y32=2; float fx =1.0f, fy=1.0f; double dx =1.0 , dy=1.0; - // ---------------------------------------- + double a = 1, b = 2; + + // ==================================================================== - std::cout << "Direct "<< std::endl; - //r1 = times(&tms1); - times(&tms1); + std::cout << std::endl << std::endl + << "Check different ways of passing scalars to a function "<< nbLoop << " times" << std::endl + << "=====================================================" + << std::endl << std::endl; + + std::cout << "Pass uint_8 param directly" + << std::endl; + + GET_TIME(tms1); for(i = 0 ; i< nbLoop ; i++) { - double tmp; - tmp=a; - a=b; - b=tmp; + passDirect8 (x8, y8); } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - << std::endl; - + GET_TIME(tms2); + HOW_LONG(tms2,tms1); + // ---------------------------------------- - std::cout << "Use a macro "<< std::endl; - //r1 = times(&tms1); - times(&tms1); + std::cout << "Pass uint_8 param as ref" + << std::endl; + + GET_TIME(tms1); for(i = 0 ; i< nbLoop ; i++) { - mswap (a,b); + passRef8 (x8, y8); } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - << std::endl; - + GET_TIME(tms2); + HOW_LONG(tms2,tms1); + // ---------------------------------------- - std::cout << "Use reference function" << std::endl; - //r1 = times(&tms1); - times(&tms1); - for(i = 0 ; i< nbLoop ; i++) + std::cout << "Pass uint_8 param as ptr" + << std::endl; + + GET_TIME(tms1); + for(i = 0 ; i< nbLoop ; i++) { - frswap (a,b); + passPtr8 (&x8, &y8); } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - << std::endl; - + GET_TIME(tms2); + HOW_LONG(tms2,tms1); + // ---------------------------------------- - - std::cout << "Use pointer function" << std::endl; - //r1 = times(&tms1); - times(&tms1); - for(i = 0 ; i< nbLoop ; i++) + std::cout << std::endl; + std::cout << "Pass uint_16 param directly" + << std::endl; + + GET_TIME(tms1); + for(i = 0 ; i< nbLoop ; i++) { - fpswap (&a, &b); + passDirect16 (x16, y16); } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - << std::endl; - + GET_TIME(tms2); + HOW_LONG(tms2,tms1); + // ---------------------------------------- - std::cout << "Use inline, main-defined reference function" << std::endl; - //r1 = times(&tms1); - times(&tms1); - for(i = 0 ; i< nbLoop ; i++) + std::cout << "Pass uint_16 param as ref" + << std::endl; + + GET_TIME(tms1); + for(i = 0 ; i< nbLoop ; i++) { - ifrswap (a, b); + passRef16 (x16, y16); } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - << std::endl; - + GET_TIME(tms2); + HOW_LONG(tms2,tms1); + // ---------------------------------------- - std::cout << "Use inline, main-defined pointer function" << std::endl; - //r1 = times(&tms1); - times(&tms1); - for(i = 0 ; i< nbLoop ; i++) + std::cout << "Pass uint_16 param as ptr" + << std::endl; + + GET_TIME(tms1); + for(i = 0 ; i< nbLoop ; i++) { - ifpswap (&a, &b); + passPtr16 (&x16, &y16); } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - << std::endl; + GET_TIME(tms2); + HOW_LONG(tms2,tms1); // ---------------------------------------- - -//To check the 2 following cases, we just put the two 'static' functions -//hifpswap and hNoifpswap in gdcmUtil.h - - std::cout << "Use inline, .h defined, WITH inline keyword pointer method" + std::cout << std::endl; + std::cout << "Pass uint_32 param directly" << std::endl; - //r1 = times(&tms1); - gdcm::Util util; - times(&tms1); - for(i = 0 ; i< nbLoop ; i++) + + GET_TIME(tms1); + for(i = 0 ; i< nbLoop ; i++) { - util.hifpswap (&a, &b); + passDirect32 (x32, y32); } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - << std::endl; + GET_TIME(tms2); + HOW_LONG(tms2,tms1); - // ---------------------------------------- - - std::cout << "Use inline, .h defined, NO inline keyword pointer method" + + std::cout << "Pass uint32_t param as ref" << std::endl; - //r1 = times(&tms1); - times(&tms1); - for(i = 0 ; i< nbLoop ; i++) + + GET_TIME(tms1); + for(i = 0 ; i< nbLoop ; i++) { - util.hNoifpswap (&a, &b); + passRef32 (x32, y32 ); } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - << std::endl; + GET_TIME(tms2); + HOW_LONG(tms2,tms1); // ---------------------------------------- - - std::cout << "Use , .h defined, NO inline keyword pointer method" - << std::endl; - //r1 = times(&tms1); - times(&tms1); - for(i = 0 ; i< nbLoop ; i++) - { - util.hfpswap (&a, &b); - } - //r2 = times(&tms2); - times(&tms2); - std::cout - << (long) ((tms2.tms_utime) - (tms1.tms_utime)) - <