|
1 | 1 | # Changelog |
2 | 2 |
|
3 | | -## 1.4.0 (2026-02-24) |
| 3 | +## 1.4.0 (2026-02-25) |
4 | 4 |
|
5 | 5 | - Add `decode_zodb_record_for_pg_json()` — converts ZODB pickle records |
6 | 6 | directly to a JSON string entirely in Rust with the GIL released, |
7 | 7 | eliminating the intermediate Python dict + `json.dumps()` step |
8 | | - (1.3x faster full pipeline on real-world data) |
| 8 | +- Direct PickleValue → JSON string writer (`json_writer.rs`), bypassing |
| 9 | + all `serde_json::Value` intermediate allocations (PG path 1.3-3.3x |
| 10 | + faster than dict + `json.dumps()`) |
| 11 | +- Direct known-type encoding for datetime, date, time, timedelta, and |
| 12 | + Decimal — writes pickle opcodes inline, skipping PickleValue intermediate |
| 13 | +- Thread-local buffer reuse for both encode and JSON writer paths |
| 14 | +- Thread-local class pickle cache per (module, name) pair — single memcpy |
| 15 | + replaces 7 opcode writes for ~99.6% of records |
| 16 | +- O(1) `@cls` hash lookup replaces O(n) key scan for marker detection |
| 17 | +- Direct i64 LONG1 encoding (eliminates BigInt heap allocation) |
9 | 18 | - Enable thin LTO (`lto = "thin"`) and single codegen unit |
10 | | - (`codegen-units = 1`) in Cargo release profile for 6-9% faster |
11 | | - decode/encode |
| 19 | + (`codegen-units = 1`) in release profile |
| 20 | +- Profile-guided optimization (PGO) support with real FileStorage + |
| 21 | + synthetic data profiling (adds 5-15%) |
| 22 | + |
| 23 | +### Performance (PGO build, vs CPython pickle) |
| 24 | + |
| 25 | +- Encode: 1.7-9.2x faster (synthetic), 3-5x faster (real FileStorage) |
| 26 | +- Decode: 1.0-2.3x faster (synthetic), near parity on real-world data |
| 27 | +- PG JSON path: 1.4x faster at median on 1,692 real ZODB records |
| 28 | +- Full codec overhead: ~28 µs per object (both directions) |
12 | 29 |
|
13 | 30 | ## 1.3.0 (2026-02-24) |
14 | 31 |
|
|
0 commit comments