反駁《Golang、Rust的執行速度的對照,讓人大吃一驚。》——不會別瞎說

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

首先我無意引戰,但是今天看到某位同學的文章裡有某些錯誤,不得不指正一下。

原文地址:http://studygolang.com/articles/9628

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:

```

movabsq $39996000100000000, %rax

```

編譯時間計算掉了嗎?

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::<u64>().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 不行啊,深表同情。

 

4606 次點擊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.