5.7 KiB
预览混淆性能记录 · 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 密钥仅用于公开测试图片,不属于产品协议。