Skip to content

原生 macOS 候选版性能基线 ​

插件工作台列表滚动卡死修复(2026-10-27) ​

日用候选在插件工作台向下滚动两屏后,整个窗口不再响应。系统 hang 报告记录 34.34 秒无响应;其中 1.11 秒采样内,主线程消耗 1.003 秒 CPU,全部 11 个栈样本经过 SwiftUI 的视图图更新。实际复现后宿主持续占用约一个 CPU 核,现场采样再次出现布局与属性更新,不能把这次故障归因于等待连接器请求。

原布局将整个业务块作为 LazyVStack 的一个子项,再在块内普通 VStack 展开全部任务。现在改用 List / Section,每条任务直接成为独立列表行,避免超出视口的整块参与懒布局位置更新。正文转换从视图构建移到页面数据更新时,按事项身份和正文内容复用结果;预览限制为 512 字符、转换输入限制为 32,768 字符,完整来源正文仍用于搜索和详情。账号变化、页面移除及同一事项正文替换会清理或更新缓存。

最终 Release 主程序 SHA-256 为 36521aa4bcb3cac093dbe3d755474c6edbc66405b1968d8b6e9d263857813b54。已安装到日用位置,通过签名校验,并核对安装程序与构建产物字节一致。在同一账号的实际列表中重复顶部、底部往返滚动,验证本地任务筛选、插件搜索和首页/工作台往返;未再出现窗口无响应,停止交互后 CPU 回落。两次 15 秒现场采样均显示主线程能够返回事件循环,仍包含实际布局和无障碍查询开销;这不是帧时间或输入延迟基准,也不代表任意数据量的长期性能保证。

上述实际 App 来自当时同时包含其他在研改动的工作区,二进制指纹用于标识被测产物,不代表只有本次修复。独立提交仅包含逐行布局、正文预览及其最小转换依赖、相关测试和本节记录;快捷操作、图标及目录加载等改动仍独立保留。

本轮新增正文缓存回归和 80 行长正文的真实 NSHostingView 滚动/筛选 smoke 测试。旧布局与新布局都能通过离屏 smoke,因此不能用它宣称捕获了原始卡死;实际 App 中原始操作的修复前后复验是本轮主要验收证据。Swift 全量最终通过,13 个依赖外部程序、下载或系统环境的可选专项未启用;首轮并行构建期间既有事件观察测试出现时序失败,单独复跑及最终全量均通过。TypeScript 2465 项通过、3 项跳过,typecheck、工作区构建、原生格式和 Release 构建通过。pnpm lint 被既有 .artifacts/ 验收产物的格式问题阻挡;公共边界通过,显式排除该本地产物目录后源码 ESLint 通过。本次本机验收不改变最低系统、长期日用和正式签名发布的既有验收门槛。

从 e57fd6c 基线仅导出这六个文件的暂存树后,两个 Swift 测试目标(159 项与 123 项)均通过,13 个可选外部/系统专项跳过;该独立树的 Release 编译、Swift 格式检查和公共边界检查也通过。它与上面的实际 App 验收分别记录,避免依赖其他未提交功能才能编译。独立验证日志保留在同一证据目录的 commit/ 子目录。

等待合入期间,主线先合入 f18ec34(原生快捷操作与插件图标)。修复已在隔离工作树适配到该基线,保留这些已合入行为;文本转换函数已由主线提供,因此相对新主线的差异为五个文件。重新运行两个 Swift 测试目标(176 项与 130 项)通过,13 个可选外部/系统专项跳过;Release 编译和 Swift 格式检查通过。记录与日志另存于同一证据目录的 rebased/,原始日用资料和并行未提交改动未用于解决冲突。

忽略目录 apps/macos/build/hang-diagnosis-20261027/ 保留修复前后采样、滚动检查、截图和验证日志;最终包位于 apps/macos/build/local-installs/candidate-QNObwl/。旧包保留于安装器备份。本轮未启动临时 GUI 宿主;渲染测试窗口和打包检查的 sidecar 已退出,修复后的日用原生 App 保持运行。

当前交付候选的启动与内存(2026-10-23) ​

当前成对产物和原始报告保留于 apps/macos/build/handoff-20261023-candidate/。原生是已验收置顶候选的逐文件相同副本,主程序 SHA-256 为 c19ffd4553ab46d7cd3ff973cb27baf3afed59c286cd34252d9b257a2cac5a82;Electron 从同一份产品源码重新打包,主程序 SHA-256 为 93d2b4097fc94fb0f43d104e0418457dca62e1e1ea8c105a489b972d9bda82a1。两端 211 个网页文件一致,运行时分别采用原生合并 bundle 和 Electron 分块/依赖部署,不能要求其 JavaScript bundle 字节相同。

