ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

edit 编辑器基准测试数据集:editing-traces 与 rustcode 编辑轨迹的格式、加载与重放

edit 编辑器基准测试数据集:editing-traces 与 rustcode 编辑轨迹的格式、加载与重放 开发工具代码编辑器【免费下载链接】editWe all edit.项目地址https://gitcode.com/GitHub_Trending/edit8/edit点击查看免费下载导读assets/editing-traces/目录是 edit 编辑器基准测试所使用的真实编辑轨迹数据集其中rustcode.json.zst记录了 Seph Gentle 用 Rust 编写跳表skip list代码时的完整编辑过程。本文以该目录的 README 为主线讲解编辑轨迹数据集的来源与许可、JSON/Zstandard 数据格式、缓冲区分批重放模型并结合 缓冲区基准测试、GapBuffer 实现、TextBuffer 实现 与 零拷贝 JSON 解析器 等源码说明如何用它验证缓冲区实现的正确性与性能。数据集概述一份真实的 Rust 编码过程记录来源与许可根据 assets/editing-traces/README.md 的说明该目录包含来自 josephg/editing-traces 项目的、由 Seph Gentle 记录的ASCII-onlyrustcode编辑轨迹。轨迹数据以 CC BY 4.0 许可提供。在 crates/edit/Cargo.toml 中zstd被列为 dev-dependencieszstd { version 0.13, default-features false }说明该文件在开发/基准测试阶段由zstd::decode_all解压后使用不参与运行时依赖。数据规模与内容对仓库内assets/editing-traces/rustcode.json.zst约 185 KB 压缩体积进行解压后可以得到约 2.9 MB 的 JSON 文本其统计特征如下数据来自本仓库实际文件内容字段数值startContent空字符串endContent65,218 字节的 Rust 源码txns数量36,981 条编辑事务patches总数40,173 个补丁删除字符总数约 457,313 字节插入字符总数约 522,531 字节endContent正是这份代码文件的最终形态——一个通用跳表skip list的 Rust 实现源码中可见SkipListC: ListConfig、NodeC、CursorC等类型而startContent为空意味着这是一份从零开始的完整编码过程。整份轨迹相当于一次真实的、带有删除、重写和游标移动的代码编写会话非常适合用来模拟编辑器在长时间、大幅度编辑负载下的行为。编辑轨迹的 JSON 格式与零拷贝解析顶层结构三个字段从 crates/edit/benches/lib.rs 的解析代码可以看到轨迹 JSON 的顶层对象包含三个字段startContent字符串编辑开始时的文档内容endContent字符串编辑结束时的文档内容txns数组编辑事务列表。事务与补丁的结构每个事务txn是一个对象包含一个patches数组每个 patch 是一个三元数组[offset, del_len, ins_str]offset删除/替换开始处的字节偏移del_len从该偏移开始删除的字节数ins_str在该偏移处插入的字符串。在 crates/edit/benches/lib.rs 中基准测试对每个 patch 使用patch[0].as_number()、patch[1].as_number()和patch[2].as_str()读取这三个元素正好对应上述格式。零拷贝 JSON 解析JSON 值借用内存bench 源码 先将解压后的 JSON 文本交给 json::parse 解析let data zstd::decode_all(Cursor::new(data)).unwrap(); let data str::from_utf8(data).unwrap(); let data json::parse(scratch, data).unwrap(); let root data.as_object().unwrap(); let txns root.get_array(txns).unwrap();其中scratch来自 scratch_arena。这个 JSON 解析器是 crates/edit/src/json.rs 中注释所描述的“simple JSONC parser”其 Value 枚举 中String(a str)、Array(a [Value])、Object(a [(a str, Value)])等变体都直接借用输入字符串的切片而不是复制字符串因此在解析 2.9 MB 轨迹时几乎不需要额外分配。同时 MAX_DEPTH: usize 64 防止深嵌套导致栈溢出。缓冲区分批重放模型从轨迹到基准测试为什么使用“事务”作为编辑单元真实编辑器中一次按键、一次撤销、一次粘贴会触发若干字节级操作。为了模拟真实用户行为轨迹把用户感知的“一次编辑动作”打包为一个 txntxn 内部再细分为多个 patch。基准测试以 txn 为单位遍历crates/edit/benches/lib.rs#L48-L63每个 txn 内的 patches 顺序执行。这种“事务-补丁”的分层模型与 TextBuffer 的撤销/重做分组 的设计思路一致ActiveEditGroupInfo记录generation_before、cursor_before等状态把一次编辑会话中的多次修改归为一组便于整组撤销/重做。两种重放路径bench_buffer 给出了两种重放方式分别对应编辑器的两种缓冲区抽象基于TextBuffer高层编辑 API先write_raw写入startContent然后对每个 patchcursor_move_to_offset(p.0)移动光标、delete(CursorMovement::Grapheme, p.1)按字素删除、write_raw(p.2.as_bytes())插入文本。TextBuffer::delete会考虑选区与光标边界crates/edit/src/buffer/mod.rs#L2472-L2489write_raw只做换行归一化crates/edit/src/buffer/mod.rs#L2303-L2307。基于GapBuffer底层字节缓冲区直接用buf.replace(p.0..p.0 p.1, p.2.as_bytes())一次完成“删除插入”。GapBuffer::replace 内部经过allocate_gap把 gap 移动到目标位置、删除旧文本、必要时扩大 gap然后commit_gap写入新文本。正确性校验重放结果必须等于 endContent基准测试在正式计时前先做 sanity checkcrates/edit/benches/lib.rs#L118-L130GapBuffer 重放后extract_raw(0..usize::MAX, ...)的结果、TextBuffer 重放后save_as_string的结果都必须与endContent完全一致否则说明实现有误。这正是把真实轨迹用作回归测试的价值——它能一次性验证光标移动、删除、插入、换行归一化等整条编辑链路。从源码看两类缓冲区的性能设计GapBuffer为大型文档设计的虚拟内存 gap bufferGapBuffer 结构体 的注释表明它“像VecT一样有预留容量但预留容量可以位于缓冲区任意位置”并且该变体“针对大缓冲区优化使用虚拟内存”。其关键字段reserve/commit/text_length/gap_off/gap_len构成典型的 gap buffer 布局GapBuffer::new(small)crates/edit/src/buffer/gap_buffer.rs#L65-L90中smallfalse时通过virtual_reserve预留大块虚拟内存smalltrue时退化为标准堆上的Vec。TextBuffer带游标、选区、撤销/重做与换行归一化的完整缓冲区TextBuffer 结构体 在内部持有buffer: GapBuffer并叠加了undo_stack/redo_stack、cursor、selection、stats逻辑行/视觉行计数与highlighter_cache等编辑器级状态。set_crlf(false)crates/edit/src/buffer/mod.rs#L384-L387用于确保重放时统一使用 LF 换行。save_as_string会把缓冲区内容写入可写文档并标记为 cleancrates/edit/src/buffer/mod.rs#L700-L704。游标坐标换算在 TextBuffer 重放路径中cursor_move_to_offset(p.0)将光标移动到字节偏移crates/edit/src/buffer/mod.rs#L1730-L1733随后用cursor_logical_pos()记录逻辑位置再以逻辑坐标重放验证了编辑轨迹在“字节偏移 ↔ 逻辑坐标”之间转换的正确性。如何在本仓库中运行与验证本数据集没有独立的运行脚本它通过crates/edit/benches/lib.rs参与基准测试运行方式遵循 crates/edit/Cargo.toml 中声明的[[bench]] name lib、harness false# 在仓库根目录执行使用 cargo bench 运行 lib 基准 cargo bench -p edit --bench lib -- buffer-- buffer是 Criterion 的过滤参数只运行buffer基准组crates/edit/benches/lib.rs#L132 中c.benchmark_group(buffer)定义该组包含GapBuffer/rustcode与TextBuffer/rustcode两个基准项。运行前会先执行 arena::init(128 * MEBI)以 128 MiB 初始化线程本地 scratch arenacrates/edit/src/arena/scratch.rs#L134-L143供 JSON 解析等临时分配使用。如果 sanity check 失败基准会直接 panic因此这也是一个内建的缓冲区正确性回归测试。zstd解压依赖已作为 dev-dependencies 声明crates/edit/Cargo.toml#L52-L54无需额外安装系统工具即可通过 cargo 运行。总结assets/editing-traces/rustcode.json.zst是一份非常有价值的真实编辑轨迹它把一次完整的 Rust 代码编写过程编码为 36,981 个事务、40,173 个补丁压缩后仅约 185 KB。通过对该数据集的解压、零拷贝 JSON 解析与分批重放edit 仓库实现了对GapBuffer与TextBuffer两条编辑链路的正确性验证与性能对比为编辑器的缓冲区实现提供了可复现、贴近真实输入模式的测试依据。对于希望理解编辑轨迹格式startContent/endContent/txns/patches或复现编辑基准的开发者这个目录连同 bench 源码 是一份可直接对照学习的样例。赞分享开发工具代码编辑器【免费下载链接】editWe all edit.项目地址https://gitcode.com/GitHub_Trending/edit8/edit点击查看免费下载相关推荐GPX轨迹在线编辑器重新定义户外数据编辑体验GPX轨迹在线编辑器重新定义户外数据编辑体验 在数字户外时代GPS轨迹编辑工具已经成为连接现实探险与数字记录的必备桥梁。gpx.studio作为一款基于We终极内核驱动工具KDU如何利用56个漏洞驱动绕过Windows安全机制终极内核驱动工具KDU如何利用56个漏洞驱动绕过Windows安全机制 Kernel Driver UtilityKDU是一款功能强大的开源工具专为探索网络安全开发工具ManiSkill 数据集与轨迹格式完全指南演示数据下载、HDF5 解析与轨迹重放实战ManiSkill 数据集与轨迹格式完全指南演示数据下载、HDF5 解析与轨迹重放实战 ManiSkill 不仅是一个 GPU 并行化的机器人仿真与基准框架机器人具身智能人工智能强化学习深度学习上一篇在 opencv_contrib 中复现 Deep Neural Networks are Easily Fooled基于 Caffe 与 Sferes 的深度网络愚弄图像生成实验指南下一篇nautilus-live 实时交易节点深度指南NautilusTrader 的 LiveNode、LiveNodeConfig 与 AsyncRunner 实战解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表