Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: rust-lang/rust
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: master
Choose a base ref
...
head repository: Manishearth/rust
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: rollup-nznpyzv
Choose a head ref
Checking mergeability… Don’t worry, you can still create the pull request.
  • 19 commits
  • 47 files changed
  • 2 contributors

Commits on Jul 15, 2020

  1. Rearrange the pipeline of pow to gain efficiency

    The check of the `exp` parameter seems useless if we execute the while-loop more than once.
    The original implementation of `pow` function using one more comparison if the `exp==0` and may break the pipeline of the cpu, which may generate a slower code.
    The performance gap between the old and the new implementation may be small, but IMO, at least the newer one looks more beautiful.
    
    ---
    
    bench prog:
    ```
    #![feature(test)]
    extern crate test;
    #[macro_export]macro_rules! timing{
    ($a:expr)=>{let time=std::time::Instant::now();{$a;}print!("{:?} ",time.elapsed())};
    ($a:expr,$b:literal)=>{let time=std::time::Instant::now();let mut a=0;for _ in 0..$b{a^=$a;}print!("{:?} {} ",time.elapsed(),a)}
    }
    #[inline]
    pub fn pow_rust(x:i64, mut exp: u32) -> i64 {
        let mut base = x;
        let mut acc = 1;
        while exp > 1 {
            if (exp & 1) == 1 {
                acc = acc * base;
            }
            exp /= 2;
            base = base * base;
        }
        if exp == 1 {
            acc = acc * base;
        }
        acc
    }
    #[inline]
    pub fn pow_new(x:i64, mut exp: u32) -> i64 {
        if exp==0{
            1
        }else{
            let mut base = x;
            let mut acc = 1;
            while exp > 1 {
                if (exp & 1) == 1 {
                    acc = acc * base;
                }
                exp >>= 1;
                base = base * base;
            }
            acc * base
        }
    }
    
    fn main(){
    let a=2i64;
    let b=1_u32;
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    }
    ```
    bench in my laptop:
    ```
    neutron@Neutron:/me/rust$ rc commit.rs
    rustc commit.rs  && ./commit
    
    3.978419716s 0 4.079765171s 0 3.964630622s 0 
    3.997127013s 0 4.260304804s 0 3.997638211s 0 
    3.963195544s 0 4.11657718s 0 4.176054164s 0 
    3.830128579s 0 3.980396122s 0 3.937258567s 0 
    3.986055948s 0 4.127804162s 0 4.018943411s 0 
    4.185568857s 0 4.217512517s 0 3.98313603s 0 
    3.863018225s 0 4.030447988s 0 3.694878237s 0 
    4.206987927s 0 4.137608047s 0 4.115564664s 0 
    neutron@Neutron:/me/rust$ rc commit.rs -O
    rustc commit.rs -O && ./commit
    
    162.111993ms 0 165.107125ms 0 166.26924ms 0 
    175.20479ms 0 205.062565ms 0 176.278791ms 0 
    174.408975ms 0 166.526899ms 0 201.857604ms 0 
    146.190062ms 0 168.592821ms 0 154.61411ms 0 
    199.678912ms 0 168.411598ms 0 162.129996ms 0 
    147.420765ms 0 209.759326ms 0 154.807907ms 0 
    165.507134ms 0 188.476239ms 0 157.351524ms 0 
    121.320123ms 0 126.401229ms 0 114.86428ms 0 
    ```
    Neutron3529 authored Jul 15, 2020
    Copy the full SHA
    9dee590 View commit details

Commits on Jul 16, 2020

  1. delete an unnecessary semicolon...

    Sorry for the typo.
    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    ebafab9 View commit details
  2. delete trailing whitespace

    Sorry, too..
    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    020c0b5 View commit details
  3. Sorry for the missing...

    I checked all the implementations, and finally found that there is one function that does not check whether `exp == 0`
    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    8f58ce4 View commit details
  4. add extra tests

    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    f3d476b View commit details
  5. add extra tests.

    finished adding the extra tests to prevent further typo
    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    8795845 View commit details
  6. Copy the full SHA
    319db30 View commit details
  7. add whitespace.

    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    e2f3e3c View commit details
  8. add whitespace

    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    d5d7ca2 View commit details
  9. add whitespace

    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    7599e01 View commit details
  10. delete extra line

    Neutron3529 authored Jul 16, 2020
    Copy the full SHA
    364cacb View commit details