macOS 26.6.2、Mac17,8、原生使用已有 Node 24.18.0,交替启动各三次。每次使用空运行时/浏览器资料和独立身份;测量器现在同时设置 HOME 与 CFFIXED_USER_HOME,避免 Foundation 仍解析到账号主目录。没有清系统缓存,首次新副本启动的系统开销保留在样本中。

指标(各次 / 中位数)原生Electron
外壳回调764.19 / 239.07 / 232.97 ms;239.07 ms2276 / 369 / 342 ms;369 ms
运行时就绪1110.13 / 522.43 / 524.83 ms;524.83 ms2358 / 446 / 422 ms;446 ms
完整网页就绪2074.94 / 1256.57 / 1293.18 ms;1293.18 ms3048 / 1083 / 1092 ms;1092 ms
逐进程 footprint 合计254.42 / 274.95 / 274.54 MiB;274.54 MiB393.63 / 586.18 / 384.74 MiB;393.63 MiB
包分配磁盘空间39488 KiB508696 KiB

六次内存采样的进程归属完整、采样集合稳定,全部正常响应测量器的 SIGTERM,未使用 SIGKILL 兜底且无宿主、辅助进程或归属 WebKit 残留。SIGTERM 清理不等于菜单正常退出验收。Electron 第二次 footprint 高于其他两次,仍保留,没有剔除。报告 performance/report.json、performance-summary.json 保留全部值、进程归属及清理结果。

本表证明这对产物在该环境下的回调与内存基线,不能推导屏幕首帧、后台按键延迟、连续缩放帧时间或整体速度优势。当前原生的完整网页就绪中位数高于 Electron;原生页面不以完整网页就绪作为自己的首帧。下节的面板/页面交互仍绑定此前产物,没有当作本轮重新测量。

此前候选的交互采样(2026-10-23) ​

使用下节新构建的原生 31d6e9dabec076b141230b53ce3e33aadb235330 与 Electron 49db29a2f775b281ad19460fbd0523055d0c5e35。各一份独立身份、空资料的 ad hoc 副本;主程序的所有 __TEXT 节与源包一致,原包未修改。使用工具实际打开面板、输入、Escape 和侧栏切换;没有连接账户或执行项目命令。原始记录为 apps/macos/build/interaction-samples-20261023/,包含固定事件日志、源包关联、完整数值、过程限制和退出检查。

内部事件原生Electron
面板(全部毫秒 / 中位数)60.15 / 29.05 / 18.84;29.05 ms14.0 / 13.8 / 6.5 / 12.5 / 4.9 / 5.7 / 4.1;6.5 ms
页面(全部毫秒 / 中位数)23.88 / 28.00 / 12.11;23.88 ms14.1 / 2.5 / 6.2 / 7.6;6.9 ms

原生面板终点为 displayIfNeeded 返回,Electron 为搜索框获得 DOM 焦点后的 Vue flush;原生页面终点为 onAppear,Electron 为目标组件 mounted/updated 后的 Vue flush。两端阶段不同,样本也不是多次独立会话,不能据表断言渲染快慢、首帧、硬件输入延迟或目标达标。页面顺序均为工具、诊断、插件、首页;原生工具页保留 WKWebView 回退,没有 native-page-appeared,记录为一项未配对请求,其余三次才进入原生统计。没有把它计作零耗时,也没有将后一个页面的事件配给它。

Electron 前四次面板操作期间,工具对后台窗口的读取滞后,个别控件返回没有位置。显式激活窗口后,后三次打开的文本输入和 Escape 已确认;一轮重复操作因外部窗口变化中断,重新读取后才继续。表保留全部七个原始计时样本,没有筛选较快结果,也不把前四次未确认的输入/关闭算作键盘验收。两端的侧栏目标及页面内容可读取。Electron 无丢弃或取消样本;原生三次面板请求均配对。

通过应用正常退出,两份副本的宿主、已记录辅助进程均离开,可用的责任 PID 查询也没有发现归属本次宿主的 WebKit 服务。没有强制结束。此次未修改产品源码,自动化检查与签名以 interaction-trace-20261023-final/ 的对应产物为准;详情弹窗、输入法、VoiceOver、连续缩放和完整系统入口仍保留独立待验收项。

Electron 交互采样接线(2026-10-23) ​

当 Electron 的 CRAFT_HUB_PERFORMANCE_TRACE 为绝对路径时,网页就绪后宿主启用采样并写出 interaction-trace-ready。普通浏览器和未启用的桌面会话不读取交互时钟。命令面板记录打开状态变更到真实搜索框获得焦点并完成 Vue flush;页面记录路由守卫到目标组件 mounted/updated 并完成 Vue flush。取消导航或关闭尚未就绪的面板产生 cancelled,不能混入完成样本。

