This repository was archived by the owner on May 28, 2025. It is now read-only.
Commit 3226d72
authored
Rollup merge of rust-lang#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
```File tree
3 files changed
+101
-44
lines changed- src/libcore
- num
- tests/num
3 files changed
+101
-44
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1095 | 1095 | | |
1096 | 1096 | | |
1097 | 1097 | | |
| 1098 | + | |
| 1099 | + | |
| 1100 | + | |
1098 | 1101 | | |
1099 | 1102 | | |
1100 | 1103 | | |
| |||
1105 | 1108 | | |
1106 | 1109 | | |
1107 | 1110 | | |
1108 | | - | |
| 1111 | + | |
1109 | 1112 | | |
1110 | 1113 | | |
1111 | 1114 | | |
1112 | | - | |
1113 | | - | |
1114 | | - | |
1115 | | - | |
1116 | | - | |
| 1115 | + | |
1117 | 1116 | | |
1118 | 1117 | | |
1119 | 1118 | | |
| |||
1622 | 1621 | | |
1623 | 1622 | | |
1624 | 1623 | | |
| 1624 | + | |
| 1625 | + | |
| 1626 | + | |
1625 | 1627 | | |
1626 | 1628 | | |
1627 | 1629 | | |
| |||
1633 | 1635 | | |
1634 | 1636 | | |
1635 | 1637 | | |
| 1638 | + | |
1636 | 1639 | | |
1637 | 1640 | | |
1638 | 1641 | | |
1639 | | - | |
1640 | | - | |
1641 | | - | |
1642 | | - | |
1643 | | - | |
| 1642 | + | |
1644 | 1643 | | |
1645 | 1644 | | |
1646 | 1645 | | |
| |||
1989 | 1988 | | |
1990 | 1989 | | |
1991 | 1990 | | |
| 1991 | + | |
| 1992 | + | |
| 1993 | + | |
1992 | 1994 | | |
1993 | 1995 | | |
1994 | 1996 | | |
| |||
2007 | 2009 | | |
2008 | 2010 | | |
2009 | 2011 | | |
| 2012 | + | |
2010 | 2013 | | |
2011 | 2014 | | |
2012 | 2015 | | |
2013 | | - | |
2014 | | - | |
2015 | | - | |
2016 | | - | |
2017 | | - | |
2018 | | - | |
2019 | | - | |
| 2016 | + | |
| 2017 | + | |
| 2018 | + | |
2020 | 2019 | | |
2021 | 2020 | | |
2022 | 2021 | | |
| |||
2040 | 2039 | | |
2041 | 2040 | | |
2042 | 2041 | | |
| 2042 | + | |
| 2043 | + | |
| 2044 | + | |
2043 | 2045 | | |
2044 | 2046 | | |
2045 | 2047 | | |
| |||
2051 | 2053 | | |
2052 | 2054 | | |
2053 | 2055 | | |
| 2056 | + | |
2054 | 2057 | | |
2055 | 2058 | | |
2056 | 2059 | | |
2057 | | - | |
2058 | | - | |
2059 | | - | |
2060 | | - | |
2061 | | - | |
| 2060 | + | |
2062 | 2061 | | |
2063 | 2062 | | |
2064 | 2063 | | |
| |||
3295 | 3294 | | |
3296 | 3295 | | |
3297 | 3296 | | |
| 3297 | + | |
| 3298 | + | |
| 3299 | + | |
3298 | 3300 | | |
3299 | 3301 | | |
3300 | 3302 | | |
| |||
3306 | 3308 | | |
3307 | 3309 | | |
3308 | 3310 | | |
| 3311 | + | |
3309 | 3312 | | |
3310 | 3313 | | |
3311 | 3314 | | |
3312 | | - | |
3313 | | - | |
3314 | | - | |
3315 | 3315 | | |
3316 | | - | |
| 3316 | + | |
3317 | 3317 | | |
3318 | 3318 | | |
3319 | 3319 | | |
| |||
3704 | 3704 | | |
3705 | 3705 | | |
3706 | 3706 | | |
| 3707 | + | |
| 3708 | + | |
| 3709 | + | |
3707 | 3710 | | |
3708 | 3711 | | |
3709 | 3712 | | |
| |||
3715 | 3718 | | |
3716 | 3719 | | |
3717 | 3720 | | |
| 3721 | + | |
3718 | 3722 | | |
3719 | 3723 | | |
3720 | 3724 | | |
3721 | | - | |
3722 | | - | |
3723 | | - | |
3724 | | - | |
3725 | | - | |
| 3725 | + | |
3726 | 3726 | | |
3727 | 3727 | | |
3728 | 3728 | | |
| |||
4029 | 4029 | | |
4030 | 4030 | | |
4031 | 4031 | | |
| 4032 | + | |
| 4033 | + | |
| 4034 | + | |
4032 | 4035 | | |
4033 | 4036 | | |
4034 | 4037 | | |
| |||
4047 | 4050 | | |
4048 | 4051 | | |
4049 | 4052 | | |
| 4053 | + | |
4050 | 4054 | | |
4051 | 4055 | | |
4052 | 4056 | | |
4053 | | - | |
4054 | | - | |
4055 | | - | |
4056 | | - | |
4057 | | - | |
| 4057 | + | |
| 4058 | + | |
4058 | 4059 | | |
4059 | | - | |
| 4060 | + | |
4060 | 4061 | | |
4061 | 4062 | | |
4062 | 4063 | | |
| |||
4077 | 4078 | | |
4078 | 4079 | | |
4079 | 4080 | | |
| 4081 | + | |
| 4082 | + | |
| 4083 | + | |
4080 | 4084 | | |
4081 | 4085 | | |
4082 | 4086 | | |
| |||
4088 | 4092 | | |
4089 | 4093 | | |
4090 | 4094 | | |
| 4095 | + | |
4091 | 4096 | | |
4092 | 4097 | | |
4093 | 4098 | | |
4094 | | - | |
4095 | | - | |
4096 | | - | |
4097 | | - | |
4098 | | - | |
| 4099 | + | |
4099 | 4100 | | |
4100 | 4101 | | |
4101 | 4102 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
255 | 255 | | |
256 | 256 | | |
257 | 257 | | |
258 | | - | |
259 | 258 | | |
260 | 259 | | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
261 | 279 | | |
262 | 280 | | |
263 | 281 | | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
264 | 295 | | |
265 | 296 | | |
266 | 297 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
184 | 184 | | |
185 | 185 | | |
186 | 186 | | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
187 | 212 | | |
188 | 213 | | |
189 | 214 | | |
0 commit comments