rust风化速度_反驳《Golang、Rust的执行速度的对照,让人大吃一惊。》——不会别瞎说...

本文纠正了一篇关于Rust和Go执行速度对比文章中的错误,指出在进行性能测试时应使用`--release`标志,并提供实际测试案例,展示Rust在正确编译优化后的性能优势。测试结果显示,Rust代码运行时间远低于Go,强调了正确测量和编译优化的重要性。
摘要由CSDN通过智能技术生成

首先我无意引战,但是今天看到某位同学的文章里有某些错误,不得不指正一下。

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 不行啊,深表同情。

有疑问加站长微信联系(非本文作者)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值