计时使用网页单调时钟。宿主每秒读取最多 128 项,输出只包含固定操作类别、结果、时钟原点、起点和耗时,以及进程/渲染器编号;不包含路径、标题、搜索词或账户数据。队列最多保留 128 项,溢出数单独输出;宿主重新验证字段与有限数值,并拒绝超过一分钟的样本。窗口销毁后停止轮询。原始日志仅写入显式指定的本地文件。

组件测试已覆盖首次和再次打开的实际 DOM 焦点、路由完成与中止;采样测试覆盖取消、只完成一次、无开关时不计时以及上限。测试不能替代真实 Release 采样。接线完成时电脑控制服务在详情页观察中崩溃,尚无新 Electron 交互数据;后续避开该详情弹窗取得的样本见上节。计时终点不同,不能称为硬件输入到屏幕首帧或页面数据就绪。下方数值仍只属于各自注明的历史产物。

本批次新构建保存于 apps/macos/build/interaction-trace-20261023-final/。原生 CDHash 31d6e9dabec076b141230b53ce3e33aadb235330,占用 41628 KiB;Electron CDHash 49db29a2f775b281ad19460fbd0523055d0c5e35,占用 508696 KiB。两者的签名和 arm64 组件校验通过,摘要记录在 artifacts.json;这些包尚无新的交替启动或内存基准,真实交互数据已在上节追加。

最近完整实测的架构修复版(2026-10-23) ​

本批次测量 arm64-acceptance/Craft Hub Prototype.app,原生 CDHash 为 0d7803721c61afa67bb0d26efee6bae556427795;配套 Electron 仍为 b334b9d3ec38e69fe0fc40a4b9a1250a828578e5。机器、系统与方法同下节:macOS 26.6.2、Apple silicon、已有 Node 24.18.0,独立身份及空资料,云关闭,两端交替各三次,未清系统缓存。没有套用架构修复前的测量值。

指标原生Electron
外壳回调(各次 / 中位数)748 / 235 / 234 ms;235 ms2116 / 605 / 597 ms;605 ms
运行时就绪中位数507 ms455 ms
完整网页就绪(各次 / 中位数)1967 / 1214 / 1231 ms;1231 ms2670 / 1105 / 1112 ms;1112 ms
进程 physical footprint 合计(各次 / 中位数)256.53 / 272.87 / 267.15 MiB;267.15 MiB392.02 / 385.04 / 372.77 MiB;385.04 MiB
.app 分配磁盘空间41628 KiB(40.65 MiB)508684 KiB(496.76 MiB)

原始报告为 apps/macos/build/performance-20261023-architecture/report.json。六次采样均完整、进程归属稳定,清理没有强制兜底或残留。复现命令为:

sh
pnpm benchmark:macos \
  --native 'apps/macos/build/arm64-acceptance/Craft Hub Prototype.app' \
  --electron 'apps/macos/build/data-migration-electron/Craft Hub-darwin-arm64/Craft Hub.app' \
  --iterations 3 --output apps/macos/build/performance-new-run

外壳回调仍不处于同一绘制阶段,网页就绪仍包含两端不同的宿主接线。内存仍为逐进程 footprint 合计,并非全系统去重 RAM。原生网页就绪在本次中位数上没有更快;不能据此宣称冷缓存首帧或全部交互达标。Instruments 的前一批 trace 只对应下节旧产物,没有用于本批结论。

实际键盘与菜单触发的原生响应 ​

另用当前原生包的独立副本,通过电脑控制工具发送 ⌘K、Escape、回车及侧栏操作,并点击系统 View 菜单中的快速记录。PerformanceTrace 的固定事件使用同一 App 进程的单调时钟;没有使用电脑控制工具往返耗时作为产品延迟。副本全部 Mach-O __TEXT 节和包内 sidecar/CLI 与上述产物相同。

阶段样本中位数
命令面板处理入口 → displayIfNeeded 返回67.78、16.66、19.01、15.89、38.19 ms19.01 ms
快速记录处理入口 → displayIfNeeded 返回69.12、25.98、15.70、15.64 ms20.84 ms
页面选择处理入口 → SwiftUI onAppear34.46、34.58、21.64、29.98、25.91、27.61、15.28、12.52 ms26.76 ms

页面顺序为诊断、插件、工作台、插件、项目、软件、环境、首页;混合页面中位数只用于描述这组操作。原始事件及逐项配对保存在 apps/macos/build/interaction-20261023-candidate/;计时只取首个测试进程,重启后验证另行记录。

