This is an automated email from the ASF dual-hosted git repository.
chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git
The following commit(s) were added to refs/heads/main by this push:
new 96369b8cb docs(rust): update rust benchmark report table (#2836)
96369b8cb is described below
commit 96369b8cb26e702053d81756c5fe7447039b78d8
Author: Shawn Yang <[email protected]>
AuthorDate: Sun Oct 26 19:25:15 2025 +0800
docs(rust): update rust benchmark report table (#2836)
<!--
**Thanks for contributing to Apache Fory™.**
**If this is your first time opening a PR on fory, you can refer to
[CONTRIBUTING.md](https://github.com/apache/fory/blob/main/CONTRIBUTING.md).**
Contribution Checklist
- The **Apache Fory™** community has requirements on the naming of pr
titles. You can also find instructions in
[CONTRIBUTING.md](https://github.com/apache/fory/blob/main/CONTRIBUTING.md).
- Apache Fory™ has a strong focus on performance. If the PR you submit
will have an impact on performance, please benchmark it first and
provide the benchmark result here.
-->
## Why?
<!-- Describe the purpose of this PR. -->
## What does this PR do?
<!-- Describe the details of this PR. -->
## Related issues
<!--
Is there any related issue? If this PR closes them you say say
fix/closes:
- #xxxx0
- #xxxx1
- Fixes #xxxx2
-->
## Does this PR introduce any user-facing change?
<!--
If any user-facing interface changes, please [open an
issue](https://github.com/apache/fory/issues/new/choose) describing the
need to do so and update the document if necessary.
Delete section if not applicable.
-->
- [ ] Does this PR introduce any public API change?
- [ ] Does this PR introduce any binary protocol compatibility change?
## Benchmark
<!--
When the PR has an impact on performance (if you don't know whether the
PR will have an impact on performance, you can submit the PR first, and
if it will have impact on performance, the code reviewer will explain
it), be sure to attach a benchmark data here.
Delete section if not applicable.
-->
---
docs/benchmarks/rust/README.md | 60 ++++++++++++++++++++--------------------
rust/benches/README.md | 60 ++++++++++++++++++++--------------------
rust/benches/benchmark_report.py | 38 +++++++++----------------
3 files changed, 73 insertions(+), 85 deletions(-)
diff --git a/docs/benchmarks/rust/README.md b/docs/benchmarks/rust/README.md
index 22be785b2..02f6ccbaf 100644
--- a/docs/benchmarks/rust/README.md
+++ b/docs/benchmarks/rust/README.md
@@ -65,54 +65,54 @@ python benchmark_report.py --log-file cargo_bench.log
--output-dir=report_output
<img src="system_data.png" width="90%">
</p>
-### Serialize Results (sorted by fastest TPS)
+### Serialize Results
| Datatype | Size | Operation | Fory TPS | JSON TPS | Protobuf TPS
| Fastest |
| -------------- | ------ | --------- | ---------- | ---------- | ------------
| ------- |
-| simple_struct | small | serialize | 35,729,598 | 10,167,045 | 8,633,342
| fory |
-| simple_struct | medium | serialize | 34,988,279 | 9,737,098 | 6,433,350
| fory |
-| simple_struct | large | serialize | 31,801,558 | 4,545,041 | 7,420,049
| fory |
-| simple_list | small | serialize | 27,726,945 | 4,874,957 | 4,643,172
| fory |
-| simple_map | small | serialize | 22,862,369 | 3,888,025 | 2,695,999
| fory |
-| person | small | serialize | 13,632,522 | 1,345,189 | 1,475,035
| fory |
| company | small | serialize | 10,063,906 | 761,673 | 896,620
| fory |
-| system_data | small | serialize | 5,382,131 | 468,033 | 569,930
| fory |
-| simple_list | medium | serialize | 4,770,765 | 401,558 | 397,551
| fory |
-| person | medium | serialize | 3,839,656 | 337,610 | 369,031
| fory |
+| company | medium | serialize | 412,507 | 33,835 | 37,590
| fory |
+| company | large | serialize | 9,183 | 793 | 880
| fory |
| ecommerce_data | small | serialize | 2,350,729 | 206,262 | 256,970
| fory |
-| simple_map | medium | serialize | 2,128,973 | 204,319 | 193,132
| fory |
+| ecommerce_data | medium | serialize | 59,977 | 4,699 | 5,242
| fory |
+| ecommerce_data | large | serialize | 3,727 | 266 | 295
| fory |
+| person | small | serialize | 13,632,522 | 1,345,189 | 1,475,035
| fory |
+| person | medium | serialize | 3,839,656 | 337,610 | 369,031
| fory |
| person | large | serialize | 907,853 | 79,631 | 91,408
| fory |
+| simple_list | small | serialize | 27,726,945 | 4,874,957 | 4,643,172
| fory |
+| simple_list | medium | serialize | 4,770,765 | 401,558 | 397,551
| fory |
| simple_list | large | serialize | 606,061 | 41,061 | 44,565
| fory |
-| company | medium | serialize | 412,507 | 33,835 | 37,590
| fory |
+| simple_map | small | serialize | 22,862,369 | 3,888,025 | 2,695,999
| fory |
+| simple_map | medium | serialize | 2,128,973 | 204,319 | 193,132
| fory |
| simple_map | large | serialize | 177,847 | 18,419 | 18,668
| fory |
+| simple_struct | small | serialize | 35,729,598 | 10,167,045 | 8,633,342
| fory |
+| simple_struct | medium | serialize | 34,988,279 | 9,737,098 | 6,433,350
| fory |
+| simple_struct | large | serialize | 31,801,558 | 4,545,041 | 7,420,049
| fory |
+| system_data | small | serialize | 5,382,131 | 468,033 | 569,930
| fory |
| system_data | medium | serialize | 174,240 | 11,896 | 14,753
| fory |
-| ecommerce_data | medium | serialize | 59,977 | 4,699 | 5,242
| fory |
| system_data | large | serialize | 10,671 | 876 | 1,040
| fory |
-| company | large | serialize | 9,183 | 793 | 880
| fory |
-| ecommerce_data | large | serialize | 3,727 | 266 | 295
| fory |
-### Deserialize Results (sorted by fastest TPS)
+### Deserialize Results
| Datatype | Size | Operation | Fory TPS | JSON TPS | Protobuf
TPS | Fastest |
| -------------- | ------ | ----------- | ---------- | ---------- |
------------ | ------- |
-| simple_struct | small | deserialize | 31,476,235 | 12,948,168 | 28,280,543
| fory |
-| simple_struct | medium | deserialize | 30,077,902 | 10,431,118 | 23,012,841
| fory |
-| simple_struct | large | deserialize | 28,201,585 | 8,955,759 | 23,528,858
| fory |
-| simple_list | small | deserialize | 6,129,329 | 3,599,582 | 4,429,286
| fory |
-| simple_map | small | deserialize | 3,686,364 | 3,090,426 | 3,477,051
| fory |
-| person | small | deserialize | 1,924,372 | 1,214,388 | 1,675,631
| fory |
| company | small | deserialize | 1,145,593 | 718,597 | 917,431
| fory |
-| system_data | small | deserialize | 644,870 | 421,106 | 549,209
| fory |
-| simple_list | medium | deserialize | 460,745 | 305,409 | 337,336
| fory |
-| person | medium | deserialize | 371,016 | 265,280 | 266,333
| fory |
+| company | medium | deserialize | 35,195 | 24,474 | 25,057
| fory |
+| company | large | deserialize | 836 | 623 | 623
| fory |
| ecommerce_data | small | deserialize | 278,427 | 183,237 | 241,109
| fory |
-| simple_map | medium | deserialize | 171,774 | 126,638 | 119,323
| fory |
+| ecommerce_data | medium | deserialize | 5,622 | 3,820 | 4,249
| fory |
+| ecommerce_data | large | deserialize | 298 | 204 | 217
| fory |
+| person | small | deserialize | 1,924,372 | 1,214,388 | 1,675,631
| fory |
+| person | medium | deserialize | 371,016 | 265,280 | 266,333
| fory |
| person | large | deserialize | 84,839 | 63,975 | 61,820
| fory |
+| simple_list | small | deserialize | 6,129,329 | 3,599,582 | 4,429,286
| fory |
+| simple_list | medium | deserialize | 460,745 | 305,409 | 337,336
| fory |
| simple_list | large | deserialize | 54,348 | 33,962 | 38,776
| fory |
-| company | medium | deserialize | 35,195 | 24,474 | 25,057
| fory |
+| simple_map | small | deserialize | 3,686,364 | 3,090,426 | 3,477,051
| fory |
+| simple_map | medium | deserialize | 171,774 | 126,638 | 119,323
| fory |
| simple_map | large | deserialize | 16,501 | 10,920 | 10,853
| fory |
+| simple_struct | small | deserialize | 31,476,235 | 12,948,168 | 28,280,543
| fory |
+| simple_struct | medium | deserialize | 30,077,902 | 10,431,118 | 23,012,841
| fory |
+| simple_struct | large | deserialize | 28,201,585 | 8,955,759 | 23,528,858
| fory |
+| system_data | small | deserialize | 644,870 | 421,106 | 549,209
| fory |
| system_data | medium | deserialize | 14,322 | 9,205 | 10,565
| fory |
-| ecommerce_data | medium | deserialize | 5,622 | 3,820 | 4,249
| fory |
| system_data | large | deserialize | 961 | 634 | 706
| fory |
-| company | large | deserialize | 836 | 623 | 623
| fory |
-| ecommerce_data | large | deserialize | 298 | 204 | 217
| fory |
diff --git a/rust/benches/README.md b/rust/benches/README.md
index 74435ae5e..77db4c367 100644
--- a/rust/benches/README.md
+++ b/rust/benches/README.md
@@ -65,57 +65,57 @@ python benchmark_report.py --log-file cargo_bench.log
--output-dir=report_output
<img src="../../docs/benchmarks/rust/system_data.png" width="90%">
</p>
-### Serialize Results (sorted by fastest TPS)
+### Serialize Results
| Datatype | Size | Operation | Fory TPS | JSON TPS | Protobuf TPS
| Fastest |
| -------------- | ------ | --------- | ---------- | ---------- | ------------
| ------- |
-| simple_struct | small | serialize | 35,729,598 | 10,167,045 | 8,633,342
| fory |
-| simple_struct | medium | serialize | 34,988,279 | 9,737,098 | 6,433,350
| fory |
-| simple_struct | large | serialize | 31,801,558 | 4,545,041 | 7,420,049
| fory |
-| simple_list | small | serialize | 27,726,945 | 4,874,957 | 4,643,172
| fory |
-| simple_map | small | serialize | 22,862,369 | 3,888,025 | 2,695,999
| fory |
-| person | small | serialize | 13,632,522 | 1,345,189 | 1,475,035
| fory |
| company | small | serialize | 10,063,906 | 761,673 | 896,620
| fory |
-| system_data | small | serialize | 5,382,131 | 468,033 | 569,930
| fory |
-| simple_list | medium | serialize | 4,770,765 | 401,558 | 397,551
| fory |
-| person | medium | serialize | 3,839,656 | 337,610 | 369,031
| fory |
+| company | medium | serialize | 412,507 | 33,835 | 37,590
| fory |
+| company | large | serialize | 9,183 | 793 | 880
| fory |
| ecommerce_data | small | serialize | 2,350,729 | 206,262 | 256,970
| fory |
-| simple_map | medium | serialize | 2,128,973 | 204,319 | 193,132
| fory |
+| ecommerce_data | medium | serialize | 59,977 | 4,699 | 5,242
| fory |
+| ecommerce_data | large | serialize | 3,727 | 266 | 295
| fory |
+| person | small | serialize | 13,632,522 | 1,345,189 | 1,475,035
| fory |
+| person | medium | serialize | 3,839,656 | 337,610 | 369,031
| fory |
| person | large | serialize | 907,853 | 79,631 | 91,408
| fory |
+| simple_list | small | serialize | 27,726,945 | 4,874,957 | 4,643,172
| fory |
+| simple_list | medium | serialize | 4,770,765 | 401,558 | 397,551
| fory |
| simple_list | large | serialize | 606,061 | 41,061 | 44,565
| fory |
-| company | medium | serialize | 412,507 | 33,835 | 37,590
| fory |
+| simple_map | small | serialize | 22,862,369 | 3,888,025 | 2,695,999
| fory |
+| simple_map | medium | serialize | 2,128,973 | 204,319 | 193,132
| fory |
| simple_map | large | serialize | 177,847 | 18,419 | 18,668
| fory |
+| simple_struct | small | serialize | 35,729,598 | 10,167,045 | 8,633,342
| fory |
+| simple_struct | medium | serialize | 34,988,279 | 9,737,098 | 6,433,350
| fory |
+| simple_struct | large | serialize | 31,801,558 | 4,545,041 | 7,420,049
| fory |
+| system_data | small | serialize | 5,382,131 | 468,033 | 569,930
| fory |
| system_data | medium | serialize | 174,240 | 11,896 | 14,753
| fory |
-| ecommerce_data | medium | serialize | 59,977 | 4,699 | 5,242
| fory |
| system_data | large | serialize | 10,671 | 876 | 1,040
| fory |
-| company | large | serialize | 9,183 | 793 | 880
| fory |
-| ecommerce_data | large | serialize | 3,727 | 266 | 295
| fory |
-### Deserialize Results (sorted by fastest TPS)
+### Deserialize Results
| Datatype | Size | Operation | Fory TPS | JSON TPS | Protobuf
TPS | Fastest |
| -------------- | ------ | ----------- | ---------- | ---------- |
------------ | ------- |
-| simple_struct | small | deserialize | 31,476,235 | 12,948,168 | 28,280,543
| fory |
-| simple_struct | medium | deserialize | 30,077,902 | 10,431,118 | 23,012,841
| fory |
-| simple_struct | large | deserialize | 28,201,585 | 8,955,759 | 23,528,858
| fory |
-| simple_list | small | deserialize | 6,129,329 | 3,599,582 | 4,429,286
| fory |
-| simple_map | small | deserialize | 3,686,364 | 3,090,426 | 3,477,051
| fory |
-| person | small | deserialize | 1,924,372 | 1,214,388 | 1,675,631
| fory |
| company | small | deserialize | 1,145,593 | 718,597 | 917,431
| fory |
-| system_data | small | deserialize | 644,870 | 421,106 | 549,209
| fory |
-| simple_list | medium | deserialize | 460,745 | 305,409 | 337,336
| fory |
-| person | medium | deserialize | 371,016 | 265,280 | 266,333
| fory |
+| company | medium | deserialize | 35,195 | 24,474 | 25,057
| fory |
+| company | large | deserialize | 836 | 623 | 623
| fory |
| ecommerce_data | small | deserialize | 278,427 | 183,237 | 241,109
| fory |
-| simple_map | medium | deserialize | 171,774 | 126,638 | 119,323
| fory |
+| ecommerce_data | medium | deserialize | 5,622 | 3,820 | 4,249
| fory |
+| ecommerce_data | large | deserialize | 298 | 204 | 217
| fory |
+| person | small | deserialize | 1,924,372 | 1,214,388 | 1,675,631
| fory |
+| person | medium | deserialize | 371,016 | 265,280 | 266,333
| fory |
| person | large | deserialize | 84,839 | 63,975 | 61,820
| fory |
+| simple_list | small | deserialize | 6,129,329 | 3,599,582 | 4,429,286
| fory |
+| simple_list | medium | deserialize | 460,745 | 305,409 | 337,336
| fory |
| simple_list | large | deserialize | 54,348 | 33,962 | 38,776
| fory |
-| company | medium | deserialize | 35,195 | 24,474 | 25,057
| fory |
+| simple_map | small | deserialize | 3,686,364 | 3,090,426 | 3,477,051
| fory |
+| simple_map | medium | deserialize | 171,774 | 126,638 | 119,323
| fory |
| simple_map | large | deserialize | 16,501 | 10,920 | 10,853
| fory |
+| simple_struct | small | deserialize | 31,476,235 | 12,948,168 | 28,280,543
| fory |
+| simple_struct | medium | deserialize | 30,077,902 | 10,431,118 | 23,012,841
| fory |
+| simple_struct | large | deserialize | 28,201,585 | 8,955,759 | 23,528,858
| fory |
+| system_data | small | deserialize | 644,870 | 421,106 | 549,209
| fory |
| system_data | medium | deserialize | 14,322 | 9,205 | 10,565
| fory |
-| ecommerce_data | medium | deserialize | 5,622 | 3,820 | 4,249
| fory |
| system_data | large | deserialize | 961 | 634 | 706
| fory |
-| company | large | deserialize | 836 | 623 | 623
| fory |
-| ecommerce_data | large | deserialize | 298 | 204 | 217
| fory |
## How to generate flamegraph
diff --git a/rust/benches/benchmark_report.py b/rust/benches/benchmark_report.py
index e9530a016..8cfc05305 100644
--- a/rust/benches/benchmark_report.py
+++ b/rust/benches/benchmark_report.py
@@ -58,7 +58,7 @@ else:
os.makedirs(output_dir, exist_ok=True)
-# === Data structure ===
+# === Data storage ===
data = defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))
# === Read and parse benchmark log ===
@@ -106,7 +106,7 @@ deserialize_rows = []
plot_images = []
-# === Plotting function ===
+# === Plot a datatype's sizes ===
def plot_datatype(ax, struct, size):
if size not in data[struct]:
ax.set_title(f"{size} {struct} - No Data")
@@ -137,7 +137,7 @@ def plot_datatype(ax, struct, size):
if size == "small":
ax.set_ylabel("TPS (ops/sec)")
- # For Markdown tables
+ # Add to markdown table data
for op in ops_present:
f_tps = data[struct][size][op].get("fory", 0)
j_tps = data[struct][size][op].get("json", 0)
@@ -146,16 +146,16 @@ def plot_datatype(ax, struct, size):
[("fory", f_tps), ("json", j_tps), ("protobuf", p_tps)],
key=lambda kv: kv[1],
)
- row = (struct, size, op, f_tps, j_tps, p_tps, fastest_lib, fastest_val)
+ row = (struct, size, op, f_tps, j_tps, p_tps, fastest_lib)
if op == "serialize":
serialize_rows.append(row)
else:
deserialize_rows.append(row)
-# === Main plotting loop ===
+# === Create plots ===
for struct in sorted(data.keys()):
- fig, axes = plt.subplots(1, 3, figsize=(18, 5), sharey=False) # No
suptitle
+ fig, axes = plt.subplots(1, 3, figsize=(18, 5), sharey=False)
for si, size in enumerate(sizes):
plot_datatype(axes[si], struct, size)
fig.tight_layout(rect=[0, 0, 1, 0.95])
@@ -164,20 +164,10 @@ for struct in sorted(data.keys()):
plot_images.append((struct, plot_path))
plt.close()
-# === Sort tables ===
-serialize_rows.sort(key=lambda r: r[7], reverse=True)
-deserialize_rows.sort(key=lambda r: r[7], reverse=True)
-
# === Markdown report ===
md_report = [
- "## Performance Comparison Report\n",
+ "# Performance Comparison Report\n",
f"_Generated on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}_\n",
- "How to generate performance report:\n",
- "```bash\n",
- "cd rust/benches\n",
- "cargo bench 2>&1 | tee cargo_bench.log\n",
- "python benchmark_report.py --log-file cargo_bench.log
--output-dir=report_output\n",
- "```\n",
"\n### Hardware & OS Info\n",
"| Key | Value |\n",
"|-----|-------|\n",
@@ -185,6 +175,7 @@ md_report = [
for k, v in system_info.items():
md_report.append(f"| {k} | {v} |\n")
+# Plots section
md_report.append("\n### Benchmark Plots\n")
for struct, img in plot_images:
img_filename = os.path.basename(img)
@@ -195,6 +186,7 @@ for struct, img in plot_images:
)
+# Tables section
def table_section(title, rows):
md = [f"\n### {title}\n"]
md.append(
@@ -203,21 +195,17 @@ def table_section(title, rows):
md.append(
"|----------|------|-----------|----------|----------|--------------|---------|\n"
)
- for struct, size, op, f_tps, j_tps, p_tps, fastest_lib, fastest_val in
rows:
+ for struct, size, op, f_tps, j_tps, p_tps, fastest_lib in rows:
md.append(
f"| {struct} | {size} | {op} | {f_tps:,.0f} | {j_tps:,.0f} |
{p_tps:,.0f} | {fastest_lib} |\n"
)
return md
-md_report.extend(
- table_section("Serialize Results (sorted by fastest TPS)", serialize_rows)
-)
-md_report.extend(
- table_section("Deserialize Results (sorted by fastest TPS)",
deserialize_rows)
-)
+md_report.extend(table_section("Serialize Results", serialize_rows))
+md_report.extend(table_section("Deserialize Results", deserialize_rows))
-# === Save Markdown ===
+# Save Markdown
report_path = os.path.join(output_dir, "README.md")
with open(report_path, "w", encoding="utf-8") as f:
f.writelines(md_report)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]