[Beowulf] C vs C++ challenge (java version)

dc dc at hemeris.com
Thu Jan 29 09:55:55 EST 2004


Jakob Oestergaard wrote:

> Let me throw out a challenge:
>
> "Write a program in C that reads from standard input until EOF, and
>  prints the number of distinct words found in that input"
>
<snip>
>
> I use an RB-tree to store the words I find, and print the number of
> elements in the final tree.
>
> A comparable C solution shouldn't be more than a few thousand lines ;)
>
> Oh, right, I cheated and used STL.  Well, STL is a big part of why C++
> is really handy, but go right ahead and use "glib" or whatever.
>
> I still guarantee you two things:
> 1) Your code will be longer
> 2) Your program will be slower
>
> As always, I love to be proven wrong  ;)


Here is another try at that, this time in Java.

C++ code compiled with g++ 3.3 (-O3), times are 'real time' reported by the
bash time function, the client and server columns correspond to java runs using
the -client and -server options respectively.
Java compiler and VM are the hotspot 1.4.


file            size        C++         j client    j server
wrnpc10.txt     3282452     0m2.746s    0m1.941s    0m1.643s
shaks12.txt     5582655     0m4.476s    0m3.321s    0m2.842s
big.txt         39389424    0m29.120s   0m13.972s   0m12.776s
vbig.txt        196947120   2m23.882s   1m5.707s    1m2.350s

Oh right, I cheated and used Java standard collections ;-)

Seriously tough, Java is not as slow as some seem to believe. 

And optimizing the code at run-time (hotspot, code morphing,...) has the
advantage that the optimizer has access to potentially useful information, both
about the code itself and about the executing environment.

--------------------------------------------------------------
import java.util.*;
import java.util.regex.Pattern;
import java.io.*;


public class wordcount {

    public static void main (String args[]) {
        HashSet hs = new HashSet();
        try {
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            
            String s, words[];
            Pattern p = Pattern.compile("\\s");
            
            while ((s = input.readLine()) != null) {
                words = p.split(s);
                for (int i = 0; i < words.length; i++)
                    hs.add(words[i]);
            }
            hs.remove("");
        }
        catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("Words: " + hs.size());
    }
}

_______________________________________________
Beowulf mailing list, Beowulf at beowulf.org
To change your subscription (digest mode or unsubscribe) visit http://www.beowulf.org/mailman/listinfo/beowulf



More information about the Beowulf mailing list