Commits on Jul 22, 2020

  1. Rollup merge of #73868 - ecstatic-morse:fix-stable-version, r=jonas-s…

    …chievink
    
    Advertise correct stable version for const control flow
    
    #72437 was opened before the 1.45 release but merged afterwards. These will be stable in 1.46.
    Manishearth authored Jul 22, 2020
    Copy the full SHA
    298a38b View commit details
  2. Rollup merge of #74367 - Neutron3529:patch-1, r=nagisa

    Rearrange the pipeline of `pow` to gain efficiency
    
    The check of the `exp` parameter seems useless if we execute the while-loop more than once.
    The original implementation of `pow` function using one more comparison if the `exp==0` and may break the pipeline of the cpu, which may generate a slower code.
    The performance gap between the old and the new implementation may be small, but IMO, at least the newer one looks more beautiful.
    
    ---
    
    bench prog:
    ```
    #![feature(test)]
    extern crate test;
    #[macro_export]macro_rules! timing{
    ($a:expr)=>{let time=std::time::Instant::now();{$a;}print!("{:?} ",time.elapsed())};
    ($a:expr,$b:literal)=>{let time=std::time::Instant::now();let mut a=0;for _ in 0..$b{a^=$a;}print!("{:?} {} ",time.elapsed(),a)}
    }
    #[inline]
    pub fn pow_rust(x:i64, mut exp: u32) -> i64 {
        let mut base = x;
        let mut acc = 1;
        while exp > 1 {
            if (exp & 1) == 1 {
                acc = acc * base;
            }
            exp /= 2;
            base = base * base;
        }
        if exp == 1 {
            acc = acc * base;
        }
        acc
    }
    #[inline]
    pub fn pow_new(x:i64, mut exp: u32) -> i64 {
        if exp==0{
            1
        }else{
            let mut base = x;
            let mut acc = 1;
            while exp > 1 {
                if (exp & 1) == 1 {
                    acc = acc * base;
                }
                exp >>= 1;
                base = base * base;
            }
            acc * base
        }
    }
    
    fn main(){
    let a=2i64;
    let b=1_u32;
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    timing!(test::black_box(a).pow(test::black_box(b)),100000000);
    timing!(pow_new(test::black_box(a),test::black_box(b)),100000000);
    timing!(pow_rust(test::black_box(a),test::black_box(b)),100000000);
    println!();
    }
    ```
    bench in my laptop:
    ```
    neutron@Neutron:/me/rust$ rc commit.rs
    rustc commit.rs  && ./commit
    
    3.978419716s 0 4.079765171s 0 3.964630622s 0
    3.997127013s 0 4.260304804s 0 3.997638211s 0
    3.963195544s 0 4.11657718s 0 4.176054164s 0
    3.830128579s 0 3.980396122s 0 3.937258567s 0
    3.986055948s 0 4.127804162s 0 4.018943411s 0
    4.185568857s 0 4.217512517s 0 3.98313603s 0
    3.863018225s 0 4.030447988s 0 3.694878237s 0
    4.206987927s 0 4.137608047s 0 4.115564664s 0
    neutron@Neutron:/me/rust$ rc commit.rs -O
    rustc commit.rs -O && ./commit
    
    162.111993ms 0 165.107125ms 0 166.26924ms 0
    175.20479ms 0 205.062565ms 0 176.278791ms 0
    174.408975ms 0 166.526899ms 0 201.857604ms 0
    146.190062ms 0 168.592821ms 0 154.61411ms 0
    199.678912ms 0 168.411598ms 0 162.129996ms 0
    147.420765ms 0 209.759326ms 0 154.807907ms 0
    165.507134ms 0 188.476239ms 0 157.351524ms 0
    121.320123ms 0 126.401229ms 0 114.86428ms 0
    ```
    Manishearth authored Jul 22, 2020
    Copy the full SHA
    28daee3 View commit details
  3. Rollup merge of #74507 - lcnr:const-prop-into-op, r=oli-obk

    add `visit_operand` to const prop
    
    r? @oli-obk
    Manishearth authored Jul 22, 2020
    Copy the full SHA
    6690992 View commit details
  4. Rollup merge of #74538 - nbdd0121:issue-73976, r=lcnr

    Guard against non-monomorphized type_id intrinsic call
    
    This PR checks whether the type is sufficient monomorphized when calling type_id or type_name intrinsics. If the type is not sufficiently monomorphized, e.g. used in a pattern, the code will be rejected.
    
    Fixes #73976
    Manishearth authored Jul 22, 2020
    Copy the full SHA
    988b075 View commit details
  5. Rollup merge of #74541 - shepmaster:aarch64-apple-darwin-target, r=na…

    …gisa
    
    Add the aarch64-apple-darwin target
    
    This is a basic copy-paste-modify from the existing
    x86_64-apple-darwin target.
    Manishearth authored Jul 22, 2020
    Copy the full SHA
    b480883 View commit details
  6. Rollup merge of #74600 - Mark-Simulacrum:try-perf, r=pietroalbini

    Enable perf try builder
    
    This adds a dedicated branch for perf to use for CI, intended to allow perf to
    enqueue builds without needing to use bors. bors is great, but bors requires an
    open PR to work, and we want to invoke perf on closed PRs sometimes (in
    particular, rollups).
    Manishearth authored Jul 22, 2020
    Copy the full SHA
    e9ee7fe View commit details
  7. Rollup merge of #74618 - JohnTitor:no-more-bad-placeholder, r=estebank

    Do not ICE on assoc type with bad placeholder
    
    Fixes #74612
    r? @estebank
    Manishearth authored Jul 22, 2020
    Copy the full SHA
    14e5415 View commit details
  8. Rollup merge of #74631 - petrochenkov:ehdr2, r=jonas-schievink

    rustc_target: Add a target spec option for disabling `--eh-frame-hdr`
    
    Disable `--eh-frame-hdr` for targets that use an `ld`-like linker, but don't support that option.
    Do it through a target spec option rather than through hard-coding in `linker.rs`.
    The option is still enabled by default though.
    
    cc #73564
    Fixes #73564 (comment)
    Fixes #74625
    Fixes rust-embedded/msp430-rt#12
    Manishearth authored Jul 22, 2020
    Copy the full SHA
    dbe2726 View commit details
Loading