Skip to content

Commit e3d7773

Browse files
committed
Improvements to the speed of latin1_to_string.
On the benchmark it improves the encoding from around 9 microsends to 6 microseconds. This PR also includes the benchmark and setup as criterion benchmark. Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
1 parent 99731e7 commit e3d7773

File tree

3 files changed

+273
-1
lines changed

3 files changed

+273
-1
lines changed

mozjs/Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ libc.workspace = true
2121
log = "0.4"
2222
mozjs_sys = { path = "../mozjs-sys" }
2323

24+
[dev-dependencies]
25+
criterion = "0.6"
26+
2427
[build-dependencies]
2528
cc.workspace = true
2629
bindgen.workspace = true
30+
31+
32+
[[bench]]
33+
name = "latin1_string_conversion"
34+
harness = false
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
use std::ffi::c_void;
3+
use std::ptr;
4+
5+
use mozjs::conversions::jsstr_to_string;
6+
use mozjs::glue::{CreateJSExternalStringCallbacks, JSExternalStringCallbacksTraps};
7+
use mozjs::jsapi::{
8+
JSAutoRealm, JS_NewExternalStringLatin1, JS_NewGlobalObject, OnNewGlobalHookOption,
9+
};
10+
use mozjs::rooted;
11+
use mozjs::rust::{JSEngine, RealmOptions, Runtime, SIMPLE_GLOBAL_CLASS};
12+
13+
fn external_string(c: &mut Criterion) {
14+
unsafe {
15+
let engine = JSEngine::init().unwrap();
16+
let runtime = Runtime::new(engine.handle());
17+
let context = runtime.cx();
18+
let h_option = OnNewGlobalHookOption::FireOnNewGlobalHook;
19+
let c_option = RealmOptions::default();
20+
rooted!(in(context) let global = JS_NewGlobalObject(
21+
context,
22+
&SIMPLE_GLOBAL_CLASS,
23+
ptr::null_mut(),
24+
h_option,
25+
&*c_option,
26+
));
27+
let _ac = JSAutoRealm::new(context, global.get());
28+
29+
let latin1_base = "test latin-1 test
30+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
31+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
32+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
33+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
34+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
35+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
36+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
37+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
38+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
39+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
40+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
41+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
42+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
43+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
44+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
45+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
46+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
47+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
48+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
49+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
50+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
51+
test latin-1 test
52+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
53+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
54+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
55+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
56+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
57+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
58+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
59+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
60+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
61+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
62+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
63+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
64+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
65+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
66+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
67+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
68+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
69+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
70+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
71+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
72+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
73+
test latin-1 test
74+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
75+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
76+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
77+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
78+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
79+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
80+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
81+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
82+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
83+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
84+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
85+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
86+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
87+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
88+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
89+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
90+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
91+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
92+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
93+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
94+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
95+
test latin-1 test
96+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
97+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
98+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
99+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
100+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
101+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
102+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
103+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
104+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
105+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
106+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
107+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
108+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
109+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
110+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
111+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
112+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
113+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
114+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
115+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
116+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
117+
test latin-1 test
118+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
119+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
120+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
121+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
122+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
123+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
124+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
125+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
126+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
127+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
128+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
129+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
130+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
131+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
132+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
133+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
134+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
135+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
136+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
137+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
138+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
139+
test latin-1 test
140+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
141+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
142+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
143+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
144+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
145+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
146+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
147+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
148+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
149+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
150+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
151+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
152+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
153+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
154+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
155+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
156+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
157+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
158+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
159+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
160+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
161+
test latin-1 test
162+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
163+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
164+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
165+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
166+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
167+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
168+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
169+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
170+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
171+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
172+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
173+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
174+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
175+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
176+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
177+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
178+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
179+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
180+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1
181+
test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test
182+
latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1 test latin-1";
183+
let latin1_boxed = latin1_base.as_bytes().to_vec().into_boxed_slice();
184+
let latin1_chars = Box::into_raw(latin1_boxed).cast::<u8>();
185+
let callbacks = CreateJSExternalStringCallbacks(
186+
&EXTERNAL_STRING_CALLBACKS_TRAPS,
187+
latin1_base.len() as *mut c_void,
188+
);
189+
rooted!(in(context) let latin1_jsstr = JS_NewExternalStringLatin1(
190+
context,
191+
latin1_chars,
192+
latin1_base.len(),
193+
callbacks
194+
));
195+
c.bench_function("external_string_latin1", |b| {
196+
b.iter(|| unsafe {
197+
jsstr_to_string(context, latin1_jsstr.get());
198+
})
199+
});
200+
}
201+
}
202+
203+
static EXTERNAL_STRING_CALLBACKS_TRAPS: JSExternalStringCallbacksTraps =
204+
JSExternalStringCallbacksTraps {
205+
latin1Finalize: Some(latin1::finalize),
206+
latin1SizeOfBuffer: Some(latin1::size_of),
207+
utf16Finalize: Some(utf16::finalize),
208+
utf16SizeOfBuffer: Some(utf16::size_of),
209+
};
210+
211+
mod latin1 {
212+
use std::ffi::c_void;
213+
use std::slice;
214+
215+
use mozjs::jsapi::mozilla::MallocSizeOf;
216+
217+
pub unsafe extern "C" fn finalize(data: *const c_void, chars: *mut u8) {
218+
let slice = slice::from_raw_parts_mut(chars, data as usize);
219+
let _ = Box::from_raw(slice);
220+
}
221+
222+
pub unsafe extern "C" fn size_of(data: *const c_void, _: *const u8, _: MallocSizeOf) -> usize {
223+
data as usize
224+
}
225+
}
226+
227+
mod utf16 {
228+
use std::ffi::c_void;
229+
use std::slice;
230+
231+
use mozjs::jsapi::mozilla::MallocSizeOf;
232+
233+
pub unsafe extern "C" fn finalize(data: *const c_void, chars: *mut u16) {
234+
let slice = slice::from_raw_parts_mut(chars, data as usize);
235+
let _ = Box::from_raw(slice);
236+
}
237+
238+
pub unsafe extern "C" fn size_of(data: *const c_void, _: *const u16, _: MallocSizeOf) -> usize {
239+
data as usize
240+
}
241+
}
242+
243+
criterion_group!(benches, external_string);
244+
criterion_main!(benches);

0 commit comments

Comments
 (0)