Skip to content

Commit 64d490e

Browse files
committed
add benchmark
1 parent 2cc4fcf commit 64d490e

File tree

4 files changed

+144
-2
lines changed

4 files changed

+144
-2
lines changed

Cargo.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "lazy-static-include"
3-
version = "1.1.2"
3+
version = "1.1.3"
44
authors = ["Magic Len <len@magiclen.org>"]
55
repository = "https://github.com/magiclen/lazy-static-include"
66
homepage = "https://magiclen.org/lazy-static-include"
@@ -15,4 +15,7 @@ travis-ci = { repository = "magiclen/lazy-static-include", branch = "master" }
1515
appveyor = { repository = "magiclen/lazy-static-include", branch = "master", service = "github" }
1616

1717
[dependencies]
18-
lazy_static = "1.1"
18+
lazy_static = "1.1"
19+
20+
[features]
21+
benchmark = []

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,26 @@ assert_eq!("Hello", TEST[1]);
113113
assert_eq!("哈囉", TEST[2]);
114114
```
115115

116+
## Benchmark
117+
118+
Using static mechanisms makes your program faster. See my benchmark result below (Intel i7-6700HQ, ran on 2018/09/10):
119+
120+
```text
121+
running 9 tests
122+
test include_array_lazy_static ... bench: 44 ns/iter (+/- 2)
123+
test include_array_native_static ... bench: 44 ns/iter (+/- 2)
124+
test include_array_no_static ... bench: 8,470 ns/iter (+/- 568)
125+
test include_bytes_lazy_static ... bench: 473 ns/iter (+/- 84)
126+
test include_bytes_native_static ... bench: 482 ns/iter (+/- 30)
127+
test include_bytes_no_static ... bench: 7,247 ns/iter (+/- 1,183)
128+
test include_str_lazy_static ... bench: 963 ns/iter (+/- 85)
129+
test include_str_native_static ... bench: 970 ns/iter (+/- 76)
130+
test include_str_no_static ... bench: 8,338 ns/iter (+/- 556)
131+
```
132+
133+
This benchmark program is in `tests/benchmark.rs`.
134+
When using the **release** profile, the performance of `lazy_static_include_*` is very close to `include_*`. That means you don't need to worry about the overhead, but just enjoy the faster compilation time.
135+
116136
## Crates.io
117137

118138
https://crates.io/crates/lazy-static-include

data/benchmark.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
["fergie1","fergie2","fergie3","fergie4","fergie5","fergie6","fergie7","fergie8","fergie9","fergie?","fergied","fergieeigref","fergiefergie","fergies","fergiing","ferguS","fergus","fergus!","fergus.","fergus0","fergus1","fergus2","fergus3","fergus4","fergus5","fergus6","fergus7","fergus8","fergus9","fergus?","fergused","ferguses","fergusfergus","fergusing","fergusoN","ferguson","ferguson!","ferguson.","ferguson0","ferguson1","ferguson2","ferguson3","ferguson4","ferguson5","ferguson6","ferguson7","ferguson8","ferguson9","ferguson?","fergusoned","fergusoning","fergusons","fergussugref","fernandO","fernanding","fernando","fernando!","fernando.","fernando0","fernando1","fernando2","fernando3","fernando4","fernando5","fernando6","fernando7","fernando8","fernando9","fernando?","fernandoed","fernandos","ferrarI","ferrari","ferrari!","ferrari.","ferrari0","ferrari1","ferrari1","ferrari2","ferrari3","ferrari4","ferrari5","ferrari6","ferrari7","ferrari8","ferrari9","ferrari?","ferraried","ferraring","ferraris","ferreT","ferret","ferret!","ferret.","ferret0","ferret1","ferret2","ferret3","ferret4","ferret5","ferret6","ferret7","ferret8","ferret9","ferret?","ferreted","ferretferret","ferreting","ferrets","ferretterref","ferriS","ferris","ferris!","ferris.","ferris0","ferris1","ferris2","ferris3","ferris4","ferris5","ferris6","ferris7","ferris8","ferris9","ferris?","ferrised","ferrises","ferrisferris","ferrising","ferrissirref","festeR","fester","fester!","fester.","fester0","fester1","fester2","fester3","fester4","fester5","fester6","fester7","fester8","fester9","fester?","festered","festerfester","festering","festerretsef","festers","festivaL","festival","festival!","festival.","festival0","festival1","festival2","festival3","festival4","festival5","festival6","festival7","festival8","festival9","festival?","festivaled","festivaling","festivals","fetisH","fetish","fetish!","fetish.","fetish0","fetish1","fetish2","fetish3","fetish4","fetish5","fetish6","fetish7","fetish8","fetish9","fetish?","fetished","fetishes","fetishfetish","fetishhsitef","fetishing","fettisH","fettish","fettish!","fettish.","fettish0","fettish1","fettish2","fettish3","fettish4","fettish5","fettish6","fettish7","fettish8","fettish9","fettish?","fettished","fettishes","fettishing","feveR","fever","fever!","fever.","fever0","fever1","fever2","fever3","fever4","fever5","fever6","fever7","fever8","fever9","fever?","fevered","feverfever","fevering","feverrevef","fevers","ffarffiR","ffarffir","ffatS","ffats","ffcr","ffeJ","ffej","ffejffeJ","ffejffej","fffF","ffff","ffff!","ffff.","ffff0","ffff1","ffff2","ffff3","ffff4","ffff5","ffff6","ffff7","ffff8","ffff9","ffff?","ffffF","ffffed","fffff","fffff!","fffff.","fffff0","fffff1","fffff1","fffff2","fffff3","fffff4","fffff5","fffff6","fffff7","fffff8","fffff9","fffff?","fffffF","fffffed","ffffff","ffffff!","ffffff.","ffffff0","ffffff1","ffffff1","ffffff2","ffffff3","ffffff4","ffffff5","ffffff6","ffffff7","ffffff8","ffffff9","ffffff?","ffffffF","ffffffed","fffffff","fffffff!","fffffff.","fffffff0","fffffff1","fffffff2","fffffff3","fffffff4","fffffff5","fffffff6","fffffff7","fffffff8","fffffff9","fffffff?","fffffffF","fffffffed","ffffffff","ffffffff","ffffffff!","ffffffff.","ffffffff0","ffffffff1","ffffffff2","ffffffff3","ffffffff4","ffffffff5","ffffffff6","ffffffff7","ffffffff8","ffffffff9","ffffffff?","ffffffffed","ffffffffff","ffffffffffff","ffffffffing","ffffffffs","fffffffing","fffffffs","ffffffing","ffffffs","fffffing","fffffs","ffffing","ffffs","ffiT","ffidraC","ffidrac","ffilC","ffilc","ffilpS","ffilps","ffirehS","ffirehs","ffit","ffokcaJ","ffokcaj","ffokcuF","ffokcuf","ffokreJ","ffokrej","ffonrimS","ffonrims","ffossiP","ffossip","ffoteG","ffoteg","ffrd","ffshr","ffuB","ffuM","ffuP","ffub","ffulF","ffulf","ffum","ffup","ffutS","ffuts","ffutsnuF","ffutsnuf","ffutstoH","ffutstoh","ffvdj474","fggt","fghjkL","fghjkl","fght","fghtng","fghtr","fhdfv","ficK","fick","fick!","fick.","fick0","fick1","fick2","fick3","fick4","fick5","fick6","fick7","fick8","fick9","fick?","fickeN","ficked","ficken","ficken!","ficken.","ficken0","ficken1","ficken2","ficken3","ficken4","ficken5","ficken6","ficken7","ficken8","ficken9","ficken?","fickened","fickenficken","fickening","fickennekcif","fickens","fickfick","ficking","fickkcif","ficks","fictioN","fiction","fiction!","fiction.","fiction0","fiction1","fiction2","fiction3","fiction4","fiction5","fiction6","fiction7","fiction8","fiction9","fiction?","fictioned","fictioning","fictions","fiddlE","fiddle","fiddle!","fiddle.","fiddle0","fiddle1","fiddle2","fiddle3","fiddle4","fiddle5","fiddle6","fiddle7","fiddle8","fiddle9","fiddle?","fiddled","fiddleelddif","fiddlefiddle","fiddles","fiddling","fideliO","fideliing","fidelio","fidelio!","fidelio.","fidelio0","fidelio1","fidelio2","fidelio3","fidelio4","fidelio5","fidelio6","fidelio7","fidelio8","fidelio9","fidelio?","fidelioed","fidelios","fidelitY","fidelitied","fidelities","fidelity","fidelity!","fidelity.","fidelity0","fidelity1","fidelity2","fidelity3","fidelity4","fidelity5","fidelity6","fidelity7","fidelity8","fidelity9","fidelity?","fidelitying","fielD","field","field!","field.","field0","field1","field2","field3","field4","field5","field6","field7","field8","field9","field?","fieldS","fielddleif","fielded","fieldfield","fielding","fields","fields","fields!","fields.","fields0","fields1","fields2","fields3","fields4","fields5","fields6","fields7","fields8","fields9","fields?","fieldsed","fieldses","fieldsfields","fieldsing","fieldssdleif","fiestA","fiesta","fiesta!","fiesta.","fiesta0","fiesta1","fiesta2","fiesta3","fiesta4","fiesta5","fiesta6","fiesta7","fiesta8","fiesta9","fiesta?","fiestaatseif","fiestaed","fiestafiesta","fiestas","fiesting","figarO","figaring","figaro","figaro!","figaro.","figaro0","figaro1","figaro2","figaro3","figaro4","figaro5","figaro6","figaro7","figaro8","figaro9","figaro?","figaroed","figarofigaro","figarooragif","figaros","fighT","fight","fight!","fight.","fight0","fight1","fight2","fight3","fight4","fight5","fight6","fight7","fight8","fight9","fight?","fighteR","fighted","fighter","fighter!","fighter.","fighter0","fighter1","fighter2","fighter3","fighter4","fighter5","fighter6","fighter7","fighter8","fighter9","fighter?","fightered","fightering","fighters","fightfight","fightinG","fighting","fighting","fighting!","fighting.","fighting0","fighting1","fighting2","fighting3","fighting4","fighting5","fighting6","fighting7","fighting8","fighting9","fighting?","fightingged"]

tests/benchmark.rs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#![cfg(feature = "benchmark")]
2+
#![feature(test)]
3+
4+
#[macro_use]
5+
extern crate lazy_static_include;
6+
7+
#[macro_use]
8+
extern crate lazy_static;
9+
10+
extern crate test;
11+
12+
use test::Bencher;
13+
14+
use std::fs::File;
15+
use std::io::Read;
16+
17+
#[bench]
18+
fn include_str_no_static(b: &mut Bencher) {
19+
let path = concat!(concat!(env!("CARGO_MANIFEST_DIR"), "/", "data/benchmark.txt"));
20+
21+
b.iter(|| {
22+
let mut f = File::open(&path).unwrap();
23+
24+
let mut v = Vec::new();
25+
26+
f.read_to_end(&mut v).unwrap();
27+
28+
let s = String::from_utf8(v).unwrap();
29+
30+
assert!(s.contains("figarofigaro"));
31+
});
32+
}
33+
34+
#[bench]
35+
fn include_str_native_static(b: &mut Bencher) {
36+
let text = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/", "data/benchmark.txt"));
37+
38+
b.iter(|| {
39+
assert!(text.contains("figarofigaro"));
40+
});
41+
}
42+
43+
#[bench]
44+
fn include_str_lazy_static(b: &mut Bencher) {
45+
lazy_static_include_str!(TEXT, "data/benchmark.txt");
46+
47+
b.iter(|| {
48+
assert!((*TEXT).contains("figarofigaro"));
49+
});
50+
}
51+
52+
#[bench]
53+
fn include_bytes_no_static(b: &mut Bencher) {
54+
let path = concat!(concat!(env!("CARGO_MANIFEST_DIR"), "/", "data/benchmark.txt"));
55+
56+
b.iter(|| {
57+
let mut f = File::open(&path).unwrap();
58+
59+
let mut v = Vec::new();
60+
61+
f.read_to_end(&mut v).unwrap();
62+
63+
String::from_utf8(v).unwrap();
64+
});
65+
}
66+
67+
#[bench]
68+
fn include_bytes_native_static(b: &mut Bencher) {
69+
let data = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/", "data/benchmark.txt"));
70+
71+
b.iter(|| {
72+
String::from_utf8(data.to_vec()).unwrap();
73+
});
74+
}
75+
76+
#[bench]
77+
fn include_bytes_lazy_static(b: &mut Bencher) {
78+
lazy_static_include_bytes!(DATA, "data/benchmark.txt");
79+
80+
b.iter(|| {
81+
String::from_utf8((*DATA).to_vec()).unwrap();
82+
});
83+
}
84+
85+
#[bench]
86+
fn include_array_no_static(b: &mut Bencher) {
87+
let path = concat!(concat!(env!("CARGO_MANIFEST_DIR"), "/", "data/benchmark.txt"));
88+
89+
b.iter(|| {
90+
let mut f = File::open(&path).unwrap();
91+
92+
let mut v = Vec::new();
93+
94+
f.read_to_end(&mut v).unwrap();
95+
96+
let s = String::from_utf8(v).unwrap();
97+
98+
assert!(s.contains("figarofigaro"));
99+
});
100+
}
101+
102+
#[bench]
103+
fn include_array_native_static(b: &mut Bencher) {
104+
let text = include!(concat!(env!("CARGO_MANIFEST_DIR"), "/", "data/benchmark.txt"));
105+
106+
b.iter(|| {
107+
assert!(text.binary_search(&"figarofigaro").is_ok());
108+
});
109+
}
110+
111+
#[bench]
112+
fn include_array_lazy_static(b: &mut Bencher) {
113+
lazy_static_include_array!(ARRAY: [&'static str; 622], "data/benchmark.txt");
114+
115+
b.iter(|| {
116+
assert!((*ARRAY).binary_search(&"figarofigaro").is_ok());
117+
});
118+
}

0 commit comments

Comments
 (0)