Speculative: Rust for base system components

Alan Somers asomers at freebsd.org
Sun Jan 6 16:01:28 UTC 2019


On Tue, Jan 1, 2019 at 12:00 AM Brian Neal <brian at aceshardware.com> wrote:
>
> It was a debug build with no optimization for either compiler. But we
> can easily run a variety of settings for comparison:
>
> Compiler              Flags                 Inst. Count Build Time
> ======================================================================
> clang 7.0.0           none                           33 296ms
>                        -O3                            23 341ms
> rustc 1.31.0          none                          110 606ms
>                        -C opt-level=3                 67 643ms
> gcc 8.2               none                           37 211ms
>                        -O2                            24 249ms
>                        -O3                          119* 206ms
>
> * With -O3, gcc unrolled and vectorized the loop. The other compilers
> did not emit vectorized code at any of the standard optimization levels.
>
> So, essentially, double the build time and ~3 times the code for the
> same logic.

I get different results on Godbolt.  I don't know exactly what your
program was, but I tried to recreate it from your description.  I
wrote it in two ways.  With opt-level=s, I got 13 instructions for one
version, and 16 for the other.  With opt-level=3, I got vectorized
code for both.  Here's my code:

pub fn oddcount(num: i32) -> i32 {
    (0..num).map(|i| {
        if i % 2 > 0 {
            i
        } else {
            0
        }
    }).sum()
}

pub fn oddcount2(num: i32) -> i32 {
    let mut sum = 0;
    for i in 0..num {
        if i % 2 > 0 {
            sum += i;
        }
    }
    sum
}

-Alan


More information about the freebsd-hackers mailing list