]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | // Copyright 2012 The Rust Project Developers. See the COPYRIGHT |
2 | // file at the top-level directory of this distribution and at | |
3 | // http://rust-lang.org/COPYRIGHT. | |
4 | // | |
5 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | // option. This file may not be copied, modified, or distributed | |
9 | // except according to those terms. | |
10 | ||
1a4d82fc | 11 | // ignore-lexer-test FIXME #15679 |
970d7e83 | 12 | // Microbenchmarks for various functions in std and extra |
223e47cc | 13 | |
c34b1796 | 14 | #![feature(unboxed_closures, rand, old_io, old_path, std_misc, collections)] |
223e47cc | 15 | |
c34b1796 AL |
16 | use std::old_io::*; |
17 | use std::old_path::{Path, GenericPath}; | |
1a4d82fc JJ |
18 | use std::iter::repeat; |
19 | use std::mem::swap; | |
85aaf69f | 20 | use std::env; |
1a4d82fc | 21 | use std::rand::Rng; |
970d7e83 | 22 | use std::rand; |
1a4d82fc JJ |
23 | use std::str; |
24 | use std::time::Duration; | |
970d7e83 | 25 | use std::vec; |
223e47cc | 26 | |
223e47cc | 27 | fn main() { |
85aaf69f | 28 | let argv: Vec<String> = env::args().collect(); |
1a4d82fc JJ |
29 | |
30 | macro_rules! bench { | |
31 | ($id:ident) => | |
85aaf69f | 32 | (maybe_run_test(&argv, |
1a4d82fc JJ |
33 | stringify!($id).to_string(), |
34 | $id)) | |
35 | } | |
223e47cc LB |
36 | |
37 | bench!(shift_push); | |
38 | bench!(read_line); | |
39 | bench!(vec_plus); | |
40 | bench!(vec_append); | |
41 | bench!(vec_push_all); | |
1a4d82fc JJ |
42 | bench!(is_utf8_ascii); |
43 | bench!(is_utf8_multibyte); | |
223e47cc LB |
44 | } |
45 | ||
1a4d82fc | 46 | fn maybe_run_test<F>(argv: &[String], name: String, test: F) where F: FnOnce() { |
223e47cc LB |
47 | let mut run_test = false; |
48 | ||
85aaf69f | 49 | if env::var_os("RUST_BENCH").is_some() { |
970d7e83 LB |
50 | run_test = true |
51 | } else if argv.len() > 0 { | |
1a4d82fc | 52 | run_test = argv.iter().any(|x| x == &"all".to_string()) || argv.iter().any(|x| x == &name) |
223e47cc LB |
53 | } |
54 | ||
970d7e83 LB |
55 | if !run_test { |
56 | return | |
57 | } | |
223e47cc | 58 | |
1a4d82fc | 59 | let dur = Duration::span(test); |
223e47cc | 60 | |
1a4d82fc | 61 | println!("{}:\t\t{} ms", name, dur.num_milliseconds()); |
223e47cc LB |
62 | } |
63 | ||
64 | fn shift_push() { | |
85aaf69f | 65 | let mut v1 = repeat(1).take(30000).collect::<Vec<_>>(); |
1a4d82fc | 66 | let mut v2 = Vec::new(); |
223e47cc LB |
67 | |
68 | while v1.len() > 0 { | |
1a4d82fc | 69 | v2.push(v1.remove(0)); |
223e47cc LB |
70 | } |
71 | } | |
72 | ||
73 | fn read_line() { | |
85aaf69f | 74 | use std::old_io::BufferedReader; |
223e47cc | 75 | |
1a4d82fc JJ |
76 | let mut path = Path::new(env!("CFG_SRC_DIR")); |
77 | path.push("src/test/bench/shootout-k-nucleotide.data"); | |
78 | ||
85aaf69f | 79 | for _ in 0..3 { |
1a4d82fc JJ |
80 | let mut reader = BufferedReader::new(File::open(&path).unwrap()); |
81 | for _line in reader.lines() { | |
223e47cc LB |
82 | } |
83 | } | |
84 | } | |
85 | ||
86 | fn vec_plus() { | |
1a4d82fc | 87 | let mut r = rand::thread_rng(); |
223e47cc | 88 | |
1a4d82fc | 89 | let mut v = Vec::new(); |
223e47cc LB |
90 | let mut i = 0; |
91 | while i < 1500 { | |
85aaf69f | 92 | let rv = repeat(i).take(r.gen_range(0, i + 1)).collect::<Vec<_>>(); |
970d7e83 | 93 | if r.gen() { |
1a4d82fc | 94 | v.extend(rv.into_iter()); |
970d7e83 | 95 | } else { |
1a4d82fc | 96 | let mut rv = rv.clone(); |
85aaf69f | 97 | rv.push_all(&v); |
1a4d82fc | 98 | v = rv; |
223e47cc LB |
99 | } |
100 | i += 1; | |
101 | } | |
102 | } | |
103 | ||
104 | fn vec_append() { | |
1a4d82fc | 105 | let mut r = rand::thread_rng(); |
223e47cc | 106 | |
1a4d82fc | 107 | let mut v = Vec::new(); |
223e47cc LB |
108 | let mut i = 0; |
109 | while i < 1500 { | |
85aaf69f | 110 | let rv = repeat(i).take(r.gen_range(0, i + 1)).collect::<Vec<_>>(); |
970d7e83 | 111 | if r.gen() { |
1a4d82fc | 112 | let mut t = v.clone(); |
85aaf69f | 113 | t.push_all(&rv); |
1a4d82fc | 114 | v = t; |
223e47cc LB |
115 | } |
116 | else { | |
1a4d82fc | 117 | let mut t = rv.clone(); |
85aaf69f | 118 | t.push_all(&v); |
1a4d82fc | 119 | v = t; |
223e47cc LB |
120 | } |
121 | i += 1; | |
122 | } | |
123 | } | |
124 | ||
125 | fn vec_push_all() { | |
1a4d82fc | 126 | let mut r = rand::thread_rng(); |
223e47cc | 127 | |
1a4d82fc | 128 | let mut v = Vec::new(); |
85aaf69f SL |
129 | for i in 0..1500 { |
130 | let mut rv = repeat(i).take(r.gen_range(0, i + 1)).collect::<Vec<_>>(); | |
970d7e83 | 131 | if r.gen() { |
85aaf69f | 132 | v.push_all(&rv); |
223e47cc LB |
133 | } |
134 | else { | |
1a4d82fc | 135 | swap(&mut v, &mut rv); |
85aaf69f | 136 | v.push_all(&rv); |
1a4d82fc JJ |
137 | } |
138 | } | |
139 | } | |
140 | ||
141 | fn is_utf8_ascii() { | |
142 | let mut v : Vec<u8> = Vec::new(); | |
85aaf69f | 143 | for _ in 0..20000 { |
1a4d82fc | 144 | v.push('b' as u8); |
85aaf69f | 145 | if str::from_utf8(&v).is_err() { |
1a4d82fc JJ |
146 | panic!("from_utf8 panicked"); |
147 | } | |
148 | } | |
149 | } | |
150 | ||
151 | fn is_utf8_multibyte() { | |
152 | let s = "b¢€𤭢"; | |
153 | let mut v : Vec<u8> = Vec::new(); | |
85aaf69f | 154 | for _ in 0..5000 { |
1a4d82fc | 155 | v.push_all(s.as_bytes()); |
85aaf69f | 156 | if str::from_utf8(&v).is_err() { |
1a4d82fc | 157 | panic!("from_utf8 panicked"); |
223e47cc LB |
158 | } |
159 | } | |
160 | } |