这些阶段不包含硬件按键分发,也不保证合成器已把像素显示到屏幕;onAppear 不代表数据加载完成。AX 观察确认了输入焦点和目标页面,但观察发生在工具返回时,不能据此证明 100/150 ms 内可输入。快速记录从应用内入口打开,本轮没有测后台全局快捷键。Electron 同口径面板/页面、输入法、拖动帧时间和屏幕首帧仍待补测。

架构修复前的候选版(2026-10-23 下午) ​

对 acceptance-20261023-browser-policy/report.json 记录的两个未改变摘要的产物重新测量:原生 CDHash c814560e6958a448f8be95192442d8c5ca553cbe,Electron CDHash b334b9d3ec38e69fe0fc40a4b9a1250a828578e5。同一台 Mac17,8、macOS 26.6.2 arm64;原生使用已有 Node 24.18.0。独立身份副本、空资料、云关闭,两端交替各启动三次,不清理系统缓存,也不结束其他日用 App。

后续架构选择与私有 Node 首次启动修复另产出 arm64-acceptance/ 和 x64-acceptance/,见独立验收记录。本节原始产物仍保留,但以下数值不代表这两份新构建。

指标原生Electron
外壳回调(各次 / 中位数)743 / 213 / 191 ms;213 ms2089 / 567 / 536 ms;567 ms
运行时就绪中位数485 ms398 ms
完整网页就绪(各次 / 中位数)1766 / 1190 / 1167 ms;1190 ms2666 / 1064 / 1030 ms;1064 ms
进程 physical footprint 合计(各次 / 中位数)249.17 / 264.58 / 270.44 MiB;264.58 MiB379.24 / 377.99 / 379.49 MiB;379.24 MiB
.app 分配磁盘空间41628 KiB(40.65 MiB)508692 KiB(496.77 MiB)

报告为 Git 忽略目录中的 apps/macos/build/performance-20261023-candidate/report.json,保留逐次事件和 footprint 原始数据。六次采样的归属、完整性和前后进程集合均通过;仅结束自己的副本,宿主、子进程和归属 WebKit 服务全部退出,无强制终止或残留,临时资料及副本清理完成。

这里仍是侧栏 onAppear 与 Electron 窗口显示回调,不能直接比较为同一绘制阶段或“可点击首帧”;原生完整网页在本次中位数上也没有更快。内存口径与下节一致,包含精确归属的 WebKit 服务,不能当作全系统去重 RAM。小样本、空资料、后台日用 App 和缓存状态限制了推论;不能把这批数据写成冷缓存、交互延迟或长期日用的达标结论。

Instruments 启动采集与限制 ​

对同一批产物的独立副本分别运行一次 Xcode 27.1 的 App Launch 模板,限时 10 秒,导出 life-cycle-period。报告及原始 trace 保存在 apps/macos/build/instruments-20261023-candidate/。原生记录具有有限的 Launching - Initial Frame Rendering 区间:持续 108.96 ms,在 trace 的 642.96–751.93 ms;该坐标从 Instruments 记录开始,不是 Launch Services 请求时刻,也不证明此时已经可点击。

Electron 已发出窗口和网页就绪事件,但 App Launch 的三段生命周期 duration 导出为 18446744073709551615、显示格式为 -,没有有限的 Initial Frame Rendering 区间。报告将这些值记为不可用,不能换算成零或与原生比较。两次采集均因 time-sample 1 ms / 5 ms 绑定不一致发出警告,xctrace record 返回 54;生命周期 XML 可导出,但本次不使用 CPU 样本推导性能结论,也不把整份采集标记为无警告通过。

复验使用 xcrun xctrace record --template 'App Launch' --time-limit 10s --output <new.trace> --env CRAFT_HUB_NATIVE_DATA_DIR=<isolated-profile> --launch -- <isolated-native.app>;完整的两端命令和环境值保存在报告目录的 command-retry.json 与 electron-command.json。Electron 另用独立的 CRAFT_HUB_DATA_DIR 和 CRAFT_HUB_DESKTOP_PROFILE_DIR,HOME、Codex 与云配置继续隔离。该工具不接受空字符串的 --env KEY=,首次参数解析失败也已保留;云未配置的候选使用空值父环境,未连接账户。

用 xcrun xctrace export --input <trace> --toc 检查实际目标,再通过 --xpath '/trace-toc/run[@number="1"]/data/table[@schema="life-cycle-period"]' 导出对应数据。限时结束由 profiler 终止目标,且留下各一个停止状态的夹具启动进程;核对本次独立可执行路径后已清理,不能算作 App 正常退出。首帧的同口径对比、冷缓存启动、面板响应和拖动帧时间仍需补验。

前一候选版(2026-10-23) ​

