Re: C Containers Library vs STL
On 08/ 4/11 12:34 PM, Ian Collins wrote:
On 08/ 4/11 11:30 AM, jacob navia wrote:
Thanks to you and to Ian.
More important than the line number, is the behavior of the STL
container in case of errors, for instance when there is no more
memory. Does it throw an exception? In that case it would be
fully equivalent of the C code that tests for the return code
being less than zero.
In my Macintosh I compile using gcc the code to
-rw-r--r-- 1 jacobnavia staff 6548 3 ao? 23:23 unique.o // CPP
-rw-r--r-- 1 jacobnavia staff 1348 3 ao? 23:23 unique1.o // C
both are compiled using -Os (size optimization) using the same commpiler
~/Documents/stl $ gcc -v
Using built-in specs.
Target: i686-apple-darwin10
gcc version 4.2.1 (Apple Inc. build 5664)
I think that the codes are really equivalent, and I am pleased that
the CCL doesn't come all that bad. What performance is concerned
I doubt that there would be any differences since the programs are
bound by I/O anyway
Um, I tried both versions with the same optimisations (cc/CC -fast) on
my Solaris box and the run times (over several runs) for a 350K line
file with 214K unique lines were:
C: 5.027s
CC: 1.835s
A quick profile shows the C version spends most of its time in strcmp
while the C++ version spends most of its time in I/O. So I guess the
performance difference is mainly between the r-b tree used by std::set
and your hashing algorithm.
So if I change your code to use std::set in order to remove the
difference in I/O libraries:
#include <set>
#include <string>
#include <stdio.h>
int main(int argc,char *argv[])
{
FILE* f = fopen(argv[1],"r");
if (f == NULL)
return -1;
std::set<std::string> unique;
char buf[8192];
int i = 0;
while (fgets(buf,sizeof(buf),f)) {
if( unique.insert(buf).second ) {
printf("[%3d] %s",i,buf);
}
i++;
}
fclose(f);
}
the run time drops to 0.66 seconds.
--
Ian Collins