Releases: dkulyk/compound-file
Release list
v0.1.6
Critical performance fix
- Fix copy-on-write behavior that made lazy sector-chain indexing quadratic
- Keep references to the cached chain state while extending it
- Track the chain tail directly instead of copying the growing sector list
- Restore linear scaling for first reads of large streams
- Extend the benchmark to report cold complete-stream extraction before cache warm-up
A 4,366-sector XLS stream measured approximately 7.4x faster with this fix, with identical extracted bytes. The public API is unchanged.
All formatting, static analysis, and PHPUnit checks pass.
v0.1.5
Parser refinements
- Decode CFBF header version and numeric fields in bulk
- Avoid copy-on-write ancestry arrays while indexing the directory tree
- Replace internal chain generators with direct sector lists
- Remove repeated result-length calculations from block-read loops
- Add explicit directory-tree cycle validation coverage
On the PowerPoint chart benchmark, warmed CompoundFile::open() improves by approximately another 8% over v0.1.4. The public API is unchanged.
All formatting, static analysis, and PHPUnit checks pass.
v0.1.4
Parsing performance
- Decode header and extended DIFAT entries in bulk
- Coalesce physical FAT-sector reads and decode the table in one pass
- Decode each 128-byte directory entry with one structured unpack operation
- Reuse decoded FILETIME fields instead of reading them again
On the 766 KiB PowerPoint chart benchmark, warmed CompoundFile::open() improved from approximately 0.147 ms to 0.062 ms best-case. The public API is unchanged.
All formatting, static analysis, and PHPUnit checks pass.
v0.1.3
Performance improvement
- Decode FAT and mini-FAT tables with a single bulk unpack operation
- Preserve little-endian and big-endian allocation table support
- Eliminate per-integer substring and unpack overhead during container parsing
This significantly reduces CompoundFile::open() time, especially for containers with large allocation tables. All formatting, static analysis, and PHPUnit checks pass.
v0.1.2
Performance improvements
- Coalesce contiguous FAT sectors into a single read operation
- Avoid redundant seeks when the underlying resource is already at the requested offset
- Apply coalesced reads during container parsing and stream extraction
- Cover fragmented sector chains with integration tests
- Report complete-stream extraction throughput in the benchmark
All formatting, static analysis, and PHPUnit checks pass.
v0.1.1
What's changed
- Optimize random access with lazily cached FAT and mini-FAT chain indexes
- Preserve inexpensive reads near the beginning of large streams
- Add cross-sector random seek coverage
- Add a reusable Composer benchmark command
- Document performance benchmarking in the README
All formatting, static analysis, and PHPUnit checks pass.
v0.1.0
Initial release.
- CFBF v3/v4 parsing with FAT, DIFAT, and mini-FAT
- Little- and big-endian support
- UTF-16 stream names via mbstring
- Seekable stream API and ole2:// PHP stream wrapper
- Directory traversal and metadata inspection
- PHP 8.1+ with PHPUnit, PHPStan, and CI coverage