在同一台 Mac17,8、macOS 26.6.2、arm64 上复测当时构建的原生 Release 和 Electron 44 arm64。以下结果只对应本节记录的代码摘要,后续重建产物不能直接沿用这些性能结论。两份原始产物通过完整 ad hoc 签名校验;基准使用独立身份的副本,每次隔离 HOME、运行时、配置、浏览器和临时目录,关闭云连接与可选插件。原生使用已有 Node 24.18.0;两端交替启动各三次,不清理系统缓存。以下记录来自最终增加“采样前后进程集合必须相同”校验后的运行。

指标原生Electron
外壳就绪(各次 / 中位数)767 / 259 / 240 ms;259 ms2166 / 615 / 638 ms;638 ms
运行时就绪中位数576 ms480 ms
完整网页就绪(各次 / 中位数)2184 / 1378 / 1350 ms;1378 ms2814 / 1195 / 1202 ms;1202 ms
进程 physical footprint 合计(各次 / 中位数)267.31 / 268.56 / 267.62 MiB;267.62 MiB408.65 / 418.33 / 413.57 MiB;413.57 MiB
.app 分配磁盘空间(du -sk)39060 KiB(38.14 MiB)508668 KiB(496.75 MiB)

外壳回调仍分别为 SwiftUI 侧栏 onAppear 和 Electron 显示窗口,并非同一绘制阶段;所有启动时间从 Launch Services 请求计时。网页使用相同就绪标记。小样本包含新副本首次打开开销,不能当作冷缓存启动、首帧、交互响应或长期性能优势。原生包不含 Node;私有 Node 下载/安装体积见历史记录。du 是文件系统分配空间,不能仅从其变化推断可分发包大小或代码体积变化。

内存于网页就绪两秒后读取 /usr/bin/footprint --noCategories -j 的逐进程 auxiliary.phys_footprint 字节值,包含宿主、子进程及原生的 WebContent、Networking、GPU 三类 WebKit 服务。基准辅助程序动态探测可选 macOS responsibility SPI,仅接纳责任 PID 精确匹配本次宿主的系统 WebKit 二进制;辅助程序不进入应用包,API 不可用或归属不完整即标记为未完成。采样前后核对 PID、启动时间、可执行路径和完整进程集合;工具错误/警告、遗漏、重复、未知单位及无效数值均不产生有效总量。这是逐进程 physical footprint 的合计,未计所有共享系统服务,不等同于全系统去重 RAM 或峰值。RSS 保留作诊断,已不用于总内存比较。

本轮六次测量均完整且进程集合稳定;SIGTERM 后宿主、已记录子进程及归属 WebKit 服务均退出,没有强制终止兜底。六份临时资料和两份应用副本已清理,原始产物未修改。该清理不是应用菜单正常退出验收。

本地原始报告为 apps/macos/build/performance-20261023-verified/report.json,同目录保存每次 trace 和 footprint JSON;报告记录 4a164585b2c6755c498033f5cbca81fc2205a20d 后的 dirty 工作区及两份原始代码摘要:原生 3e2afac7c733369256c271caf5e98844097bd3a1,Electron bd42ec2aa6159beb276a2257657324859143e76c。这些记录用于识别被测产物,不把未提交源码等同于该 Git revision。前一轮报告保留在 performance-20261023-current:physical footprint 中位数原生 273.25 MiB、Electron 404.30 MiB,其中原生首次取样为 401.48 MiB;首轮 GPU 波动也说明当前测量不能推出稳定比例。最终轮增加进程集合稳定性校验后重新运行,没有覆盖先前证据。

以下为早期基线和按批次追加的历史记录,其中“尚未接入”“锁屏”等描述仅代表当时状态;当前功能与验收以原生计划和管理指南为准。

2026-10-22,同一台 Mac17,8,macOS 26.6.2,arm64,Xcode 27.1(27A9275)。来源为 4a16458 后的未提交工作区,包含 Node 探测与启动计时,尚未包含本轮后续事件流实现。这是工程基线,不是“切换完成”的验收。

启动 ​

使用 Release .app,经 Launch Services 启动。每次使用全新的空白运行时数据与偏好设置,没有连接账户或启用可选插件;原生版使用机器已有的 Node 24.18.0。两端交替运行,共两批、每端六次。第一批包含首次打开新包的系统开销;没有清除 OS 缓存,也没有重启机器,不能称为冷缓存启动。

指标(从启动请求计时)原生Electron 44
外壳就绪中位数299 ms744 ms
外壳就绪六次结果932 / 272 / 316 / 283 / 340 / 234 ms2767 / 701 / 758 / 999 / 729 / 653 ms
完整网页就绪中位数1592 ms1694 ms
完整网页就绪六次结果2984 / 1539 / 1605 / 1882 / 1579 / 1451 ms4079 / 1323 / 1381 / 1630 / 1831 / 1758 ms

