Ely Office: six offline-first desktop apps in Rust and GPUI
ElyDoc, ElyTable, ElyShow (LibreOfficeKit), ElyPDF (MuPDF), ElyTree (Git), ElyMark (Milkdown and CodeMirror in CEF). ElyMail and ElyAgent follow.
This commit is contained in:
817 files changed
+143101
No files matched your search
@@ -0,0 +1,31 @@
|
||||
# 无障碍与国际化复核
|
||||
|
||||
首版六个应用,2026-10-08,macOS 27.0。每条写依据;做不到或未验证的写明。
|
||||
|
||||
## 键盘
|
||||
|
||||
| 要求 | 依据 | 缺口 |
|
||||
| --- | --- | --- |
|
||||
| 键盘完成打开、编辑、保存、搜索与主要工具 | 共用命令(`ely_ui::commands`:新建、打开、保存、另存为、导出、打印、关闭标签 Cmd+W、命令面板、设置),各应用的查找(Cmd+F)与模式键;`shell.sh`、`doc-shell.sh`、`mark-tools.sh` 以按键驱动 | 拖动类操作(图片手柄、透视表字段、PDF 区域标记)没有键盘替代 |
|
||||
| 焦点框不依赖悬停 | 组件库可按元素都是 Tab 停靠点并带 `focus_ring`(7fab072 起 git 行带透明边框使焦点框可见) | — |
|
||||
| 内容区与界面间焦点可预测 | Tab 顺序导航→内容→属性→状态(C05.4,`shell.sh`);浮层关闭后焦点回到打开前之处(组件库 8658999);文档(LOK 视图)与网页(ElyMark)把 Tab 留给自己(制表符、跳单元格、缩进),F6 与 Shift+F6 照 Tab 的次序移出与移回(组件库 029632b;原先没有键盘出口) | CEF 页面内的焦点顺序由页面决定 |
|
||||
| 对比度 4.5:1 | 主题与 Omarchy 色板按组件库 `A11yChecker` 规则收口(正文、状态色 4.5:1,焦点与图表色 3:1),核对不过的主题整套不用(C05.1) | 文档内容的颜色取自文件,照原样显示 |
|
||||
|
||||
## 辅助技术
|
||||
|
||||
| 要求 | 依据 | 缺口 |
|
||||
| --- | --- | --- |
|
||||
| 控件有角色与名称 | 组件库核心控件、对话框、列表、树、提交与差异行、设置行(组与说明)、提示(Toast 有角色与名称);真窗口测试都经 AX 树操作(`ax-values`、`ax-press`) | `lists::Outline` 与 `feedback::Alert` 无角色(上游待办);gpui 无 aria-disabled,以说明文字表达 |
|
||||
| 文档内容可达 | LOK 视图把当前段落(Calc 为当前单元格与输入行)以 `MultilineTextInput` 交给 AX(`lokview.sh` 读到键入后的段落) | gpui 没有文本选区与插入点的 AX:选区、插入点、整篇文档到不了辅助技术;ElyMark 与内容宿主的页面不进 AX 树(CEF 离屏);PDF 页面文字未接 AX |
|
||||
| 编辑状态可达 | 保存状态、风险、引擎停止以提示条与状态栏文字表达 | 状态栏文字是否进 AX 树未逐项核对 |
|
||||
|
||||
## 国际化
|
||||
|
||||
| 要求 | 依据 | 缺口 |
|
||||
| --- | --- | --- |
|
||||
| 简中与英文界面 | `ely_ui::i18n` 缺键即失败;组件库面板族、对话框、批注栏等内建中英目录;设置可切语言(下次启动生效) | 组件库 `SortBuilder`、`FilterBuilder`、欢迎页等文案仍为英文(上游待办);ElyTable 选区统计以外的内核文字为英文 |
|
||||
| 中英文输入、组合输入、标点 | LOK 视图与 CEF 页面都经输入法回调处理组字(`lokview.sh`、`webview.sh` 组“你好”);往返用例含中文(`independent.rs`) | 系统拼音输入法实机只做过人工检查,测试以输入法回调模拟 |
|
||||
| 混合字体 | 内核按字体回退排版;缺失字体在 ElyDoc 页面上方列出 | 字体缺失环境的分页对照未做(见 `docs/compatibility.md`) |
|
||||
| 非 ASCII 路径 | `paths_keep_spaces_cjk_and_case`(保存);启动参数按当前目录取绝对路径(C20.1 修) | — |
|
||||
| 日期、数字、纸张用显式区域 | 内核载入选项固定 `Language=en-US`(`ely-lok/src/worker.rs` 的 `LOAD_OPTIONS`),公式为 Excel A1 语法;纸张取自文档本身并原样打印(C19.2) | — |
|
||||
| 改界面语言不重解释已存数值 | 同上:内核的数字区域不随界面语言,界面语言只改 Ely 的文案与选区统计的名称 | — |
|
||||
@@ -0,0 +1,75 @@
|
||||
# 兼容清单
|
||||
|
||||
随发行说明发布,每个版本一份。支持某格式不等于支持它的全部功能;下表只写已验证的内容、已知限制与保存行为。
|
||||
|
||||
版本:Ely Office 0.1.0(首版:ElyDoc、ElyTable、ElyShow、ElyPDF、ElyTree、ElyMark)。日期 2026-10-08。
|
||||
内核:LibreOffice 26.2.6.3(8221e31,加 `patches/libreoffice` 0001–0038);MuPDF 1.28.5(8ad45e9,加 `patches/mupdf` 0001–0005);Git 2.56.0(a018953)与 git-lfs 3.8.0;CEF 154.0.32。
|
||||
验证机:macOS 27.0 arm64。Windows 与 Linux 未验证。本机没有 Microsoft Office:与 Office 的交叉检查未做(待做)。
|
||||
|
||||
## 往返验证
|
||||
|
||||
每份样本在 Ely 中打开、编辑、保存、关闭、再打开、再编辑、再保存,最后由不经 LibreOffice 的读取器检查(`tests/scripts/ooxml.py`:自己解 OOXML,预期值由它自己算;DOCX 另交 macOS 的 `textutil` 读)。用例在 `crates/ely-lok/src/client/tests/independent.rs`。
|
||||
|
||||
| 用例 | 检查 | 结果 |
|
||||
| --- | --- | --- |
|
||||
| DOCX 合同 | 两次会话键入的文字(含中文)、批注、修订记录的插入、修订开关保留;`textutil` 读得出文字 | 通过 |
|
||||
| XLSX 公式 | 公式文本与缓存结果:整数、日期序号、`#DIV/0!` 错误值、文本严格相等,浮点按用例声明的 1e-12 容差;第二次会话的公式 | 通过 |
|
||||
| PPTX 演示 | 三张幻灯片、隐藏的那张仍隐藏、备注文字(含中文) | 通过 |
|
||||
|
||||
字体:缺失字体由内核报出,ElyDoc 页面上方列出缺失的字体(`doc.fonts.missing`),分页可能与有字体时不同;字体一致与缺失两种环境的对照未做。产品不带微软字体。
|
||||
|
||||
## ElyDoc
|
||||
|
||||
| | 格式 |
|
||||
| --- | --- |
|
||||
| 编辑与保存 | DOCX、ODT(保存保留原格式;另存为默认 DOCX) |
|
||||
| 导入或受限 | DOC、RTF 按原格式保存;含宏的文件(docm、dotm、带 Basic 的 ODF/OLE)进风险模式,只能另存副本,宏不运行 |
|
||||
| 输出 | PDF(页码范围、批注、修订标记)、打印(macOS) |
|
||||
|
||||
已验证:文字与段落格式、样式、页面与分节、页眉页脚、表格、图片锚点与环绕、目录、脚注尾注、书签、交叉引用、题注、公式、批注与回复、修订、查找替换、拼写(英文)、比较、邮件合并。限制:交叉引用只指向书签;公式导出 DOCX 后在 Word 中是否可编辑未验证。
|
||||
|
||||
## ElyTable
|
||||
|
||||
| | 格式 |
|
||||
| --- | --- |
|
||||
| 编辑与保存 | XLSX、ODS(保存保留 xlsx、ods、xls、fods;另存为默认 XLSX) |
|
||||
| 导入或受限 | XLS;CSV、TSV、TXT 经导入对话框(编码、分隔符、引号、逐列类型)成为新工作簿,原文件不动;xlsm、xltm 进风险模式 |
|
||||
| 输出 | PDF(全部工作表,按页面设置)、CSV 与 TSV(当前工作表的显示值,UTF-8)、打印(macOS) |
|
||||
|
||||
公式语法为 Excel A1。XLSX 与非 LibreOffice 生成的 ODF 载入时总是重算。限制:不支持的函数显示 `#NAME?`,原公式保留,缓存值不保留;外部链接不刷新,显示保存时的值;1904 日期系统未专门验证。
|
||||
|
||||
## ElyShow
|
||||
|
||||
| | 格式 |
|
||||
| --- | --- |
|
||||
| 编辑与保存 | PPTX、ODP(另存为默认 PPTX) |
|
||||
| 导入或受限 | PPT;章节(`p14:sectionLst`)内核不保留;媒体默认嵌入 |
|
||||
| 输出 | PDF(幻灯片或讲义 1、2、3、4、6、9 张一页)、PNG(每张 1920 宽)、打印(macOS) |
|
||||
|
||||
限制:Ely 提供一组基础切换与动画,文件自带的其他效果照原样保留并显示内核名称;批注不做回复(Impress 无回复结构);Windows 与 Linux 的媒体播放未构建。
|
||||
|
||||
## ElyPDF
|
||||
|
||||
| | 范围 |
|
||||
| --- | --- |
|
||||
| 编辑与保存 | 页面增删移转裁剪、文字与图片改动、批注、表单字段(文本、复选、单选、选择框)、书签、链接、属性、附件、OCR 文字层、内容删除与清理、密码与权限、数字签名 |
|
||||
| 导入或受限 | XFA 表单不支持;已签名文件另存为未签名副本;修复过的文件只能另存;多选列表框按单选填写 |
|
||||
| 输出 | PDF、页面图片(PNG 72/150/300 dpi)、文本、优化的 PDF、打印(macOS) |
|
||||
|
||||
保存经 MuPDF 写快照后紧缩写出;签名经增量更新写出并重开核对摘要。独立阅读器 PDFKit 读回页序、改动的文字与字段值(`crates/ely-pdf-engine/tests/independent.rs`)。限制:证书吊销状态不核验;Windows 与 Linux 的证书信任未构建。
|
||||
|
||||
## ElyTree
|
||||
|
||||
标准本地 Git 仓库,随包 Git 2.56.0。浅克隆、LFS(只显示状态,不下载对象)、子模块(显示状态与检出记录的提交)照 Git 的限制显示。Ely 写的一切都是 Git 原生提交与引用;不提供交互式变基与硬重置。
|
||||
|
||||
## ElyMark
|
||||
|
||||
| | 格式 |
|
||||
| --- | --- |
|
||||
| 编辑与保存 | MD、Markdown(UTF-8,带不带 BOM;保留换行风格;未改动的块逐字节照原文写回) |
|
||||
| 导入或受限 | UTF-16 与非 UTF-8 拒绝打开并指出字节位置;Milkdown 不支持的语法以原文块保留;超过 2 MiB 只以源码打开 |
|
||||
| 输出 | HTML(单文件或带资源文件夹)、PDF、纯文本、打印(macOS) |
|
||||
|
||||
## 第二批
|
||||
|
||||
ElyMail 与 ElyAgent 不在首版,验证随第二批补上。
|
||||
@@ -0,0 +1,41 @@
|
||||
# 帮助
|
||||
|
||||
## 打开与保存
|
||||
|
||||
- 文件菜单在每个应用里相同:新建、打开、保存(Cmd+S)、另存为、导出(Cmd+E)、打印(Cmd+P);Cmd+W 关闭标签,Cmd+, 打开设置。
|
||||
- 新建的文档在第一次保存时才选位置。保存保留原格式;另存为写新文件,原文件不动。
|
||||
- 含宏的文件、已签名的 PDF、修复过的 PDF 只能另存副本,上方提示条写明原因。
|
||||
- 外部程序改了你正在编辑的文件时,Ely 不覆盖,询问从磁盘重载、保留你的版本或另存副本(ElyMark 另可逐处比较合并)。
|
||||
- 自动保存:ElyMark 对有路径的文件停手 1 秒后保存。ElyDoc、ElyTable、ElyShow、ElyPDF 默认手动保存,可在设置“文档”里打开“自动保存”:只对本应用自有格式、无宏无签名的文件,外部改动或保存失败后停下等你处理。
|
||||
|
||||
## 缩放与窗口宽度
|
||||
|
||||
- ElyDoc、ElyTable、ElyShow:Cmd+= 放大,Cmd+- 缩小,Cmd+0 回到实际大小(ElyShow 为适合幻灯片);也可在“视图”菜单、状态栏右侧的缩放控件,或按住 Cmd 滚动、触控板捏合(以指针处为中心)。范围 25% 至 400%。
|
||||
- 窗口变窄时,两侧栏先变窄,再先收起右栏、后收起左栏,文档区至少保留 360 点;窗口变宽即回来。侧栏的宽度可拖动内侧边缘调整,按应用记住。
|
||||
- 侧栏放不下全部文字时,分页按钮只显示图标,悬停可见名称。
|
||||
|
||||
## 恢复
|
||||
|
||||
- 有未保存改动时,每 10 秒在本机数据目录写一个恢复点(加密的文档其恢复点也加密),只留在本机,不上传。
|
||||
- 应用崩溃后再启动,未保存的内容以未命名副本打开,原文件不动;只恢复内容,光标与撤销历史不恢复。
|
||||
- 文档引擎单独停止时,窗口上方写明原因与最近一次恢复点的时间,“重新打开文档”起新引擎并逐个重开:有改动的从恢复点、无改动的从文件。
|
||||
- 设置“存储”里可看日志、网页缓存、恢复副本的大小,选每个文档保留几个恢复点与多少空间,并清除它们(先问)。
|
||||
|
||||
## 离线边界
|
||||
|
||||
- 六个应用都不需要网络、账号或在线服务;启动与空闲时不连网。
|
||||
- ElyMark 的页面只能读所在文件夹里的文件,一切网络请求都被拦下;文档里的网络图片不加载。
|
||||
- ElyTree 只在你取回、拉取、推送、克隆时连网,凭据照用你的 Git 设置(credential helper、ssh-agent),Ely 不在终端问密码。
|
||||
- 检查更新只在你手动检查时进行,下载后校验,从不静默安装。
|
||||
|
||||
## 仓库操作(ElyTree)
|
||||
|
||||
- 改动页:暂存、取消暂存、按块或按行暂存,放弃改动与清理未跟踪文件每次都先问并列出会删的文件。
|
||||
- 历史页:搜索提交、文件历史、逐行追溯;分支页:切换、合并、变基(先问)、标签。
|
||||
- 强制推送写明会覆盖的提交,只推所示的那个提交,远端在你上次取回后变了即被拒。
|
||||
- 引用日志可找回删掉的分支;“把当前分支移到此”保留工作区改动,从不做硬重置。
|
||||
- 另一个 Git 正在工作时(锁文件),Ely 说明原因并可重试,从不删除锁文件。
|
||||
|
||||
## 第二批
|
||||
|
||||
ElyMail 的账号授权与 ElyAgent 的后端限制随第二批说明。
|
||||
@@ -0,0 +1,37 @@
|
||||
# 许可与源码
|
||||
|
||||
这是发布检查清单,不替代对最终发行包的法律审查。
|
||||
|
||||
## 自有代码
|
||||
|
||||
Ely Office 的自有代码以 AGPL-3.0-or-later 发布,全文在仓库根的 `LICENSE`,并随每个应用包放在 `Resources/Licenses/LICENSE`。组件库 Ely-GPUI-Components 保留其 MIT/Apache-2.0。
|
||||
|
||||
## 每个发行版附带
|
||||
|
||||
| 文件 | 内容 | 生成 |
|
||||
| --- | --- | --- |
|
||||
| `ElyOffice-<版本>-source.tar.gz` | 自有源码、`Cargo.lock`、`rust-toolchain.toml`、ElyMark 网页的 `package-lock.json`、上游补丁(`patches/libreoffice`、`patches/mupdf`)、构建与取上游的脚本(各上游钉在提交,脚本里写明地址与散列)、测试、文档 | `packaging/macos/release.sh` |
|
||||
| `ElyOffice-<版本>-upstream-source.tar.gz` | 实际编译的 MuPDF 源码(钉住的提交加我们的补丁,AGPL)与随包 Git 的源码(v2.56.0,GPLv2) | 同上;`tests/scripts/release-macos.sh` 核对其中是打过补丁的 MuPDF |
|
||||
| 各应用包 `Resources/Licenses/` | Ely 的 AGPL 全文;`rust-crates.txt`(链进该应用各二进制的全部 crate 与其许可文件,无许可文件的取标准文本并写明作者);所带引擎的许可与通知(见下) | `packaging/licenses.sh`,缺任何一份即打包失败 |
|
||||
|
||||
## 第三方,按应用
|
||||
|
||||
| 依赖 | 许可 | 随包 | 应用 |
|
||||
| --- | --- | --- | --- |
|
||||
| LibreOffice 26.2.6.3 | MPL-2.0 等 | LICENSE、NOTICE、CREDITS;修改以补丁形式在源码包里,基于钉住的提交 8221e31 | Doc、Table、Show |
|
||||
| 英文拼写词典(dictionaries 子模块 9925407) | 见词典目录内许可 | 随词典目录 | Doc、Table、Show |
|
||||
| MuPDF 1.28.5 | AGPL-3.0 | COPYING,编进去的每个第三方库与每组内嵌字体的许可(按实际构建) | PDF |
|
||||
| OpenSSL(libcrypto,静态) | Apache-2.0 | LICENSE.txt | PDF |
|
||||
| Tesseract 语言数据(tessdata_fast eng、chi_sim、chi_tra) | Apache-2.0 | 按提交与散列取得 | PDF |
|
||||
| Great Vibes 字体 | OFL-1.1 | OFL | PDF |
|
||||
| Git 2.56.0 | GPL-2.0(部分 LGPL-2.1) | COPYING、LGPL-2.1;源码在上游源码包 | Tree(Mark 使用同级 Tree 包内的 Git) |
|
||||
| git-lfs 3.8.0 | MIT | LICENSE.md(按标签与散列取得) | Tree |
|
||||
| CEF 154 / Chromium | BSD 及其依赖各自许可 | CEF LICENSE、Chromium CREDITS | Mark |
|
||||
| Milkdown、CodeMirror、KaTeX、Mermaid 等网页依赖 | 各自许可(多为 MIT) | `THIRD-PARTY-NOTICES.txt`,按打进包的每个包取其许可文件 | Mark |
|
||||
| 媒体播放 | 系统框架(AVFoundation),不随包 | — | Show |
|
||||
|
||||
## 未尽之处
|
||||
|
||||
- LibreOffice 的整份源码(数 GB)不随发行,只给钉住的上游提交与我们的补丁;内核构建时下载的外部库(`external/tarballs`)是否需随包提供源码,待法律审查。
|
||||
- 第二批的 MailCore 2 与 ElyAgent 依赖随第二批补上。
|
||||
- Windows 与 Linux 的打包脚本未在本机运行,其许可收集未验证。
|
||||
@@ -0,0 +1,63 @@
|
||||
# Benchmark 2026-10-08
|
||||
|
||||
Format: docs/perf/README.md.
|
||||
|
||||
```json
|
||||
{
|
||||
"date": "2026-10-08",
|
||||
"machine": "Mac16,10",
|
||||
"cpu": "Apple M4",
|
||||
"cores": "10",
|
||||
"memory_gb": 24,
|
||||
"gpu": "Apple M4",
|
||||
"system": "macOS 27.0",
|
||||
"fonts": 372,
|
||||
"builds": {
|
||||
"ely-doc": "bd36fee608ebe0ee",
|
||||
"ely-table": "4461b4f741a8ae9e",
|
||||
"ely-show": "8650ed752d6080f1",
|
||||
"ely-pdf": "af9f8ba1cb599b0e",
|
||||
"ely-tree": "7cd55cb147481e01",
|
||||
"ely-mark": "ef45e8053a0ed8fb"
|
||||
},
|
||||
"samples": {
|
||||
"doc.docx": "5ab234c7fcc6b84242e3318a83849cd1078269bcaba0a6160efbf447e865c426",
|
||||
"sheet.xlsx": "356ca8e1c6985257040d205c5c72bbc66c9acc0afb76ec26fba7d6a1566f21a1",
|
||||
"pages.pdf": "d9852531dbbd3699642398c2b454246a361c92ddad5f7dc7483af371f9ce40cb",
|
||||
"notes.md": "2c21622c0242e5460d0df3e6a0b7497a6a2100a4e10363e095519b8f9256bdb3",
|
||||
"repo": "1ad0662eea314739d0b85ae5ae9258620d271c75"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
| PERF | Case | Runs | P50 ms | P95 ms | Target ms | Total memory MB |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| PERF-01 | ely-doc first run | 1 | 192 | 192 ✓ | 3000 | |
|
||||
| PERF-01 | ely-doc daily start | 30 | 132 | 150 ✓ | 3000 | |
|
||||
| PERF-01 | ely-table first run | 1 | 181 | 181 ✓ | 3000 | |
|
||||
| PERF-01 | ely-table daily start | 30 | 127 | 138 ✓ | 3000 | |
|
||||
| PERF-01 | ely-show first run | 1 | 161 | 161 ✓ | 3000 | |
|
||||
| PERF-01 | ely-show daily start | 30 | 126 | 135 ✓ | 3000 | |
|
||||
| PERF-01 | ely-pdf first run | 1 | 171 | 171 ✓ | 3000 | |
|
||||
| PERF-01 | ely-pdf daily start | 30 | 129 | 133 ✓ | 3000 | |
|
||||
| PERF-01 | ely-tree first run | 1 | 173 | 173 ✓ | 3000 | |
|
||||
| PERF-01 | ely-tree daily start | 30 | 132 | 136 ✓ | 3000 | |
|
||||
| PERF-01 | ely-mark first run | 1 | 491 | 491 ✓ | 3000 | |
|
||||
| PERF-01 | ely-mark daily start | 30 | 205 | 213 ✓ | 3000 | |
|
||||
| PERF-01 | ely-doc blank document ready | 30 | 992 | 1020 ✓ | 3000 | |
|
||||
| PERF-01 | ely-table blank document ready | 30 | 1057 | 1087 ✓ | 3000 | |
|
||||
| PERF-01 | ely-show blank document ready | 30 | 1183 | 1229 ✓ | 3000 | |
|
||||
| PERF-02 | ElyDoc key to new tile | 30 | 2 | 5 ✓ | 100 | |
|
||||
| PERF-02 | main thread busy >100 ms: 0 times | 1 | 0 | 0 | 100 | |
|
||||
| PERF-03 | ElyDoc doc.docx | 30 | 1260 | 1293 ✓ | 5000 | 412 |
|
||||
| PERF-04 | ElyTable sheet.xlsx | 30 | 1260 | 1286 ✓ | 5000 | 381 |
|
||||
| PERF-05 | ElyPDF pages.pdf | 30 | 209 | 223 ✓ | 3000 | 111 |
|
||||
| PERF-07 | ElyMark notes.md | 30 | 1702 | 1725 ✓ | 2000 | 1095 |
|
||||
| PERF-06 | ElyTree history, press to first screen | 30 | 381 | 402 ✓ | 1000 | |
|
||||
| PERF-06 | ElyTree query 'part 42', first results | 30 | 463 | 476 ✓ | 1000 | |
|
||||
|
||||
PERF-08, ElyDoc opening and closing a document 40 times (total memory MB, open files):
|
||||
|
||||
457/564 458/564 458/564 458/564 458/564 460/564 460/564 461/564 462/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 454/564 455/564 455/564 455/564 455/564 455/564 455/564 455/564 455/564 455/564 455/564 455/564 455/564 455/564 455/564
|
||||
|
||||
PERF-09 (Agent sessions) belongs to the second release.
|
||||
@@ -0,0 +1,17 @@
|
||||
# 性能记录
|
||||
|
||||
`tests/perf/bench.py` 在发行构建上测 PERF-01 至 PERF-08,每项默认 30 次,记 P50 与 P95,写成本目录下的 `<日期>-<机型>.md`。
|
||||
|
||||
样本由 `tests/perf/samples.py` 按固定种子生成,放在 `engines/bench`(不入库),记录里写每个样本的 SHA-256(仓库写 HEAD):
|
||||
|
||||
| 样本 | 内容 | 用于 |
|
||||
| --- | --- | --- |
|
||||
| doc.docx | 100 页,20 张图片,约 9 MB | PERF-03 |
|
||||
| sheet.xlsx | 10 万个数值,1 万个 `SUM` 公式 | PERF-04(载入即重算,重算计在打开之内) |
|
||||
| pages.pdf | 1000 页,每页一张图,约 200 MB | PERF-05 |
|
||||
| repo | 10 万个提交 | PERF-06 |
|
||||
| notes.md | 1 MB | PERF-07 |
|
||||
|
||||
计时从启动进程起,到日志里出现标记为止(脚本每 10 毫秒读一次日志):PERF-01 到首帧(`ELY_SMOKE=1` 打印 `ready`),首次运行(新的用户目录)与日常启动分记,每次等上一次的进程(含仍在启动的内核)退出后再测;Doc、Table、Show 另记空白文档就绪(`opened Untitled`),它要等内核启动;PERF-03、04 到视图收下的第一块图块(`lok: tile (x, y) shown`;其间有图块画失败即整次作废),PERF-03 之前先核对样本经内核排版恰为 100 页(`lok: 100 pages`);PERF-05 到第一页的第一块(`pdf: a tile of page 0 drawn`);PERF-06 的历史首屏从按下“历史”到显示(`history shows`),查询从按下回车到结果(`searched true`),性能要求的指标是后者;PERF-07 到可视编辑器显示(`mark: shown as visual`)。PERF-02 为 ElyDoc 每次按键到显示该编辑的图块(`lok: edit to tile`,每键须各有一条,缺即失败),并以 `ELY_STALLS=1` 记下主线程连续忙于 100 毫秒以上的次数(`main thread was busy`)。内存为应用及其全部子进程(内核 worker、CEF 辅助进程)的 RSS 之和。PERF-08 为 ElyDoc 新建再关闭文档 40 次:循环前记下基线(总内存、打开的文件数、内核中的文档数 `lok-worker: N documents open`),每次关闭后等内核回到基线文档数再记三者;最后的文档数不等于基线、或文件数不等于第一次之后的即失败(第一次打开模板对话框时,进程一次性载入两个系统字体与 AppKit 的两个本地化表,此后不再增加)。
|
||||
|
||||
记录开头的 JSON 写机型、CPU、核数、内存、GPU、系统、系统字体文件数、各应用发行二进制的散列与样本散列。冷启动未清系统文件缓存(需要管理员权限),“日常启动”即文件缓存已热时的启动。
|
||||
Reference in new issue
Block a user