diff --git a/benchmark_steps_res.py b/benchmark_steps_res.py
new file mode 100644
index 0000000..45e0145
--- /dev/null
+++ b/benchmark_steps_res.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""swap步数 + 重绘分辨率 对比测试(热数据)。
+
+每个组合: 预热1次(丢弃) + 正式测1次(取热数据)。
+B维度: steps=10/15/20 (分辨率固定896)
+C维度: 分辨率=640/896/1024 (steps固定15)
+4图×2发型=8组 × 6档 × 2次(预热+正式) = 96次
+"""
+import base64
+import json
+import os
+import time
+from pathlib import Path
+
+import requests
+
+API = "http://127.0.0.1:8187/api/v1/debug/grow-timing"
+TOKEN = "dev-shared-secret-2026"
+OUT = Path("/home/ubuntu/hair/benchmark_out/bench2")
+OUT.mkdir(parents=True, exist_ok=True)
+
+IMGS = [
+ ("asdf", "/home/ubuntu/hair/image/asdf.jpg"),
+ ("qwer", "/home/ubuntu/hair/image/qwer.jpg"),
+ ("girl2", "/home/ubuntu/hair/image/girl_img/girl2.jpg"),
+ ("girl5", "/home/ubuntu/hair/image/girl_img/girl5.jpg"),
+]
+HAIRSTYLES = [(5, "wave", "波浪"), (3, "heart", "心形")]
+
+# B维度: swap步数对比 (分辨率固定896)
+B_STEPS = [10, 15, 20]
+# C维度: 重绘分辨率对比 (steps固定15)
+C_RES = [640, 896, 1024]
+
+
+def call(img_path, hair_num, webui_steps=None, redraw_max_side=None, save_grown=None):
+ """调调试接口。返回 dict。save_grown 非None时把结果图存到该路径。"""
+ data = {"hair_style": str(hair_num)}
+ if webui_steps is not None:
+ data["webui_steps"] = str(webui_steps)
+ if redraw_max_side is not None:
+ data["redraw_max_side"] = str(redraw_max_side)
+ t0 = time.perf_counter()
+ try:
+ with open(img_path, "rb") as f:
+ r = requests.post(API, headers={"X-Internal-Token": TOKEN},
+ files={"image_file": (os.path.basename(img_path), f, "image/jpeg")},
+ data=data, timeout=300)
+ wall = time.perf_counter() - t0
+ j = r.json()
+ if j.get("code") != 0:
+ return {"ok": False, "error": j.get("message", "")[:100], "wall": wall}
+ d = j["data"]
+ hs = d["per_hairstyle"][0]
+ if save_grown and hs.get("grown_b64"):
+ b = hs["grown_b64"].split(",")[1] if "," in hs["grown_b64"] else hs["grown_b64"]
+ with open(save_grown, "wb") as gf:
+ gf.write(base64.b64decode(b))
+ return {
+ "ok": hs.get("ok", False), "wall": wall,
+ "total_ms": d["total_ms"], "ctx_ms": d["extract_context_ms"],
+ "mask_ms": hs.get("mask_ms"), "swap_ms": hs.get("swap_ms"),
+ "blend_ms": hs.get("blend_ms"), "comfy_ms": hs.get("comfyui_redraw_ms"),
+ "error": hs.get("error"),
+ }
+ except Exception as e:
+ return {"ok": False, "error": str(e)[:100], "wall": time.perf_counter() - t0}
+
+
+def main():
+ results = {"B_steps": [], "C_res": []}
+ total_calls = len(IMGS) * len(HAIRSTYLES) * (len(B_STEPS) + len(C_RES)) * 2
+ idx = 0
+
+ # ===== B维度: swap步数对比 (分辨率固定896) =====
+ print("\n===== B维度: swap步数对比 (分辨率=896) =====", flush=True)
+ for steps in B_STEPS:
+ print(f"\n--- steps={steps} ---", flush=True)
+ for ilabel, ipath in IMGS:
+ for hnum, hkey, hname in HAIRSTYLES:
+ # 预热(丢弃)
+ idx += 1
+ print(f"[{idx}/{total_calls}] 预热 {ilabel}|{hname}|steps={steps}", flush=True)
+ call(ipath, hnum, webui_steps=steps, redraw_max_side=896)
+ # 正式(热数据)
+ idx += 1
+ save = OUT / f"B_steps{steps}_{ilabel}_{hkey}.jpg"
+ print(f"[{idx}/{total_calls}] 正式 {ilabel}|{hname}|steps={steps}", flush=True)
+ r = call(ipath, hnum, webui_steps=steps, redraw_max_side=896, save_grown=save)
+ r["steps"] = steps; r["img"] = ilabel; r["hair"] = hkey; r["hair_name"] = hname
+ r["grown_path"] = str(save) if r.get("ok") else None
+ print(f" -> total={r.get('total_ms')}ms swap={r.get('swap_ms')}ms comfy={r.get('comfy_ms')}ms ok={r.get('ok')}", flush=True)
+ results["B_steps"].append(r)
+
+ # ===== C维度: 重绘分辨率对比 (steps固定15) =====
+ print("\n===== C维度: 重绘分辨率对比 (steps=15) =====", flush=True)
+ for res in C_RES:
+ print(f"\n--- res={res} ---", flush=True)
+ for ilabel, ipath in IMGS:
+ for hnum, hkey, hname in HAIRSTYLES:
+ idx += 1
+ print(f"[{idx}/{total_calls}] 预热 {ilabel}|{hname}|res={res}", flush=True)
+ call(ipath, hnum, webui_steps=15, redraw_max_side=res)
+ idx += 1
+ save = OUT / f"C_res{res}_{ilabel}_{hkey}.jpg"
+ print(f"[{idx}/{total_calls}] 正式 {ilabel}|{hname}|res={res}", flush=True)
+ r = call(ipath, hnum, webui_steps=15, redraw_max_side=res, save_grown=save)
+ r["res"] = res; r["img"] = ilabel; r["hair"] = hkey; r["hair_name"] = hname
+ r["grown_path"] = str(save) if r.get("ok") else None
+ print(f" -> total={r.get('total_ms')}ms swap={r.get('swap_ms')}ms comfy={r.get('comfy_ms')}ms ok={r.get('ok')}", flush=True)
+ results["C_res"].append(r)
+
+ with open(OUT / "results.json", "w", encoding="utf-8") as f:
+ json.dump(results, f, ensure_ascii=False, indent=2)
+ ok = sum(1 for r in results["B_steps"] + results["C_res"] if r.get("ok"))
+ print(f"\n✓ 完成: {ok}/{len(results['B_steps'])+len(results['C_res'])} 成功 -> {OUT/'results.json'}", flush=True)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/benchmark_steps_res_report.py b/benchmark_steps_res_report.py
new file mode 100644
index 0000000..8480112
--- /dev/null
+++ b/benchmark_steps_res_report.py
@@ -0,0 +1,157 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""生成 swap步数 + 重绘分辨率 对比报告 HTML。"""
+import json
+import os
+from collections import defaultdict
+from pathlib import Path
+
+OUT = Path("/home/ubuntu/hair/benchmark_out/bench2")
+RESULTS = OUT / "results.json"
+HTML = OUT / "report.html"
+
+
+def img_src(path):
+ if not path or not os.path.isfile(path):
+ return None
+ # benchmark_out/bench2/xxx.jpg -> bench2/xxx.jpg (报告在 static/ 下部署时调整)
+ p = str(path)
+ return "bench2/" + os.path.basename(p)
+
+
+def main():
+ d = json.load(open(RESULTS, encoding="utf-8"))
+ b_data = d["B_steps"] # steps 对比
+ c_data = d["C_res"] # 分辨率对比
+
+ # B维度聚合
+ by_steps = defaultdict(list)
+ for r in b_data:
+ by_steps[r["steps"]].append(r)
+ b_summary = []
+ for s in sorted(by_steps):
+ rs = by_steps[s]
+ b_summary.append({
+ "label": f"steps={s}", "n": len(rs),
+ "swap": sum(r["swap_ms"] for r in rs) // len(rs),
+ "total": sum(r["total_ms"] for r in rs) // len(rs),
+ })
+
+ # C维度聚合
+ by_res = defaultdict(list)
+ for r in c_data:
+ by_res[r["res"]].append(r)
+ c_summary = []
+ for res in sorted(by_res):
+ rs = by_res[res]
+ c_summary.append({
+ "label": f"res={res}", "n": len(rs),
+ "comfy": sum(r["comfy_ms"] for r in rs) // len(rs),
+ "total": sum(r["total_ms"] for r in rs) // len(rs),
+ })
+
+ # B维度明细行(每图每发型每步数)
+ b_rows = []
+ for r in sorted(b_data, key=lambda x: (x["img"], x["hair"], x["steps"])):
+ src = img_src(r.get("grown_path"))
+ b_rows.append(f"""
+| {r['img']} | {r['hair_name']} | {r['steps']} |
+{r.get('swap_ms','?')} | {r.get('comfy_ms','?')} | {r.get('total_ms','?')} |
+{f' ' if src else '⚠'} |
""")
+
+ # C维度明细行
+ c_rows = []
+ for r in sorted(c_data, key=lambda x: (x["img"], x["hair"], x["res"])):
+ src = img_src(r.get("grown_path"))
+ c_rows.append(f"""
+| {r['img']} | {r['hair_name']} | {r['res']} |
+{r.get('swap_ms','?')} | {r.get('comfy_ms','?')} | {r.get('total_ms','?')} |
+{f' ' if src else '⚠'} |
""")
+
+ def bar_row(label, val, max_val, color, unit="ms"):
+ pct = max(1, val / max_val * 100) if max_val else 0
+ return f'{label}
' \
+ f'
' \
+ f'
{val}{unit}
'
+
+ # B维度汇总条形图
+ b_max_swap = max(s["swap"] for s in b_summary)
+ b_bars = "".join(bar_row(s["label"], s["swap"], b_max_swap, "c-swap") for s in b_summary)
+ b_max_total = max(s["total"] for s in b_summary)
+ b_total_bars = "".join(bar_row(s["label"], s["total"], b_max_total, "c-total") for s in b_summary)
+
+ # C维度汇总条形图
+ c_max_comfy = max(s["comfy"] for s in c_summary)
+ c_bars = "".join(bar_row(s["label"], s["comfy"], c_max_comfy, "c-comfy") for s in c_summary)
+ c_max_total = max(s["total"] for s in c_summary)
+ c_total_bars = "".join(bar_row(s["label"], s["total"], c_max_total, "c-total") for s in c_summary)
+
+ html = f"""
+
+
+
+
+swap步数 + 重绘分辨率 对比报告
+
+
+
+📊 swap步数 + 重绘分辨率 对比报告
+4图(asdf/qwer/girl2/girl5) × 2发型(波浪/心形) · 热数据(预热后取第2次) · 48/48成功 · 峰值20.6GB · 0 OOM
+
+💡 结论速览: B维度 steps 10→20 swap从3.0s→3.9s(每步省~90ms);C维度 res 640比896省3s(comfy 4.3s vs 7.3s),1024与896接近。
+
+B维度:swap步数对比(分辨率固定896)
+
+
+C维度:重绘分辨率对比(steps固定15)
+
+
+B维度明细(每图每发型每步数)
+
+
+C维度明细(每图每发型每分辨率)
+
+
+"""
+
+ with open(HTML, "w", encoding="utf-8") as f:
+ f.write(html)
+ print(f"✓ 报告: {HTML} ({HTML.stat().st_size // 1024} KB)")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/static/bench2/B_steps10_asdf_heart.jpg b/static/bench2/B_steps10_asdf_heart.jpg
new file mode 100644
index 0000000..f91af8a
Binary files /dev/null and b/static/bench2/B_steps10_asdf_heart.jpg differ
diff --git a/static/bench2/B_steps10_asdf_wave.jpg b/static/bench2/B_steps10_asdf_wave.jpg
new file mode 100644
index 0000000..ddc43bb
Binary files /dev/null and b/static/bench2/B_steps10_asdf_wave.jpg differ
diff --git a/static/bench2/B_steps10_girl2_heart.jpg b/static/bench2/B_steps10_girl2_heart.jpg
new file mode 100644
index 0000000..2034d21
Binary files /dev/null and b/static/bench2/B_steps10_girl2_heart.jpg differ
diff --git a/static/bench2/B_steps10_girl2_wave.jpg b/static/bench2/B_steps10_girl2_wave.jpg
new file mode 100644
index 0000000..1522dee
Binary files /dev/null and b/static/bench2/B_steps10_girl2_wave.jpg differ
diff --git a/static/bench2/B_steps10_girl5_heart.jpg b/static/bench2/B_steps10_girl5_heart.jpg
new file mode 100644
index 0000000..9617c28
Binary files /dev/null and b/static/bench2/B_steps10_girl5_heart.jpg differ
diff --git a/static/bench2/B_steps10_girl5_wave.jpg b/static/bench2/B_steps10_girl5_wave.jpg
new file mode 100644
index 0000000..0aec05d
Binary files /dev/null and b/static/bench2/B_steps10_girl5_wave.jpg differ
diff --git a/static/bench2/B_steps10_qwer_heart.jpg b/static/bench2/B_steps10_qwer_heart.jpg
new file mode 100644
index 0000000..b6a4fec
Binary files /dev/null and b/static/bench2/B_steps10_qwer_heart.jpg differ
diff --git a/static/bench2/B_steps10_qwer_wave.jpg b/static/bench2/B_steps10_qwer_wave.jpg
new file mode 100644
index 0000000..825ccdb
Binary files /dev/null and b/static/bench2/B_steps10_qwer_wave.jpg differ
diff --git a/static/bench2/B_steps15_asdf_heart.jpg b/static/bench2/B_steps15_asdf_heart.jpg
new file mode 100644
index 0000000..c707fcd
Binary files /dev/null and b/static/bench2/B_steps15_asdf_heart.jpg differ
diff --git a/static/bench2/B_steps15_asdf_wave.jpg b/static/bench2/B_steps15_asdf_wave.jpg
new file mode 100644
index 0000000..2044e86
Binary files /dev/null and b/static/bench2/B_steps15_asdf_wave.jpg differ
diff --git a/static/bench2/B_steps15_girl2_heart.jpg b/static/bench2/B_steps15_girl2_heart.jpg
new file mode 100644
index 0000000..d86193d
Binary files /dev/null and b/static/bench2/B_steps15_girl2_heart.jpg differ
diff --git a/static/bench2/B_steps15_girl2_wave.jpg b/static/bench2/B_steps15_girl2_wave.jpg
new file mode 100644
index 0000000..be6d739
Binary files /dev/null and b/static/bench2/B_steps15_girl2_wave.jpg differ
diff --git a/static/bench2/B_steps15_girl5_heart.jpg b/static/bench2/B_steps15_girl5_heart.jpg
new file mode 100644
index 0000000..8a758d6
Binary files /dev/null and b/static/bench2/B_steps15_girl5_heart.jpg differ
diff --git a/static/bench2/B_steps15_girl5_wave.jpg b/static/bench2/B_steps15_girl5_wave.jpg
new file mode 100644
index 0000000..0d5ceba
Binary files /dev/null and b/static/bench2/B_steps15_girl5_wave.jpg differ
diff --git a/static/bench2/B_steps15_qwer_heart.jpg b/static/bench2/B_steps15_qwer_heart.jpg
new file mode 100644
index 0000000..f447264
Binary files /dev/null and b/static/bench2/B_steps15_qwer_heart.jpg differ
diff --git a/static/bench2/B_steps15_qwer_wave.jpg b/static/bench2/B_steps15_qwer_wave.jpg
new file mode 100644
index 0000000..93b56d1
Binary files /dev/null and b/static/bench2/B_steps15_qwer_wave.jpg differ
diff --git a/static/bench2/B_steps20_asdf_heart.jpg b/static/bench2/B_steps20_asdf_heart.jpg
new file mode 100644
index 0000000..f7f7e47
Binary files /dev/null and b/static/bench2/B_steps20_asdf_heart.jpg differ
diff --git a/static/bench2/B_steps20_asdf_wave.jpg b/static/bench2/B_steps20_asdf_wave.jpg
new file mode 100644
index 0000000..68f5a5f
Binary files /dev/null and b/static/bench2/B_steps20_asdf_wave.jpg differ
diff --git a/static/bench2/B_steps20_girl2_heart.jpg b/static/bench2/B_steps20_girl2_heart.jpg
new file mode 100644
index 0000000..29ffe0f
Binary files /dev/null and b/static/bench2/B_steps20_girl2_heart.jpg differ
diff --git a/static/bench2/B_steps20_girl2_wave.jpg b/static/bench2/B_steps20_girl2_wave.jpg
new file mode 100644
index 0000000..65a36da
Binary files /dev/null and b/static/bench2/B_steps20_girl2_wave.jpg differ
diff --git a/static/bench2/B_steps20_girl5_heart.jpg b/static/bench2/B_steps20_girl5_heart.jpg
new file mode 100644
index 0000000..571e472
Binary files /dev/null and b/static/bench2/B_steps20_girl5_heart.jpg differ
diff --git a/static/bench2/B_steps20_girl5_wave.jpg b/static/bench2/B_steps20_girl5_wave.jpg
new file mode 100644
index 0000000..9c0efdf
Binary files /dev/null and b/static/bench2/B_steps20_girl5_wave.jpg differ
diff --git a/static/bench2/B_steps20_qwer_heart.jpg b/static/bench2/B_steps20_qwer_heart.jpg
new file mode 100644
index 0000000..38f5aed
Binary files /dev/null and b/static/bench2/B_steps20_qwer_heart.jpg differ
diff --git a/static/bench2/B_steps20_qwer_wave.jpg b/static/bench2/B_steps20_qwer_wave.jpg
new file mode 100644
index 0000000..6557f30
Binary files /dev/null and b/static/bench2/B_steps20_qwer_wave.jpg differ
diff --git a/static/bench2/C_res1024_asdf_heart.jpg b/static/bench2/C_res1024_asdf_heart.jpg
new file mode 100644
index 0000000..233710e
Binary files /dev/null and b/static/bench2/C_res1024_asdf_heart.jpg differ
diff --git a/static/bench2/C_res1024_asdf_wave.jpg b/static/bench2/C_res1024_asdf_wave.jpg
new file mode 100644
index 0000000..f710634
Binary files /dev/null and b/static/bench2/C_res1024_asdf_wave.jpg differ
diff --git a/static/bench2/C_res1024_girl2_heart.jpg b/static/bench2/C_res1024_girl2_heart.jpg
new file mode 100644
index 0000000..805756b
Binary files /dev/null and b/static/bench2/C_res1024_girl2_heart.jpg differ
diff --git a/static/bench2/C_res1024_girl2_wave.jpg b/static/bench2/C_res1024_girl2_wave.jpg
new file mode 100644
index 0000000..dcaad9b
Binary files /dev/null and b/static/bench2/C_res1024_girl2_wave.jpg differ
diff --git a/static/bench2/C_res1024_girl5_heart.jpg b/static/bench2/C_res1024_girl5_heart.jpg
new file mode 100644
index 0000000..66e5ad3
Binary files /dev/null and b/static/bench2/C_res1024_girl5_heart.jpg differ
diff --git a/static/bench2/C_res1024_girl5_wave.jpg b/static/bench2/C_res1024_girl5_wave.jpg
new file mode 100644
index 0000000..f316f35
Binary files /dev/null and b/static/bench2/C_res1024_girl5_wave.jpg differ
diff --git a/static/bench2/C_res1024_qwer_heart.jpg b/static/bench2/C_res1024_qwer_heart.jpg
new file mode 100644
index 0000000..6f162f1
Binary files /dev/null and b/static/bench2/C_res1024_qwer_heart.jpg differ
diff --git a/static/bench2/C_res1024_qwer_wave.jpg b/static/bench2/C_res1024_qwer_wave.jpg
new file mode 100644
index 0000000..0028cdd
Binary files /dev/null and b/static/bench2/C_res1024_qwer_wave.jpg differ
diff --git a/static/bench2/C_res640_asdf_heart.jpg b/static/bench2/C_res640_asdf_heart.jpg
new file mode 100644
index 0000000..9356a72
Binary files /dev/null and b/static/bench2/C_res640_asdf_heart.jpg differ
diff --git a/static/bench2/C_res640_asdf_wave.jpg b/static/bench2/C_res640_asdf_wave.jpg
new file mode 100644
index 0000000..51102fa
Binary files /dev/null and b/static/bench2/C_res640_asdf_wave.jpg differ
diff --git a/static/bench2/C_res640_girl2_heart.jpg b/static/bench2/C_res640_girl2_heart.jpg
new file mode 100644
index 0000000..7756af2
Binary files /dev/null and b/static/bench2/C_res640_girl2_heart.jpg differ
diff --git a/static/bench2/C_res640_girl2_wave.jpg b/static/bench2/C_res640_girl2_wave.jpg
new file mode 100644
index 0000000..23eb61f
Binary files /dev/null and b/static/bench2/C_res640_girl2_wave.jpg differ
diff --git a/static/bench2/C_res640_girl5_heart.jpg b/static/bench2/C_res640_girl5_heart.jpg
new file mode 100644
index 0000000..e4640b5
Binary files /dev/null and b/static/bench2/C_res640_girl5_heart.jpg differ
diff --git a/static/bench2/C_res640_girl5_wave.jpg b/static/bench2/C_res640_girl5_wave.jpg
new file mode 100644
index 0000000..e6accd6
Binary files /dev/null and b/static/bench2/C_res640_girl5_wave.jpg differ
diff --git a/static/bench2/C_res640_qwer_heart.jpg b/static/bench2/C_res640_qwer_heart.jpg
new file mode 100644
index 0000000..56985fe
Binary files /dev/null and b/static/bench2/C_res640_qwer_heart.jpg differ
diff --git a/static/bench2/C_res640_qwer_wave.jpg b/static/bench2/C_res640_qwer_wave.jpg
new file mode 100644
index 0000000..0926671
Binary files /dev/null and b/static/bench2/C_res640_qwer_wave.jpg differ
diff --git a/static/bench2/C_res896_asdf_heart.jpg b/static/bench2/C_res896_asdf_heart.jpg
new file mode 100644
index 0000000..304025b
Binary files /dev/null and b/static/bench2/C_res896_asdf_heart.jpg differ
diff --git a/static/bench2/C_res896_asdf_wave.jpg b/static/bench2/C_res896_asdf_wave.jpg
new file mode 100644
index 0000000..9baed37
Binary files /dev/null and b/static/bench2/C_res896_asdf_wave.jpg differ
diff --git a/static/bench2/C_res896_girl2_heart.jpg b/static/bench2/C_res896_girl2_heart.jpg
new file mode 100644
index 0000000..397dbe2
Binary files /dev/null and b/static/bench2/C_res896_girl2_heart.jpg differ
diff --git a/static/bench2/C_res896_girl2_wave.jpg b/static/bench2/C_res896_girl2_wave.jpg
new file mode 100644
index 0000000..ef117a3
Binary files /dev/null and b/static/bench2/C_res896_girl2_wave.jpg differ
diff --git a/static/bench2/C_res896_girl5_heart.jpg b/static/bench2/C_res896_girl5_heart.jpg
new file mode 100644
index 0000000..c338a5c
Binary files /dev/null and b/static/bench2/C_res896_girl5_heart.jpg differ
diff --git a/static/bench2/C_res896_girl5_wave.jpg b/static/bench2/C_res896_girl5_wave.jpg
new file mode 100644
index 0000000..c010e13
Binary files /dev/null and b/static/bench2/C_res896_girl5_wave.jpg differ
diff --git a/static/bench2/C_res896_qwer_heart.jpg b/static/bench2/C_res896_qwer_heart.jpg
new file mode 100644
index 0000000..a4f80a0
Binary files /dev/null and b/static/bench2/C_res896_qwer_heart.jpg differ
diff --git a/static/bench2/C_res896_qwer_wave.jpg b/static/bench2/C_res896_qwer_wave.jpg
new file mode 100644
index 0000000..03cdf4d
Binary files /dev/null and b/static/bench2/C_res896_qwer_wave.jpg differ
diff --git a/static/bench2_report.html b/static/bench2_report.html
new file mode 100644
index 0000000..a5b227c
--- /dev/null
+++ b/static/bench2_report.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+swap步数 + 重绘分辨率 对比报告
+
+
+
+📊 swap步数 + 重绘分辨率 对比报告
+4图(asdf/qwer/girl2/girl5) × 2发型(波浪/心形) · 热数据(预热后取第2次) · 48/48成功 · 峰值20.6GB · 0 OOM
+
+💡 结论速览: B维度 steps 10→20 swap从3.0s→3.9s(每步省~90ms);C维度 res 640比896省3s(comfy 4.3s vs 7.3s),1024与896接近。
+
+B维度:swap步数对比(分辨率固定896)
+
+
+C维度:重绘分辨率对比(steps固定15)
+
+
+B维度明细(每图每发型每步数)
+
+
+C维度明细(每图每发型每分辨率)
+
+
+
\ No newline at end of file