原生外壳指标是侧栏 onAppear,Electron 是 ready-to-show 后调用 show(),不是相同的绘制阶段;网页指标均在应用完成初始目录和事件监听安装后记录。它们用于定位启动阶段,不能替代 Instruments 的首帧和可交互时间。两批网页就绪结果的快慢顺序不同,当前样本不足以认定网页启动速度有稳定优势。

面板和原生页面 ​

独立身份的本地 ad hoc 验收副本使用相同 Release 二进制及临时数据。通过真实键盘和菜单操作,确认搜索框获得焦点、Esc/重新打开、搜索后回车导航、环境与软件列表切换。没有写入远端数据。

操作内部计时结果
命令面板请求至 displayIfNeeded() 后82.73 / 33.56 / 17.97 ms
快速记录菜单请求至 displayIfNeeded() 后84.34 ms
页面选择至原生页 onAppear1.00 / 1.34 / 3.29 ms

这些时间不包含系统快捷键分发和实际显示刷新,也不证明全局入口已满足 150 ms 指标。页面数据加载单独进行;缓存保留由界面复核。Electron 面板和页面切换的同口径测量、缩放录屏、VoiceOver、Instruments 帧时间仍待完成。

体积和内存口径 ​

2026-10-22 基线中,du -sk 的 .app 磁盘占用:原生 27.66 MiB,Electron 379.95 MiB。原生包括 Sparkle、网页、sidecar 和 native addons;两端均使用外部 Codex。原生不含 Node;后续私有 Node 的单独测量如下,不能把它算作零成本。尚未记录可分发的压缩包大小。

2026-10-23 补充:插件、诊断和引导流程加入后的原生 Release .app 为 31.54 MiB(du -sk:32300 KiB)。通过真实 Swift 安装器下载并校验的 Node 24.22.1 Darwin arm64,官方 .tar.gz 为 50.60 MiB(53062778 字节),完整解包安装占用 199.39 MiB(204172 KiB,包含发行包中的 npm、头文件和许可证)。下载暂存包在完成后清理;旧私有版本为回退保留,每次安装的保留版本须另计。这一补充只测量体积,未重跑上方启动或内存基线,也不能把下载耗时当成离线启动耗时。x64 体积尚未实测。

网页就绪两秒后取样,主进程 RSS 中位数为原生 131.74 MiB、Electron 298.62 MiB。宿主及其直接/间接子进程 RSS 合计分别为 257.90 / 647.62 MiB;原生 WebKit XPC 进程不在父子进程树中,此合计不能比较整个应用内存。RSS 也会重复计算共享页,后续需用 Instruments/physical footprint 覆盖 WebKit 服务,再做总内存结论。

同日后续加入原生软件安装与来源管理后,Release .app 占用为 32.83 MiB(33620 KiB)。仅重新记录包体积,未据此改变上面的启动或内存结果。

再加入原生环境方案、前置步骤与配置源连接后,Release .app 占用为 33.88 MiB(34696 KiB)。签名及隔离包内 sidecar 检查通过;锁屏期间未补测窗口首帧、交互延迟或 RSS。

加入原生配置审阅、应用/恢复、仓库操作和 Skills 审计后,Release .app 占用为 35.20 MiB(36048 KiB)。本批次只重测包体积并完成签名及隔离配置流程验证;启动、首帧、内存和键盘交互仍引用前述基线或待验收,不据此推断性能变化。

补齐原生配置登记和加密备份目标,并更新固定提供方版本后,Release .app 为 35.73 MiB(36588 KiB)。已重做包内配置流程和签名验证;未重新测量启动、首帧或内存,不能将包体积变化作为运行性能结论。

加入原生软件收藏并修正诊断旧结果提示后,Release .app 为 36.00 MiB(36864 KiB)。最终包签名通过,sidecar 校验和与隔离收藏/配置/备份验证所用产物一致。本批次仍仅测量包体积,锁屏期间没有新增启动、首帧、内存或 UI 性能数据。

加入原生声明式工作台、配置开关审阅及 Codex 图形环境查找后,Release .app 为 36.98 MiB(37872 KiB)。已验证最终签名及包内真实 Codex 预览、配置/备份流程;本轮仍未补测启动、首帧或内存,UI 性能待解锁验收。

加入原生资源导航、文档和系统文件导出后,Release .app 为 37.32 MiB(38216 KiB),独立 ad hoc 签名校验通过。本批次只新增包体积数据;锁屏期间未补测首帧、布局、文本选择及导出交互,也未更新启动或内存基线。

