diff options
| author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2021-03-26 03:36:46 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-25 22:36:46 -0400 |
| commit | 3d2e05dc7b6735fe0b81ceb6fe469270da56aff4 (patch) | |
| tree | 6f62852cb1ae3eee02ab51f7115703665ad232d1 /serde_v8/src/keys.rs | |
| parent | e7954413e16d5814db5da6389f8d6e0c328812aa (diff) | |
Introduce serde_v8 (#9722)
Diffstat (limited to 'serde_v8/src/keys.rs')
| -rw-r--r-- | serde_v8/src/keys.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/serde_v8/src/keys.rs b/serde_v8/src/keys.rs new file mode 100644 index 000000000..3e17e1c52 --- /dev/null +++ b/serde_v8/src/keys.rs @@ -0,0 +1,32 @@ +use rusty_v8 as v8; + +use std::collections::HashMap; + +// KeyCache stores a pool struct keys mapped to v8, +// to minimize allocs and speed up decoding/encoding `v8::Object`s +// TODO: experiment with in from_v8/to_v8 +pub struct KeyCache(HashMap<&'static str, v8::Global<v8::String>>); + +// creates an optimized v8::String for a struct field +// TODO: experiment with external strings +// TODO: evaluate if own KeyCache is better than v8's dedupe +pub fn v8_struct_key<'s>( + scope: &mut v8::HandleScope<'s>, + field: &'static str, +) -> v8::Local<'s, v8::String> { + // Internalized v8 strings are significantly faster than "normal" v8 strings + // since v8 deduplicates re-used strings minimizing new allocations + // see: https://github.com/v8/v8/blob/14ac92e02cc3db38131a57e75e2392529f405f2f/include/v8.h#L3165-L3171 + v8::String::new_from_utf8( + scope, + field.as_ref(), + v8::NewStringType::Internalized, + ) + .unwrap() + + // TODO: consider external strings later + // right now non-deduped external strings (without KeyCache) + // are slower than the deduped internalized strings by ~2.5x + // since they're a new string in v8's eyes and needs to be hashed, etc... + // v8::String::new_external_onebyte_static(scope, field).unwrap() +} |
