Files

5.7 KiB
Raw Permalink Blame History

预览混淆性能记录 · 2026-09-14

本文记录实现前的局部基准;插件现已实现,当前集成验证与支持范围见 README。

这次测量用于选择设计方向。结果支持“压缩后做字节混淆、缩略图逐步显示”,也说明单看加密或打乱函数不能代表整个预览链路的性能。

测试使用本机 CPU 和实际 Chrome Worker。

项目 条件
CPU AMD Ryzen 7 2700X,8 核 / 16 线程
系统 Windows 10
Python 3.12.3
库 NumPy 2.5.2、Pillow 11.3.0、cryptography 46.0.3
浏览器 Chrome 153,本机 HTTP 页面,Dedicated Worker
输入 一张公开 Kodak 测试照片,裁切缩放为 1024×1024,原图/镜像/翻转/旋转共四个变体
重复数 循环四个变体执行 100 次;不是 100 张独立生成图
PNG Pillow compress_level=1
执行 各候选串行测量;服务端与浏览器的计算基准没有同时运行

图像来源:Kodak kodim23.png。下载图片的 SHA-256 留存在本地开发基准记录中。图片内容和压缩率仅代表这个样本,不能外推为所有生成图的典型值。

压缩后混淆保持原有 PNG 载荷大小。

候选 后端变换,100 次 后端 PNG 编码,100 次 浏览器还原,100 次 100 份载荷
普通 PNG — 4.313 秒 — 185.569 MiB
PNG 后 XOR 139.72 毫秒 共用普通 PNG 阶段 40.30 毫秒 185.569 MiB
PNG 后 AES-GCM 80.35 毫秒 共用普通 PNG 阶段 261.10 毫秒 PNG 载荷 + 1,600 字节认证标签
64×64 块重排后 PNG 223.16 毫秒 4.399 秒 未测 187.278 MiB
8×8 块重排后 PNG 337.07 毫秒 4.538 秒 未测 194.943 MiB

XOR 后端基准包含 bytearray 输出缓冲区分配和 NumPy 变换,浏览器是原地 TypedArray 还原。AES 使用硬件环境下的原生实现,密钥对象复用;密钥生成、导入、交换和包裹不计入此表。AES 每次加密使用唯一 nonce,nonce 和协议描述信息的少量传输字节未计入载荷表。

块重排采用 NumPy 向量化空间置换,使用预先生成并复用的映射,没有运行旧项目的 Python 逐块颜色变换。对应编码时间包含从重排数组构造 PIL 图像。该候选比直接照抄旧算法更适合做性能参照,但不是所有 GPU/图形实现的上界。此次用户已确认无需保持有效的打乱 PNG,所以没有继续实现浏览器块拼接方案。

本样本中,64 和 8 像素块分别增加约 0.9% 和 5.1% 的 PNG 载荷;这不是固定规律。压缩后的字节 XOR 不改变压缩率。后端 XOR 与浏览器还原计时合计为 180.02 毫秒 / 100 次,约 1.80 毫秒 / 次;这是两端分段计时之和。

原尺寸图片的浏览器解码比字节还原更费时。

浏览器 Worker 路径 还原 Blob 构造与 PNG 解码 Worker 完整往返
普通 PNG,100 次 0 1.684 秒 1.711 秒
XOR PNG,100 次 0.040 秒 1.719 秒 1.788 秒
AES-GCM PNG,100 次 0.261 秒 1.663 秒 1.952 秒

完整往返包含消息传递、还原、Blob 构造、createImageBitmap 解码及 ImageBitmap 转移回主线程,不包含 DOM 绘制。每个 bitmap 都在本次迭代结束时关闭。各路径独立测量,解码耗时的小幅差别不能归因于解密后图像不同:暖机时对每个变体校验了恢复后编码字节的 SHA-256。

数据预先从本机服务载入,复制成新响应缓冲区后才开始计时,再把 ArrayBuffer 所有权转移给 Worker;预载和为重复测量准备新副本的耗时不在表内。真实 HTTP 接收、代理、TLS 和公网传输没有测量。

小尺寸预览的带宽与解码收益更明显。

同一组 1024 输入用 LANCZOS 缩放为 384×384,再编码为 JPEG quality=85、optimize=False、progressive=False,并进行相同 XOR 混淆。

项目 100 次合计
缩放 1.080 秒
JPEG 编码 64.57 毫秒
后端 XOR 3.56 毫秒
后端三阶段合计 1.148 秒
浏览器 Worker 完整往返 100.0 毫秒
总载荷 2.581 MiB

缩略图的单次 XOR 耗时已接近浏览器 performance.now 的计时分辨率,部分读数为零,因此不把它解释为零成本,也不使用微秒均值作性能承诺。完整往返计时更有参考意义。

JPEG 缩略图是有损预览,与原尺寸无损 PNG 不等价。原图查看和下载应继续使用原分辨率、对应质量契约的数据。本次缩略图输入都是 RGB,透明度场景尚未验证。

这些结果尚不能代替插件的 100 张集成验收。

这次局部基准没有测量 ComfyUI 实际执行、GPU 到 CPU 的传输、张量到 uint8 的转换、真实 100 张不同图片、大于 1024 的原图、缓存/排队策略、UI 首张可见时间、整个应用的峰值内存、公网带宽和 Kaggle 检测效果。后续插件集成测试的覆盖范围与结果单独记录在 README 中。

性能比较只进行了一次上述串行基准,表中的 100 次是该次运行的样本,不代表跨设备或跨时段统计。原图、变体和编码参数均可从脚本复现。临时本机服务器与测试标签页已关闭。

验证覆盖:NumPy 块重排往返、后端 XOR 字节往返,以及实际浏览器对 PNG XOR、PNG AES-GCM、JPEG XOR 的恢复字节 SHA-256 和解码尺寸检查。

原始研究脚本、图片夹具和结果留存在本地开发工作区,不随此仓库或安装包发布。本仓库提供的 tests/ 用于当前插件的协议、节点与前端契约验证,运行方法见 README。研究中的 AES 密钥仅用于公开测试图片,不属于产品协议。