Hi,
I'm experiencing a rather unusual situation that isn't making sense to me. I'm not as familiar with linux's shared library mechanisms as I perhaps should be. This code was stripped down from a much larger project, so it'll look a little strange, but it easily demonstrates the questions I'll ask at the bottom on this:
Here is the script I am using to compile this test:
Here is my test library code - test.c:Code:#!/bin/sh clear export DEF="-D_USE_LARGEFILE64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE" export SRC="-D_REENTRANT -D_BSD_SOURCE" export OPT="-w -O3 -march=i686 -mtune=i686 -ffast-math -funroll-loops -fno-exceptions -minline-all-stringops" gcc -c -o test.o test.c $DEF $SRC $OPT ar rcs libtest.a test.o gcc -fPIC -c -o test.o test.c $DEF $SRC $OPT gcc -shared -Wl,-soname,libtest.so.1 -o libtest.so.1.0.0 test.o -lc ldconfig -n . export DEF="-D_USE_LARGEFILE64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE" export SRC="-D_REENTRANT -D_BSD_SOURCE" export SHLIB="-ltest -L." export OPT="-w -O3 -march=i686 -mtune=i686 -ffast-math -funroll-loops -fno-exceptions -minline-all-stringops" gcc -o StrICmpTest StrICmpTest.c $DEF $SRC $SHLIB $OPT
The main program - StrICmpTest.c:Code:#include <stdio.h> #define C unsigned char #define D double #define F float #define I int #define L long #define UL2 unsigned long long #define L2 long long #define LD long double #define S struct #define SC signed char #define SI signed int #define STR string #define U union #define UC unsigned char #define UI unsigned int #define UL unsigned long #define US unsigned short #define V void #define dStrIsLower(c) (c>='a'&&c<='z') #define dStrIsUpper(c) (c>='A'&&c<='Z') #define dStrToLower(c) (dStrIsUpper(c)?c-'a'-'A':c) #define dStrToUpper(c) (dStrIsLower(c)?c+'a'-'A':c) I stricmp7(C *s1, C *s2) { UL i, l1, l2, m; C d1, d2; l1=strlen(s1); l2=strlen(s2); m=l1<l2?l1:l2; if(l1!=l2) return(l1-l2); for(i=0;i<m;i++) { d1=dStrToLower(s1[i]); d2=dStrToLower(s2[i]); if(d1!=d2) return(d1-d2); } return(0); }
Now for the output:Code:#include <stdio.h> #include <unistd.h> #include <time.h> #include <sys/time.h> #define MEGABYTE 1048576 typedef unsigned char string[256]; #define C unsigned char #define D double #define F float #define I int #define L long #define UL2 unsigned long long #define L2 long long #define LD long double #define S struct #define SC signed char #define SI signed int #define STR string #define U union #define UC unsigned char #define UI unsigned int #define UL unsigned long #define US unsigned short #define V void #define dStrIsLower(c) (c>='a'&&c<='z') #define dStrIsUpper(c) (c>='A'&&c<='Z') #define dStrToLower(c) (dStrIsUpper(c)?c-'a'-'A':c) #define dStrToUpper(c) (dStrIsLower(c)?c+'a'-'A':c) #define NFACTOR 3072 #define NTIMES (NFACTOR*NFACTOR) I stricmp1(C *s1, C *s2) { UL i, l1, l2, m; C d1, d2; l1=strlen(s1); l2=strlen(s2); m=l1<l2?l1:l2; if(l1!=l2) return(l1-l2); for(i=0;i<m;i++) { d1=dStrToLower(s1[i]); d2=dStrToLower(s2[i]); if(d1!=d2) return(d1-d2); } return(0); } I main(I argc, C *argv[]) { clock_t st, et; STR buffer; I i, l1; strcpy(buffer,"Hello World ABCDEFGHIJKLMNOPQRSTUVWXYZ"); st=clock(); for(i=0;i<NTIMES;i++) { l1=strcasecmp(buffer,buffer); l1=strcasecmp(buffer,"Hello World ABCDEFGHIJKLMNOPQRSTUVWXYZ Kitty"); } et=clock(); printf("strcasecmp, %f\n",((D)(et-st))/((D)CLOCKS_PER_SEC)); st=clock(); for(i=0;i<NTIMES;i++) { l1=stricmp1(buffer,buffer); l1=stricmp1(buffer,"Hello World ABCDEFGHIJKLMNOPQRSTUVWXYZ Kitty"); } et=clock(); printf("stricmp1, %f\n",((D)(et-st))/((D)CLOCKS_PER_SEC)); st=clock(); for(i=0;i<NTIMES;i++) { l1=stricmp7(buffer,buffer); l1=stricmp7(buffer,"Hello World ABCDEFGHIJKLMNOPQRSTUVWXYZ Kitty"); } et=clock(); printf("stricmp7, %f\n",((D)(et-st))/((D)CLOCKS_PER_SEC)); return(0); }
As you can see, the program runs perfectly. I'm using a full and clean install of Slackware 13.1, gcc version of 4.4.4Code:./MKTlib && ./StrICmpTest strcasecmp, 0.000000 stricmp1, 0.020000 stricmp7, 1.910000
Now for the questions:
1. Why does stricmp7 take so much longer to run then stricmp1 when the code of both is identical?
2. Why does libtest NOT show up in the above?Code:ldd StrICmpTest linux-gate.so.1 => (0xb7794000) libc.so.6 => /lib/libc.so.6 (0xb761b000) /lib/ld-linux.so.2 (0xb7795000)
3. What can be done to fix this problem?
Thank you in advance.




Reply With Quote