rustup 慢_为什么Rust程序这么慢?我错过了什么?

我读了

Minimal distance in Manhattan metric,并在

Rust重写了作者的“天真”实现。C变体是:

#include

#include

#include

std::pair pointsA[1000001];

std::pair pointsB[1000001];

int main() {

int n, t;

unsigned long long dist;

scanf("%d", &t);

while(t-->0) {

dist = 4000000000LL;

scanf("%d", &n);

for(int i = 0; i < n; i++) {

scanf("%d%d", &pointsA[i].first, &pointsA[i].second);

}

for(int i = 0; i < n; i++) {

scanf("%d%d", &pointsB[i].first, &pointsB[i].second);

}

for(int i = 0; i < n ;i++) {

for(int j = 0; j < n ; j++) {

if(abs(pointsA[i].first - pointsB[j].first) + abs(pointsA[i].second - pointsB[j].second) < dist)

dist = abs(pointsA[i].first - pointsB[j].first) + abs(pointsA[i].second - pointsB[j].second);

}

}

printf("%lld\n", dist);

}

}

锈变体是:

use std::io;

use std::io::BufReader;

use std::io::BufRead;

fn read_array(stdin: &mut BufReader<:stdin>, array_len: usize, points: &mut Vec) {

let mut line = String::new();

for _ in 0..array_len {

line.clear();

stdin.read_line(&mut line).unwrap();

let mut item = line.split_whitespace();

let x = item.next().unwrap().parse().unwrap();

let y = item.next().unwrap().parse().unwrap();

points.push((x, y));

}

}

fn manhattan_dist(a: &(i32, i32), b: &(i32, i32)) -> u32 {

((a.0 - b.0).abs() + (a.1 - b.1).abs()) as u32

}

fn main() {

let mut line = String::new();

let mut stdin = BufReader::new(io::stdin());

stdin.read_line(&mut line).unwrap();

let n_iters = line.trim_right().parse::().unwrap();

let mut points_a = Vec::with_capacity(10000);

let mut points_b = Vec::with_capacity(10000);

for _ in 0..n_iters {

line.clear();

stdin.read_line(&mut line).unwrap();

let set_len = line.trim_right().parse::().unwrap();

points_a.clear();

points_b.clear();

read_array(&mut stdin, set_len, &mut points_a);

read_array(&mut stdin, set_len, &mut points_b);

let mut dist = u32::max_value();

for i in points_a.iter() {

for j in points_b.iter() {

dist = std::cmp::min(manhattan_dist(i, j), dist);

}

}

println!("{}", dist);

}

}

然后,我用Python脚本生成数据:

import random

ITER = 100

N = 10000

MAX_INT = 1000000

print("%d" % ITER)

for _ in range(0, ITER):

print("%d" % N)

for _ in range(0, N):

print(random.randrange(-MAX_INT, MAX_INT + 1), random.randrange(1, MAX_INT + 1))

for _ in range(0, N):

print(random.randrange(-MAX_INT, MAX_INT + 1), random.randrange(-MAX_INT, 0))

并分别用g -Ofast -march = native和rustc -C opt-level = 3编译两个变体。时间是:

C

real 0m7.789s

user 0m7.760s

sys 0m0.020s

real 0m28.589s

user 0m28.570s

sys 0m0.010s

为什么我的Rust代码比C变体慢四倍?我使用的是Rust 1.12.0-beta.1。

我添加时间测量:

let now = SystemTime::now();

line.clear();

stdin.read_line(&mut line).unwrap();

let set_len = line.trim_right().parse::().unwrap();

points_a.clear();

points_b.clear();

read_array(&mut stdin, set_len, &mut points_a);

read_array(&mut stdin, set_len, &mut points_b);

io_time += now.elapsed().unwrap();

let now = SystemTime::now();

let mut dist = u32::max_value();

for i in points_a.iter() {

for j in points_b.iter() {

dist = std::cmp::min(manhattan_dist(i, j), dist);

}

}

calc_time += now.elapsed().unwrap();

和writeln!(& mut std :: io :: stderr(),“io_time:{},calc_time:{}”,io_time.as_secs(),calc_time.as_secs())。unwrap();打印io_time:0,calc_time:27。

我每晚都尝试过夜生活1.13.0 – (e9bc1bac8 2016-08-24):

$ time ./test_rust < data.txt > test3_res

io_time: 0, calc_time: 19

real 0m19.592s

user 0m19.560s

sys 0m0.020s

$ time ./test1 < data.txt > test1_res

real 0m7.797s

user 0m7.780s

sys 0m0.010s

所以现在我的Core i7差不多是2.7倍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值