This is an automated email from the ASF dual-hosted git repository. chaokunyang pushed a commit to branch release_0.14.0 in repository https://gitbox.apache.org/repos/asf/fory-site.git
commit ab3481cc16351a8a689237a6ffeaa29f92e257c5 Author: chaokunyang <[email protected]> AuthorDate: Mon Dec 15 22:48:30 2025 +0800 add release v0.14.0 blog --- blog/2025-12-15-fory_0_14_0_release.md | 191 ++++++++++++++++++++++++ docs/docs/introduction/benchmark.md | 6 + public/benchmarks/cpp/throughput_comparison.png | Bin 0 -> 52517 bytes 3 files changed, 197 insertions(+) diff --git a/blog/2025-12-15-fory_0_14_0_release.md b/blog/2025-12-15-fory_0_14_0_release.md new file mode 100644 index 000000000..b5fdcd9e5 --- /dev/null +++ b/blog/2025-12-15-fory_0_14_0_release.md @@ -0,0 +1,191 @@ +--- +slug: fory_0_14_0_release +title: Fory v0.14.0 Released +authors: [chaokunyang] +tags: [fory, c++, rust, java, python] +--- + +The Apache Fory team is pleased to announce the 0.14.0 release. This is a major release that includes [85 PR](https://github.com/apache/fory/compare/v0.13.2...v0.14.0) from 11 distinct contributors. See the [Install](https://fory.apache.org/docs/start/install) Page to learn how to get the libraries for your platform. + +## Highlights + +- **Official C++ Support**: First release of Apache Fory C++ with high-performance object graph serialization, cross-language interoperability, and schema evolution +- **Row Format & Type System**: New row-oriented format type system across Java, Python, and C++, enabling row-columnar conversions and removing Arrow dependencies +- **Performance Enhancements**: Significant optimizations across all languages, including thread-local context in Rust and fast flat-int maps for C++ type dispatch +- **Ecosystem Updates**: Added support for JDK 25 (Java), Go 1.23, and Bazel 8. Python officially marked as stable with improved build parallelism +- **Advanced Java Features**: GraalVM Native Image support via `ForyFeature` and optimized serializers for blocking queues and final fields +- **ObjectStreamSerializer Refactoring**: Refactored `ObjectStreamSerializer` with meta-shared compatible mode for reduced space cost and improved performance on JDK customized serialization APIs + +## C++: First Release Highlights + +This is the first Apache Fory C++ release, delivering a complete, high-performance serialization framework for modern C++17. If you build C++ applications requiring fast serialization, cross-language communication, or schema evolution, Fory C++ provides type-safe, compile-time serialization with minimal overhead. + +**Key capabilities:** + +- Macro-based struct registration via `FORY_STRUCT` for compile-time type safety +- Cross-language serialization with Java, Python, Go, Rust, and JavaScript +- Forward/backward compatible schema evolution (Compatible mode) +- Reference tracking for shared objects and circular references +- Thread-safe and single-threaded (fastest) variants +- Comprehensive type support: primitives, `std::string`, `std::vector`, `std::map`, `std::set`, `std::optional`, `std::shared_ptr`, `std::unique_ptr`, `std::variant`, and temporal types +- Zero-copy Row format for analytics workloads with random field access +- CMake (FetchContent) and Bazel build system support + +### Quick Start + +```cpp +#include "fory/serialization/fory.h" + +using namespace fory::serialization; + +struct Person { + std::string name; + int32_t age; + std::vector<std::string> hobbies; + FORY_STRUCT(Person, name, age, hobbies); +}; + +int main() { + auto fory = Fory::builder() + .xlang(true) // Enable cross-language mode + .track_ref(false) // Disable ref tracking for simple types + .build(); + fory.register_struct<Person>(1); + + Person person{"Alice", 30, {"reading", "coding"}}; + auto bytes = fory.serialize(person).value(); + Person decoded = fory.deserialize<Person>(bytes).value(); + // person == decoded + return 0; +} +``` + +- Guide: C++ Serialization – https://fory.apache.org/docs/docs/guide/cpp/ +- Examples: [hello_world](https://github.com/apache/fory/tree/main/examples/cpp/hello_world), [hello_row](https://github.com/apache/fory/tree/main/examples/cpp/hello_row) + +### C++ Benchmarks + +<img src="/img/benchmarks/cpp/throughput_comparison.png" width="90%"/> + +Below are timing results (nanoseconds; lower is better) comparing Fory with Protobuf across different data structures. + +| Datatype | Operation | Fory (ns) | Protobuf (ns) | Faster | +|----------|-----------|-----------|---------------|--------| +| MediaContent | Serialize | 414 | 2,046 | Fory (4.9x) | +| MediaContent | Deserialize | 1,361 | 2,890 | Fory (2.1x) | +| Sample | Serialize | 210 | 307 | Fory (1.5x) | +| Sample | Deserialize | 1,061 | 1,500 | Fory (1.4x) | +| Struct | Serialize | 51 | 181 | Fory (3.5x) | +| Struct | Deserialize | 136 | 170 | Fory (1.3x) | + +Note: Results depend on hardware and implementation versions. See the C++ benchmark guide for how to run benchmarks yourself: https://github.com/apache/fory/tree/main/benchmarks/cpp_benchmark + +## Features +* feat(python): add raw method to buffer object by @chaokunyang in https://github.com/apache/fory/pull/2875 +* feat(rust): add duration serializer support by @chaokunyang in https://github.com/apache/fory/pull/2878 +* feat(rust): add typename to unregistered error message by @chaokunyang in https://github.com/apache/fory/pull/2881 +* perf(rust): support criterion profiler to generate flamegraph by @chaokunyang in https://github.com/apache/fory/pull/2882 +* refactor(rust): merge fory_debug into fory macro attr by @chaokunyang in https://github.com/apache/fory/pull/2883 +* feat(rust): direct derive primitve write/read by @chaokunyang in https://github.com/apache/fory/pull/2890 +* perf(rust): optimize buffer write read perf by @chaokunyang in https://github.com/apache/fory/pull/2892 +* feat(Rust): Support u128 & u128_array by @urlyy in https://github.com/apache/fory/pull/2899 +* feat(c++): implement fory cpp object graph serialization framework by @chaokunyang in https://github.com/apache/fory/pull/2908 +* feat(python): pure python row-columar convert by @chaokunyang in https://github.com/apache/fory/pull/2919 +* feat(c++): implement xlang serialization for c++ by @chaokunyang in https://github.com/apache/fory/pull/2925 +* feat(c++/python): add row format schema and remove arrow dependency by @chaokunyang in https://github.com/apache/fory/pull/2928 +* feat(java): implement fory row format type system by @chaokunyang in https://github.com/apache/fory/pull/2931 +* feat(python): implement cython bazel build directly without 3rd deps by @chaokunyang in https://github.com/apache/fory/pull/2936 +* feat(c+/python): upgrade bazel to bazel8 by @chaokunyang in https://github.com/apache/fory/pull/2937 +* feat(java/python/c++): add schema encoder and remove arrow serializers by @chaokunyang in https://github.com/apache/fory/pull/2938 +* feat(c++): check max dyn depth when deserializing polymorphic types by @chaokunyang in https://github.com/apache/fory/pull/2939 +* feat(c++): add cmake build support and add cpp examples by @chaokunyang in https://github.com/apache/fory/pull/2942 +* feat(c++ ): add cpp benchmark by @chaokunyang in https://github.com/apache/fory/pull/2943 +* perf(rust): use segmented pool to reduce contention of fory pool by @chaokunyang in https://github.com/apache/fory/pull/2945 +* perf(rust): use thread local to manage fory rust WriteContext/ReadContext by @chaokunyang in https://github.com/apache/fory/pull/2946 +* feat(rust): add fory config for rust by @chaokunyang in https://github.com/apache/fory/pull/2947 +* perf(c++): optimize cpp serialization performance by @chaokunyang in https://github.com/apache/fory/pull/2944 +* perf(c++): remove shared_ptr from type info to reduce atomic counter cost by @chaokunyang in https://github.com/apache/fory/pull/2951 +* feat: refine python module check by @chaokunyang in https://github.com/apache/fory/pull/2952 +* feat(java): support jdk 25 by @chaokunyang in https://github.com/apache/fory/pull/2954 +* feat(java): add optimized serializers for blocking queues by @zhan7236 in https://github.com/apache/fory/pull/2955 +* perf(c++): directly error set instead of result to reduce cost on hotpath by @chaokunyang in https://github.com/apache/fory/pull/2959 +* perf(c++): optimize primitive struct fields read performance by @chaokunyang in https://github.com/apache/fory/pull/2960 +* feat(java): implement FinalFieldReplaceResolveSerializer for final fields with writeReplace/readResolve methods by @mchernyakov in https://github.com/apache/fory/pull/2917 +* perf(c++): add mac profile script for c++ by @chaokunyang in https://github.com/apache/fory/pull/2962 +* perf(c++): fair benchmark for cpp by @chaokunyang in https://github.com/apache/fory/pull/2963 +* perf(c++): optimize type dispatch performance by a fast flat-int map by @chaokunyang in https://github.com/apache/fory/pull/2966 +* perf(c++): add media content benchmark by @chaokunyang in https://github.com/apache/fory/pull/2968 +* feat(c++): support polymorphic collection elements serialization by @chaokunyang in https://github.com/apache/fory/pull/2974 +* feat(c++): add cpp tuple serializer by @chaokunyang in https://github.com/apache/fory/pull/2975 +* refactor(xlang): use 0 for unknow type id by @chaokunyang in https://github.com/apache/fory/pull/2985 +* feat(java): Add ForyFeature for GraalVM Native Image by @mengnankkkk in https://github.com/apache/fory/pull/2701 +* feat(c++): support container xlang serialization with polymorphic elements by @chaokunyang in https://github.com/apache/fory/pull/2980 +* feat(python): parallel python wheel build by @chaokunyang in https://github.com/apache/fory/pull/2989 +* perf(c++): improve the serialization performance of array/collection by @LiangliangSui in https://github.com/apache/fory/pull/2986 +* feat(go): upgrade go to to 1.23 by @chaokunyang in https://github.com/apache/fory/pull/2995 +* perf(c++): centralize error state in context for faster serialization by @chaokunyang in https://github.com/apache/fory/pull/3009 +* refactor(go): redesign serialization implementation with performance and usability improvements by @chaokunyang in https://github.com/apache/fory/pull/2998 +* refactor(rust): merge rust type layer into TypeMeta by @chaokunyang in https://github.com/apache/fory/pull/3019 +* ci: remove macos x86 CI for Python by @chaokunyang in https://github.com/apache/fory/pull/3023 +* feat(c++): support unsigned type for cpp by @chaokunyang in https://github.com/apache/fory/pull/3022 +* feat(c++): support variant-based union type serialization for c++ by @chaokunyang in https://github.com/apache/fory/pull/3032 +* feat(java): refactor ObjectStreamSerializer to use meta shared compatible serializer by @chaokunyang in https://github.com/apache/fory/pull/3034 +* feat(java): separate user register type id with fory registered type id by @chaokunyang in https://github.com/apache/fory/pull/3035 +* feat(): add c++ user guide doc by @chaokunyang in https://github.com/apache/fory/pull/3037 +* refactor(c++/rust): refine c++ serialize_to API by @chaokunyang in https://github.com/apache/fory/pull/3045 + + +## Bug Fix +* fix(Rust): fix Binary implementation by @urlyy in https://github.com/apache/fory/pull/2902 +* fix(rust): fix array field support by @chaokunyang in https://github.com/apache/fory/pull/2933 +* fix(rust): raise error for nested polymorphics for collection by @chaokunyang in https://github.com/apache/fory/pull/2934 +* fix(kotlin): support Kotlin field with Java reserved world by @chaokunyang in https://github.com/apache/fory/pull/2948 +* fix(java): handle TypeVariable in row format type inference by @chaokunyang in https://github.com/apache/fory/pull/2949 +* fix(java): use single quotes in Python command for Windows compatibility by @zhan7236 in https://github.com/apache/fory/pull/2953 +* fix(java): fix race condition in blocking queue serializers by @zhan7236 in https://github.com/apache/fory/pull/2956 +* fix(cpp): fix the type error by @LiangliangSui in https://github.com/apache/fory/pull/2961 +* fix(go): fix struct value reference tracking bug by @chaokunyang in https://github.com/apache/fory/pull/2991 +* fix(java): support serialization of CopyOnWriteArraySet by @LiangliangSui in https://github.com/apache/fory/pull/2999 + +## Other Improvements +* docs: fix broken table in in java_serialization_guide.md by @mosinnik in https://github.com/apache/fory/pull/2876 +* chore(rust): fix tuple test comment by @chaokunyang in https://github.com/apache/fory/pull/2877 +* docs(rust): remove redundant doc for shared reference by @chaokunyang in https://github.com/apache/fory/pull/2879 +* chore(Java): Update java quickstart doc, for note register order-sensitive by @moooonk in https://github.com/apache/fory/pull/2837 +* chore(CI): Add caching for bazel in github workflows by @prakash-218 in https://github.com/apache/fory/pull/2888 +* chore(CI): Fix cache with symlinks by @prakash-218 in https://github.com/apache/fory/pull/2893 +* chore: move benchmarks to separate dir to speed up ci build by @chaokunyang in https://github.com/apache/fory/pull/2894 +* docs: fix rust benchmark links by @chaokunyang in https://github.com/apache/fory/pull/2896 +* docs: fix cargo benchmark comand in doc by @chaokunyang in https://github.com/apache/fory/pull/2897 +* chore: bump release version to 0.13.1 by @chaokunyang in https://github.com/apache/fory/pull/2901 +* docs(java): add logging section by @mosinnik in https://github.com/apache/fory/pull/2905 +* chore(c++): remove cpp benchmarks by @chaokunyang in https://github.com/apache/fory/pull/2926 +* chore(c++): move meta string to meta dir by @chaokunyang in https://github.com/apache/fory/pull/2940 +* docs: remove unused type mappings for arrow types by @chaokunyang in https://github.com/apache/fory/pull/2964 +* chore: Remove the content related to arrow. by @LiangliangSui in https://github.com/apache/fory/pull/2965 +* chore(c++): move common macro into macros.h by @chaokunyang in https://github.com/apache/fory/pull/2970 +* docs: Update Bazel version in README.md by @chaokunyang in https://github.com/apache/fory/pull/2971 +* docs: refine xlang spec documentation by @chaokunyang in https://github.com/apache/fory/pull/2979 +* docs: Refine metadata packing and automatic type mapping by @chaokunyang in https://github.com/apache/fory/pull/2984 +* ci: add workflow to remove HTML comments from PR body by @chaokunyang in https://github.com/apache/fory/pull/2983 +* docs: Update xlang_serialization_spec.md by @chaokunyang in https://github.com/apache/fory/pull/2987 +* docs: update the C++ benchmark case by @LiangliangSui in https://github.com/apache/fory/pull/2988 +* chore(deps): bump gopkg.in/yaml.v3 from 3.0.0-20200313102051-9f266ea9e77c to 3.0.1 in /go/fory by @dependabot[bot] in https://github.com/apache/fory/pull/2996 +* chore: bump release version to 0.13.2 by @chaokunyang in https://github.com/apache/fory/pull/2997 +* chore(python): mark pyfory as stable by @chaokunyang in https://github.com/apache/fory/pull/3001 +* docs(c++): add cpp bazel example and add ci by @chaokunyang in https://github.com/apache/fory/pull/3033 +* docs: refactor user guide docs by @chaokunyang in https://github.com/apache/fory/pull/3036 +* docs: add scala and kotlin docs by @chaokunyang in https://github.com/apache/fory/pull/3040 +* docs: refactor xlang docs by @chaokunyang in https://github.com/apache/fory/pull/3041 +* docs: add row format spec by @chaokunyang in https://github.com/apache/fory/pull/3042 +* docs: fix sidebar position by @chaokunyang in https://github.com/apache/fory/pull/3043 +* docs: remove copy rust/python docs by @chaokunyang in https://github.com/apache/fory/pull/3044 + +## New Contributors +* @mosinnik made their first contribution in https://github.com/apache/fory/pull/2876 +* @prakash-218 made their first contribution in https://github.com/apache/fory/pull/2888 +* @zhan7236 made their first contribution in https://github.com/apache/fory/pull/2953 +* @mchernyakov made their first contribution in https://github.com/apache/fory/pull/2917 + + +**Full Changelog**: https://github.com/apache/fory/compare/v0.13.2...v0.14.0 \ No newline at end of file diff --git a/docs/docs/introduction/benchmark.md b/docs/docs/introduction/benchmark.md index 540e8e0b0..a9913d83b 100644 --- a/docs/docs/introduction/benchmark.md +++ b/docs/docs/introduction/benchmark.md @@ -47,6 +47,12 @@ Fory Rust demonstrates competitive performance compared to other Rust serializat Note: Results depend on hardware, dataset, and implementation versions. See the Rust guide for how to run benchmarks yourself: https://github.com/apache/fory/blob/main/benchmarks/rust_benchmark/README.md +## C++ Benchmark + +Fory C++ demonstrates competitive performance compared to Protobuf C++ serialization framework. + +<img src="public/benchmarks/cpp/throughput_comparison.png" width="90%"/> + ## JavaScript Benchmark <img width="33%" alt="" src="/img/benchmarks/javascript/complex_object.jpg" /> diff --git a/public/benchmarks/cpp/throughput_comparison.png b/public/benchmarks/cpp/throughput_comparison.png new file mode 100644 index 000000000..7e1e81ccd Binary files /dev/null and b/public/benchmarks/cpp/throughput_comparison.png differ --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
