首先我無意引戰,但是今天看到某位同學的文章里有某些錯誤,不得不指正一下。
1. 測量時間的時候我們使用 `std::time::SystemTime::elapsed` 即可,不必蹩腳的使用兩個 system 輸出出來還得手動算一下。(當然你說對Rust不熟也就無所謂了)
2. 最重要一點。 執行 rust 代碼的時候請用 `--release` ,cargo 項目請直接執行 `cargo run --release`
在我本機的測試過程:
```
?? demo pwd
/Users/wayslog/go/src/demo
?? demo go version
go version go1.7.1 darwin/amd64
?? demo cat demo.go
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GC()
t := time.Now()
sum := 0
for i := 0; i < 20000; i++ {
for j := 0; j < 20000; j++ {
sum = sum + i*j
}
}
fmt.Println(time.Now().Sub(t))
fmt.Println(sum)
}
?? demo go run demo.go
236.312079ms
39996000100000000
?? demo go build
?? demo ./demo
289.696142ms
39996000100000000
?? demo cd ~/rust/baka
?? baka git:(master) ? cat src/main.rs
use std::time::SystemTime;
fn main() {
let sys_time = SystemTime::now();
let mut x = 0;
let mut i = 0;
let mut y: u64 = 0;
while x < 20000 {
i = 0;
while i < 20000 {
y = y + x * i;
i = i + 1;
}
x = x + 1;
}
println!("{:?}", sys_time.elapsed());
println!("The value of y is: {}", y);
}
?? baka git:(master) ? cargo run --release
Finished release [optimized] target(s) in 0.0 secs
Running `target/release/baka`
Ok(Duration { secs: 0, nanos: 0 })
The value of y is: 39996000100000000
?? baka git:(master) ? cargo build --release
Finished release [optimized] target(s) in 0.0 secs
?? baka git:(master) ? ./target/release/baka
Ok(Duration { secs: 0, nanos: 0 })
The value of y is: 39996000100000000
```
Rust這里為什么會跑到0秒0ns呢?
將rust編譯到asm我們能看到, 地址在這:https://is.gd/CyE36H:
```
```
編譯時計算掉了么?
OK,既然編譯時計算掉了這個情況,那么,我們讓用戶自己輸入數字吧,這樣編譯時計算總優化不掉吧?
```
?? baka git:(master) ? cat src/main.rs
use std::time::SystemTime;
use std::env;
fn main() {
let mut args = env::args();
args.next().unwrap();
let max_range = args.next().unwrap().parse::().expect("not num");
let sys_time = SystemTime::now();
let mut x = 0;
let mut i = 0;
let mut y: u64 = 0;
while x < max_range {
i = 0;
while i < max_range {
y = y + x * i;
i = i + 1;
}
x = x + 1;
}
println!("{:?}", sys_time.elapsed());
println!("The value of y is: {}", y);
}
?? baka git:(master) ? cargo build --release
Finished release [optimized] target(s) in 0.0 secs
?? baka git:(master) ? ./target/release/baka 20000
Ok(Duration { secs: 0, nanos: 6000 })
The value of y is: 39996000100000000
?? baka git:(master) ? ./target/release/baka 40000
Ok(Duration { secs: 0, nanos: 12000 })
The value of y is: 639968000400000000
```
這里,Rust編譯器可能也做了其他的優化了,但是需要分析asm再來看了,這里不做贅述。
但是,無論怎么看, 6000 ns (0.006ms) 和 200 ms 都是數量級的差距吧?
總結一點,不會別瞎說,這位 gopher 不行啊,深表同情。
有疑問加站長微信聯系(非本文作者)