加入原生连接表单、审阅与授权等待后,Release .app 为 37.80 MiB(38712 KiB)。最终签名与隔离包内回归通过;本轮没有真实账号授权、窗口首帧、轮询性能或内存测量,不从包体积推断交互性能。

加入通用动作及资源表单后,Release .app 为 38.50 MiB(39424 KiB),最终签名及隔离包内回归通过。新增真实 HTTP 请求行测试验证原生 ID 路径编码;本批次未补测首帧、表单交互延迟或内存,系统锁屏下的测试与包体积不作为 UI 性能验收。

加入离线资料迁移、跨进程迁移锁和恢复日志后,Release .app 为 38.50 MiB(39428 KiB)。最终签名、包内迁移/回退和既有配置流程演练通过;未重测启动、UI 首帧或内存。迁移锁与文件校验的性能不从包体积或功能测试推断。

加入原生单实例、导航转交和完整资料生命周期保护后,Release .app 为 38.70 MiB(39624 KiB)。独立身份的真实 App/Launch Services 演练通过重复启动、文件夹和链接转交、父进程崩溃及资料锁阻止启动。新增实例遥测只记录固定事件和 PID,不记录链接内容;本次仍未进行首帧、交互延迟或内存基准测量。

加入 Keychain 身份与私有通道基础后,Release .app 为 38.82 MiB(39756 KiB),独立签名和既有包内演练通过。该基础尚未接入应用的个人云流程;未运行真实账户授权,也未测量 Keychain 提示、云同步、启动或内存性能。

补齐插件更新状态、原生详情跳转和诊断来源筛选后,Release .app 为 38.92 MiB(39852 KiB),独立 ad hoc 签名校验通过。此次记录仅更新包体积;锁屏状态下未测量这些页面的绘制、键盘交互或内存表现。

接入个人云账户设置、原生请求审阅及生产 Keychain 私有通道后,Release .app 为 39.32 MiB(40260 KiB),独立 ad hoc 签名及四组既有包内演练通过。实际包内 sidecar 的隔离 Keychain/本地云替身演练已验证签名同步、撤销和退出;本批次未测量真实云网络延迟、浏览器授权、界面首帧或内存表现。

加入设备身份加密转移核心和 Keychain 暂存恢复后,Release .app 为 39.43 MiB(40380 KiB)。独立签名、包内云同步/撤销、单实例及插件/诊断回归通过。身份转移尚未接入完整迁移入口;本批次不将隔离加密互通测试作为真实授权、资料迁移或 UI 性能数据。

插件列表原生选择、空态恢复及诊断详情/复制补齐后,Release .app 为 39.73 MiB(40684 KiB)。独立签名、包内管理、单实例、迁移回退和云专项通过。此处仅更新包体积;锁屏下未重新采集 UI 帧时间或交互延迟。

外部宿主扩展原生审阅与登记/启停/移除接入后,Release .app 为 40.01 MiB(40972 KiB)。包内扩展生命周期通过四次启动验证,独立签名、声明式管理、单实例及云专项通过;尚未采集这批 UI 的交互与渲染性能。

加入持久化迁移阻塞标记及资料/Keychain 协调核心后,Release .app 为 40.09 MiB(41052 KiB)。本次只补记包体积和既有包内流程回归;协调器通过工作区 Node 与隔离原生 Keychain 联合验证,生产维护入口尚未接通,不能将该测试写作 Release App 的完整身份迁移验收。锁屏期间未新增 UI、启动、首帧或内存性能数据。

加入宿主签名认证基础后,本地 Release 为 40.12 MiB(41080 KiB),独立 ad hoc 签名验证通过。源 Electron 只读接收端预检返回不具备真实转移条件,原生认证器的正向元数据测试使用夹具;此结果不代表正式签名交接或密钥迁移验收。锁屏状态未变,未新增性能采样。

Electron 源宿主 fuse 加固后,原生 Release 仍为 40.12 MiB(41080 KiB)。同源码的 Electron arm64 验收包占 496.59 MiB(508504 KiB);其中为 Workstation 增加的固定 Node 24.22.1 二进制、许可证及回执占 116.35 MiB(119140 KiB)。这份 Node 只属于 Electron,原生候选未增加该资源,其已有私有 Node 引导和单独安装体积仍按上文计算。实际包内后端、分离 worker、注入拒绝及重新签名后 ASAR 篡改拒绝已验证;本轮没有重测启动、首帧或内存,较早 Electron 基线的功能和资源范围不同,不能直接作性能归因。

