summary refs log tree commit diff
path: root/src/test/bench/core-vec-append.rs
blob: 7e4a327ea12e72c8f1654d1d426b97050068e24c (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
// A raw test of vector appending performance.

use std;
import dvec::{dvec, extensions};
import io::writer_util;

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

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

fn main(args: ~[str]) {
    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));
    }
}