| Crates.io | vb |
| lib.rs | vb |
| version | 0.2.7 |
| created_at | 2023-08-19 02:38:33.352754+00 |
| updated_at | 2025-12-30 16:40:40.011976+00 |
| description | The fastest VByte/Varint encoding library in Rust / Rust 生态最快的变长字节编码库 |
| homepage | https://github.com/js0-site/rust/tree/main/vb |
| repository | https://github.com/js0-site/rust.git |
| max_upload_size | |
| id | 948460 |
| size | 104,854 |
The fastest VByte encoding library in the Rust ecosystem.
Encode at 430M integers/sec, decode at 415M integers/sec — 2.4x faster encoding and 1.2x faster decoding than alternatives.
u64 integers using 1-10 bytes based on magnitudediff feature)thiserror for error handling[dependencies]
vb = "0.2"
# With differential encoding support
vb = { version = "0.2", features = ["diff"] }
use vb::{e_li, d_li};
let numbers = vec![0, 127, 128, 16383, 16384, 2097151];
// Encode
let encoded = e_li(numbers.iter().cloned());
println!("Compressed to {} bytes", encoded.len());
// Decode
let decoded = d_li(&encoded).unwrap();
assert_eq!(numbers, decoded);
Ideal for sorted sequences like timestamps, IDs, or offsets.
use vb::{e_diff, d_diff};
let timestamps = vec![1000000, 1000005, 1000010, 1000042];
// Stores only deltas: [1000000, 5, 5, 32]
let encoded = e_diff(×tamps);
let decoded = d_diff(&encoded).unwrap();
assert_eq!(timestamps, decoded);
| Function | Description |
|---|---|
e(value, buf) |
Encode single u64, append to buffer |
d(bytes) |
Decode single u64, return (value, bytes_consumed) |
e_li(iter) |
Encode iterator of u64 to Vec<u8> |
d_li(bytes) |
Decode bytes to Vec<u64> |
e_diff(slice) |
Encode increasing sequence with delta compression |
d_diff(bytes) |
Decode delta-compressed sequence |
Benchmarked with 10,000 integers (60% small, 30% medium, 10% large):
| Library | Encode (M/s) | Decode (M/s) |
|---|---|---|
| vb | 430 | 415 |
| leb128 | 289 | 213 |
| integer-encoding | 176 | 349 |
Run benchmarks yourself:
./bench.sh
VByte uses 7 bits per byte for data, with the MSB as continuation flag:
MSB = 0: Final byteMSB = 1: More bytes followKey optimizations:
leading_zeros() calculates byte count in one CPU cycleComparing varint encoding libraries with 10,000 integers (mixed distribution: 60% small, 30% medium, 10% large).
| Library | Encode (M/s) | Decode (M/s) |
|---|---|---|
| vb | 430.5 | 414.9 |
| integer-encoding | 176.2 | 348.6 |
| leb128 | 289.2 | 212.9 |
macOS 26.1 (arm64) · Apple M2 Max · 12 cores · 64.0GB · rustc 1.94.0-nightly (21ff67df1 2025-12-15)
This project is an open-source component of js0.site ⋅ Refactoring the Internet Plan.
We are redefining the development paradigm of the Internet in a componentized way. Welcome to follow us:
Rust 生态中最快的 VByte 编码库。
编码速度 4.3 亿整数/秒,解码速度 4.15 亿整数/秒 — 编码比同类库快 2.4 倍,解码快 1.2 倍。
u64 整数diff 特性)thiserror 处理错误[dependencies]
vb = "0.2"
# 启用差分编码
vb = { version = "0.2", features = ["diff"] }
use vb::{e_li, d_li};
let numbers = vec![0, 127, 128, 16383, 16384, 2097151];
// 编码
let encoded = e_li(numbers.iter().cloned());
println!("压缩至 {} 字节", encoded.len());
// 解码
let decoded = d_li(&encoded).unwrap();
assert_eq!(numbers, decoded);
适用于时间戳、ID、偏移量等有序序列。
use vb::{e_diff, d_diff};
let timestamps = vec![1000000, 1000005, 1000010, 1000042];
// 仅存储差值: [1000000, 5, 5, 32]
let encoded = e_diff(×tamps);
let decoded = d_diff(&encoded).unwrap();
assert_eq!(timestamps, decoded);
| 函数 | 说明 |
|---|---|
e(value, buf) |
编码单个 u64,追加到缓冲区 |
d(bytes) |
解码单个 u64,返回 (值, 消耗字节数) |
e_li(iter) |
将 u64 迭代器编码为 Vec<u8> |
d_li(bytes) |
将字节解码为 Vec<u64> |
e_diff(slice) |
差分压缩递增序列 |
d_diff(bytes) |
解码差分压缩序列 |
测试数据:10,000 个整数(60% 小值,30% 中值,10% 大值)
| 库 | 编码 (百万/秒) | 解码 (百万/秒) |
|---|---|---|
| vb | 430 | 415 |
| leb128 | 289 | 213 |
| integer-encoding | 176 | 349 |
运行评测:
./bench.sh
VByte 每字节用 7 位存数据,最高位 (MSB) 作为延续标志:
MSB = 0:最后一个字节MSB = 1:后续还有字节核心优化:
leading_zeros() 单周期计算所需字节数对比 varint 编码库,测试数据:10,000 个整数(混合分布:60% 小值,30% 中值,10% 大值)。
| 库 | 编码 (百万/秒) | 解码 (百万/秒) |
|---|---|---|
| vb | 430.5 | 414.9 |
| integer-encoding | 176.2 | 348.6 |
| leb128 | 289.2 | 212.9 |
macOS 26.1 (arm64) · Apple M2 Max · 12 核 · 64.0GB · rustc 1.94.0-nightly (21ff67df1 2025-12-15)
本项目为 js0.site ⋅ 重构互联网计划 的开源组件。
我们正在以组件化的方式重新定义互联网的开发范式,欢迎关注: