Rust lang性能评测

初学Rust编程,写了个简单的算法,没想到Rust的性能相当彪悍。学习Rust一周,现在对这门语言爱不释手。就像最初用Python一样,用的越多惊喜越多。Rust的语法非常优美,估计只有C#能媲美Rust的语法,加上Rust的包管理功能Cargo使用起来非常顺手,让人用起来就像飞一样。

我们的测试算法很简单,先随机生成1千万行随机的整数,然后通过算法排序这一千万行数据,并将排序后的结果保存到文本文件。

首先我们生成随机数,并写入一个文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
extern crate rand;
extern crate bit_set;
extern crate time;
use std::fs::File;
use std::io::prelude::*;
use rand::Rng;
use std::io;
use bit_set::BitSet;
use time::*;
use std::io::BufReader;

//生成1千万随机数
fn init(){
const FILE_NAME : &'static str = "sorting/sort.txt";
let mut file = File::create(FILE_NAME).expect("file create fail");
file.write_all(b"").expect("file write fail");
let mut rd = rand::thread_rng();
for _ in 0..10000000 {
let tand = rd.gen_range(1,20000000).to_string() + "\n";
file.write(tand.as_bytes()).expect("file write fail");
}
}

fn main(){

let start = time::now();//获取开始时间
init();
let end = time::now();//获取结束时间
println!("duration:{:?}",end-start);
}

执行程序耗时17秒,生成了大小为81M的随机数文件。

有了数据之后,我们将写我们的排序算法,这里采用位图排序。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
extern crate rand;
extern crate bit_set;
extern crate time;
use std::fs::File;
use std::io::prelude::*;
use rand::Rng;
use std::io;
use bit_set::BitSet;
use time::*;
use std::io::BufReader;

fn main() {

let start = time::now();//获取开始时间
sort_by_self(limit,offset+limit);
let end = time::now();//获取结束时间
println!("duration:{:?}",end-start);
}

fn sort_by_self(limit:u32,offset:u32){
let mut byte:Vec<u32> = vec![0;625000];
let mut file = File::open("sorting/sort.txt").expect("file create fail");
let mut buffer = String::new();
file.read_to_string(&mut buffer).unwrap();
let hh = buffer.split("\n");
for ll in hh {
match ll.parse::<u32>() {
Ok(num) => {
set_bit(&mut byte,num);
},
Err(_) => println!("That was not a number..."),
}
}
let mut i = 1;
let mut myFile = File::create("sorting/new.txt").expect("file create fail");

for x in 0..20000000 {
let aa = get_bit(&mut byte,x);
if aa != 0{
myFile.write((x.to_string() + "\n").as_bytes()).expect("file write fail");
}
}
}
fn set_bit(byte:&mut Vec<u32>,n:u32){
byte[(n/32) as usize] |= 1<<(n%32); // 设置
}
fn get_bit(byte:&mut Vec<u32>,n:u32) -> u32{
return (byte[(n/32) as usize] & (1<<(n%32)));
}

读取1千万行整数,进行排序,最后将排序结果写入另一文件,执行程序耗费12秒。性能相当感人,完全可以与C&C++一较高下。而且Rust的语法也非常容易了解,并且完全不用关心CG,我敢肯定5年后Rust会像现在的Go一样火。