summary refs log tree commit diff
path: root/src/test/bench/core-vec-append.rs
blob: 1adbd20f4cdec03036c396ce904db9dc566e6604 (plain)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// A raw test of vector appending performance.

extern mod std;
use dvec::DVec;
use io::WriterUtil;

fn collect_raw(num: uint) -> ~[uint] {
    let mut result = ~[];
    for uint::range(0u, num) |i| {
        result.push(i);
    }
    return result;
}

fn collect_dvec(num: uint) -> ~[uint] {
    let result = DVec();
    for uint::range(0u, num) |i| {
        result.push(i);
    }
    return dvec::unwrap(move result);
}

fn main() {
    let args = os::args();
    let args = if os::getenv(~"RUST_BENCH").is_some() {
        ~[~"", ~"50000000"]
    } else if args.len() <= 1u {
        ~[~"", ~"100000"]
    } else {
        args
    };
    let max = uint::from_str(args[1]).get();
    let start = std::time::precise_time_s();
    let raw_v = collect_raw(max);
    let mid = std::time::precise_time_s();
    let dvec_v = collect_dvec(max);
    let end = std::time::precise_time_s();

    // check each vector
    assert raw_v.len() == max;
    for raw_v.eachi |i, v| { assert i == *v; }
    assert dvec_v.len() == max;
    for dvec_v.eachi |i, v| { assert i == *v; }

    let raw = mid - start;
    let dvec = end - mid;

    let maxf = max as float;
    let rawf = raw as float;
    let dvecf = dvec as float;
    
    io::stdout().write_str(fmt!("Raw     : %? seconds\n", raw));
    io::stdout().write_str(fmt!("        : %f op/sec\n", maxf/rawf));
    io::stdout().write_str(fmt!("\n"));
    io::stdout().write_str(fmt!("Dvec    : %? seconds\n", dvec));
    io::stdout().write_str(fmt!("        : %f op/sec\n", maxf/dvecf));
    io::stdout().write_str(fmt!("\n"));
    
    if dvec < raw {
        io::stdout().write_str(fmt!("Dvec is %f%% faster than raw\n",
                                    (rawf - dvecf) / rawf * 100.0));
    } else {
        io::stdout().write_str(fmt!("Raw is %f%% faster than dvec\n",
                                    (dvecf - rawf) / dvecf * 100.0));
    }
}