Skip to content

v1.4.3

Choose a tag to compare

@yuriizee yuriizee released this 02 Jul 20:26

Full Changelog: v1.1.15...v1.4.3
feat: compile per-class hydrators/serializers, warmable cache, lazy collections

Performance refactor: from() and toArray() now execute a specialized
closure generated per data class (plain properties become inline array
reads; casts, enums, nested DTOs, collections, and pipes delegate to the
existing runtime via captured metadata — behavior is unchanged).
Steady-state throughput: hydration ~2.6x, serialization ~2.2x over the
interpreted path.

  • Add HydratorCompiler and SerializerCompiler (eval once per class per
    process, in-memory registries, flush hooks); remove the interpreted
    Hydrator; extract ValueNormalizer for compiled serializers
  • Precompute ParameterMeta::$isPlain so hot paths skip ValueCaster;
    inline the is_array() input check; use it in with() overrides too
  • Cache format v2: .meta.php files now carry the compiled hydrator and
    serializer alongside the metadata — a warmed FPM worker pays neither
    reflection nor eval (opcache serves the whole file); legacy v1 files
    still load
  • Add vendor/bin/sdo-warm + Support\CacheWarmer: scans sources (PSR-4
    dirs from composer.json by default) for concrete BaseData subclasses
    and pre-builds the cache on deploy; fails fast on invalid DTO
    definitions, reports non-exportable classes as skipped
  • Add BaseData::lazyCollection() for streaming large iterables with a
    flat memory profile (~0.26 MB peak for 50k rows vs ~13 MB materialized)
  • Docs: compiled hot path, pre-warming guide, streaming collections,
    README performance section

245 tests, 100% coverage.