zerovec
Zero-copy vector abstractions over byte arrays.
zerovec
enable vectors of multibyte types to be backed by a byte array, abstracting away
issues including memory alignment and endianness.
This crate has two main types:
ZeroVec<T>
for fixed-width types likeu32
VarZeroVec<T>
for variable-width types likestr
Both are intended as drop-in replacements for Vec<T>
in Serde structs serialized with a
format supporting a borrowed byte buffer, like Bincode. Clients upgrading from Vec to ZeroVec
or VarZeroVec benefit from zero heap allocations when deserializing read-only data.
Performance
zerovec
is designed for fast deserialization from byte buffers with zero memory allocations
while minimizing performance regressions for common vector operations.
Benchmark results on x86_64:
Operation | Vec<T> |
zerovec |
---|---|---|
Deserialize vec of 100 u32 |
233.18 ns | 14.120 ns |
Compute sum of vec of 100 u32 (read every element) |
8.7472 ns | 10.775 ns |
Binary search vec of 1000 u32 50 times |
442.80 ns | 472.51 ns |
Deserialize vec of 100 strings | 7.3740 us* | 1.4495 us |
Count chars in vec of 100 strings (read every element) | 747.50 ns | 955.28 ns |
Binary search vec of 500 strings 10 times | 466.09 ns | 790.33 ns |
* This result is reported for Vec<String>
. However, Serde also supports deserializing to Vec<&str>
; this gives 1.8420 us, much faster than Vec<String>
but a bit slower than zerovec
.
The benches used to generate the above table can be found in the benches
directory in the project repository.
Features
serde
: enables Serde Serialize/Deserialize impls for ZeroVec and VarZeroVec.
Examples
Serialize and deserialize a struct with ZeroVec and VarZeroVec with Bincode:
use ;
// This example requires the "serde" feature
let data = DataStruct ;
let bincode_bytes = serialize
.expect;
assert_eq!;
let deserialized: DataStruct = deserialize
.expect;
assert_eq!;
assert_eq!;
assert!;
More Information
For more information on development, authorship, contributing etc. please visit ICU4X home page
.