Skip to content

Releases: dkulyk/compound-file

v0.1.6

Choose a tag to compare

@dkulyk dkulyk released this 26 Aug 20:14

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

Choose a tag to compare

@dkulyk dkulyk released this 26 Aug 19:27

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

Choose a tag to compare

@dkulyk dkulyk released this 26 Aug 19:14

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

Choose a tag to compare

@dkulyk dkulyk released this 26 Aug 19:05

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

Choose a tag to compare

@dkulyk dkulyk released this 26 Aug 18:56

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

Choose a tag to compare

@dkulyk dkulyk released this 26 Aug 18:45

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

Choose a tag to compare

@dkulyk dkulyk released this 26 Aug 18:13

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