Are you compiling with optimisations? (Pass the -O flag to rustc.) For me, the Go and the optimised Rust are pretty similar, with the Go a few percent faster on a 1.3GB MP4 file, and the two languages indistinguishable on a 30MB XML file.

Also, Rust prefers iterators to manual indexing since it avoids unnecessary bounds checks, that is, replace the inner loop with:

    for b in buf.slice_to(n).iter() {
        if *b == b'\n' {
            lines += 1;
        }
    }

However, in this case, LLVM optimises that to a large chunk of SSE instructions https://gist.github.com/huonw/37cdd3dea3518abdb1c4 which seem to be reading only 2 bytes per memory access and only 4 bytes per tick of the loop (i.e. it's rather unoptimal); this means that the iterator version is only minutely faster than the naive range(0, n) loop in this case.

I also wrote a 16-bytes-at-a-time SSE byte counter (it's unlikely to be optimal), which is about 20% faster than the Go on that same 1.3GB MP4 file and 3-4 times faster on the XML, so everyone has room for improvement. :) Code: https://gist.github.com/huonw/b6bfe4ad3623b6c37717


Btw, the Go is significantly slower when the file contains a lot of newlines, e.g. this file is 75% \n's

    yes 'foo' | head -100000000 > newlines.txt

The Rust built with -O takes ~0.4s for me, and the Go takes 2.6s. The crossover point on my computer for very regular files like that is about 1 \n in every 30 bytes.


Huon



On 15/09/14 16:34, Petr Novotnik wrote:
Hello folks,

recently I've been playing around with Rust and I'm really impressed. I like the language a lot!

While writing a program to count the number of lines in a file, I realized it ran twice as slow as an older program I wrote in Go some time ago. After more experiments, I've figured out that Go's speed boost comes from an optimized function in its standard library utilizing SSE instructions, in particular the function bytes.IndexByte (http://golang.org/pkg/bytes/#IndexByte).

I was wondering whether Rust would ever provide such optimized implementations as well as part of its standard library or whether it's up to developers to write their own versions of such functions.

Maybe I just missed something, so I'm attaching the rust program:

  http://pastebin.com/NfFgMNGe

And for the sake of completeness, here's the Go version I compared with:

  http://pastebin.com/4tiLsRpu

Pete.
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to