原生维护入口与有界事务接收协议接入后,Release 为 40.19 MiB(41156 KiB)。实际 App 验证未认证维护进程在普通资料/窗口/sidecar 初始化前退出,正常单实例及插件/诊断回归通过。协议引擎与真实 Node、隔离 Keychain 的提交恢复/回退演练不能代替签名宿主交接验收;本轮仍无新的 UI、首帧、启动或内存性能采样。

插件移除、回滚及来源移除的确认生命周期修复后,原生 Release 为 40.20 MiB(41168 KiB)。同批 Electron arm64 验收包加入进程管理 Node-API 模块及许可证后为 496.69 MiB(508612 KiB),模块目录约 0.10 MiB(104 KiB)。模块没有进入原生候选包。两份 App 的独立签名校验及各自隔离功能回归通过;XPC 身份通道未接通,不能由暂停进程测试推断真实密钥交接。Mac 仍锁屏,本批次未更新 UI、启动或内存性能采样。

接入原生接收端逐消息 Mach 审计令牌认证后,Release 为 40.24 MiB(41204 KiB),独立签名与实际 App 的未认证入口拒绝、单实例和管理回归通过。共享 C 通道另行验证真实子进程转发/exec 拒绝及端口引用清理;源 Electron 通道尚未接通,不代表完整签名迁移完成。该批次未重建 Electron,也未更新启动、首帧、UI 或内存采样;最低系统兼容验收仍保留。

第二批的退出清理会给宿主与已记录的子进程退出时间,六次均未触发强制终止兜底。它仍是 SIGTERM 清理,不等同于正常退出测试。另一次真实应用菜单退出后,独立验收 App 及其 Node 子进程均已退出;退出检查时,其他已安装的原生 App 与 Electron 仍在运行。

2026-10-23 源宿主协调/审阅接通及文件型 Keychain 后台读取修复后,最终原生 Release 占 40.24 MiB(41208 KiB),Electron arm64 占 496.73 MiB(508652 KiB),均通过独立 ad hoc 签名验证。解锁后已进行插件列表、目录选择和搜索的实际 UI 功能走查;后续电脑控制连接中断,因此没有新增详情/诊断交互、VoiceOver、首帧、启动或内存基准。锁定临时 Keychain 的 33/38 毫秒回归结果仅用于验证不等待解锁,不作为应用启动或交互性能指标。

复现 ​

先构建当前原生包和相同源码的 Electron arm64 包,再执行:

sh
pnpm build:macos
pnpm -C apps/desktop build
CRAFT_HUB_DESKTOP_OUTPUT_DIR=apps/macos/build/electron-baseline node --import tsx --input-type=module -e 'import { packageMacos } from "./scripts/package-macos.ts"; await packageMacos({ architectures: ["arm64"], createArtifacts: false, adHoc: true, codexMode: "external" })'
pnpm benchmark:macos --electron 'apps/macos/build/electron-baseline/Craft Hub-darwin-arm64/Craft Hub.app' --iterations 3 --output apps/macos/build/performance-new-run

每次选择新的 --output 目录;存在 report.json 时脚本拒绝覆盖。输出包含 report、逐次 trace 和原始 footprint,记录源码 revision/dirty、原始产物签名、Node、机器、就绪标记、进程归属、采样完整性与清理结果。迭代失败也保留已有结果;completed 只表示启动迭代完成,仍须检查各次 memory.complete 和 cleanup。文件位于忽略的构建目录,不提交机器路径与状态。脚本只清理本次独立副本中身份仍匹配的进程,保留未退出进程的临时资料,不按进程名结束其他应用,也不直接强制终止 Apple XPC 服务。

原生 Performance 日志类别提供固定事件名的 Logger/signpost;./script/build_and_run.sh --telemetry 可观察。CRAFT_HUB_PERFORMANCE_TRACE 指定绝对路径时额外写本机 JSON,不包含 token、项目内容或探测输出。CRAFT_HUB_NATIVE_DATA_DIR 隔离运行时、草稿和偏好;Electron 对照使用 CRAFT_HUB_DATA_DIR 加 CRAFT_HUB_DESKTOP_PROFILE_DIR。这些是开发验收入口,不是数据迁移操作。

源端接入同一 C/Mach 传输层和逐消息认证后,重建的 Electron arm64 验收包为 496.71 MiB(508636 KiB),模块与许可证目录为 128 KiB;原生 Release 仍为 40.24 MiB(41204 KiB)。两份实际 App 的独立 ad hoc 签名和隔离回归通过,源端真实子进程演练覆盖握手、转发/exec 拒绝及资源退役。新增 TypeScript 客户端尚未接入宿主迁移审阅/恢复流程,不能据此宣称完整签名迁移已验收。Mac 仍锁屏,本批未新增启动、首帧、UI 或内存性能采样。

Released under the MIT License.