【发布时间】:2018-12-13 21:15:44
【问题描述】:
我正在初始化一个数组,然后多次反转它以查看性能。
我想了解我是否编写了无法比较的代码,还是 Rust 真的太糟糕以至于花费了这么多时间?
下面是 Rust 的构建和计时过程:
rustc main.rs
time ./main
这会一直运行下去。令人惊讶
锈
fn reverse(mylist: &mut Vec<u16>) {
let length = mylist.len();
let mid_length = length / 2;
for number in 0..mid_length {
let mut a = mylist[number];
let mut b = mylist[length - number - 1];
mylist[number] = b;
mylist[length - number - 1] = a;
}
}
fn main() {
let array_size = 100000;
let iterations = 100000;
let mut v = vec![0u16; array_size];
for _ in 0..iterations {
reverse(&mut v);
}
}
去
Go 代码与上面的 Rust 代码完全一样。需要注意的重要一点是,Go 有垃圾收集,而 Rust 没有。令人惊讶的是,Go 在不到 6 秒的时间内完成了这项工作:
go build main.go
time ./main 100000 100000
real 0m5.932s
user 0m5.928s
sys 0m0.004s
去
package main
import (
"os"
"strconv"
)
func reverse(mylist []int) []int {
length := len(mylist)
half := int(length / 2)
for i := 0; i < half; i++ {
mylist[i], mylist[length-i-1] = mylist[length-i-1], mylist[i]
}
return mylist
}
func main() {
array_size, _ := strconv.Atoi(os.Args[1])
iterations, _ := strconv.Atoi(os.Args[2])
mylist := make([]int, array_size)
for i := 0; i < iterations; i++ {
reverse(mylist)
}
}
【问题讨论】:
-
为什么要重新发明轮子?
Vec::reverse. -
我能想到的第一个问题是,据我所知,默认情况下
rustc在调试模式下编译。使用-O标志重复实验(用于优化)。 -
@ljedrz:基本算法类似(参见doc.rust-lang.org/1.7.0/src/core/slice.rs.html#432),它只是使用
unsafe来避免边界检查。 -
@MatthieuM。无论如何你是对的 - 它运行得非常快,优化了。
-
@ljedrz:有多快?如果优化器足够聪明,这应该是一个空操作。去拿 6 秒的空操作速度太慢了。