尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

gitstatusd 离线基准测试:与 git status 对比的冷启动和热启动数据怎么读?

gitstatusd 离线基准测试:与 git status 对比的冷启动和热启动数据怎么读? gitstatusd 离线基准测试与 git status 对比的冷启动和热启动数据怎么读【免费下载链接】powerlevel10kA Zsh theme项目地址: https://gitcode.com/GitHub_Trending/po/powerlevel10kPowerlevel10k 的 git 提示依赖 gitstatus 项目的 C 后端gitstatusdREADME 声称它比git status快 10 倍以上。要判断这个说法是否可信、以及它对你的场景意味着什么需要读懂 gitstatus/README.md 中Benchmarks一节的离线基准数据。这些基准在一台 Intel i9-7900X、Ubuntu 18.04 的机器上于同步到提交9394e49a的干净 chromium 仓库中运行仓库检出在 M.2 SSD 的 ext4 文件系统上。本文带你按数据产生的顺序解读测试条件、冷/热的定义、两张表格该怎么看以及数据背后的限制。基准测试的三个前置条件解读任何一张数字之前先确认测试条件因为它们决定了数据的适用范围被测工具是功能等价的三个gitstatusd、开启了core.untrackedcache且关闭了core.fsmonitor的git以及基于 libgit2 API 实现 git 功能子集的演示可执行程序lg2在基准测试目的下这个子集足以产生与其他工具相同的数据。被测命令有两类status和describe对应两张表。仓库是干净的clean。这一点很关键gitstatusd 有一些针对脏仓库的捷径只需报告是否有变化而无需列出所有文件可以在仓库扫描中提前终止也可以记住上次哪些文件是脏的下次优先检查以跳过整个扫描在干净仓库里这些捷径都不会触发。也就是说基准中所有工具都做了同样的完整工作——逐个检查 index 中每个文件、检查每个目录里是否有新建文件——gitstatusd 仍然领先幅度很大。先弄清冷和热分别指什么冷启动Cold和热启动Hot对三个工具的定义并不完全相同这是读表时最容易误解的地方git在仓库中的第一次运行算冷之后的运行算热。lg2经过补丁修改在同一次调用中计算两次结果中间不释放仓库第二次算热。gitstatusd基准方式与lg2相同也是同一次调用中计算两次结果。为什么git不做同样的两次计算补丁文档说明git无法在不修改自身的情况下在多次调用之间刷新内存中的 index 状态——而这个限制正是开发者使用 libgit2 的主要原因之一。换句话说git的热只包含操作系统层面的缓存收益而gitstatusd和lg2的热还包含进程内缓存。gitstatusd 会对自己见过的目录在内存中保留状态以便更快地服务后续请求这属于它的常驻进程设计gitstatus 的 Zsh/Bash 绑定会在后台启动 gitstatusd 并通过管道通信。Status 表怎么读这一节所有工具计算的都是git status的等价结果数字越小越好ToolColdHotgitstatus291 ms30.9 msgit876 ms295 mslg21730 ms1310 ms读这张表有三层信息热启动才是重点。文档明确指出对 gitstatus 的主用途——交互式 shell 中的 git 提示——热运行才是最重要的。因为提示每敲一次命令就可能刷新一次你日常感受到的延迟对应的是热路径的 30.9 ms而不是首次进入仓库的 291 ms。git一行的 295 ms 是最好成绩不是稳定值。文档承认git status的性能在基准中波动很大作者也不清楚原因而且性能是粘性的——一旦git status收敛到某个数值会长时间保持在那里。同一仓库的热运行上曾观测到 295、352、663、730 这么多样的数字表格中写的是git status表现出的最低最快值。所以不要把 295 ms 当成git status的典型耗时。冷启动差距小于热启动差距约 3 倍 vs 约 9.5 倍这与gitstatusd 在热运行上优势更明显的结论一致。Describe 表怎么读这一节所有工具计算的是git describe --tags --exact-match的等价结果即找出解析到与HEAD相同提交的那些 tag。同样数字越小越好ToolColdHotgitstatus4.04 ms0.0345 msgit18.0 ms14.5 mslg2185 ms45.2 ms这张表的结论与 Status 表相同gitstatusd 领先且热运行上领先更多0.0345 ms 对 14.5 ms。热路径上约三个数量级的差距说明 tag 查询这类高频小任务从常驻内存状态中获益最大。为什么 gitstatusd 的数字明显更低Summary for the impatient 一节给出了量化拆解在上述基准条件下gitstatusd 中 libgit2 的git_diff_index_to_workdirstatus命令中最昂贵的部分快46.3 倍提速来自三处更高效的数据结构、算法和注重性能的编码风格用户态 CPU 时间比 libgit2 少32 倍使用更少、更便宜的系统调用内核态 CPU 时间少1.9 倍可以并行扫描 index 和 workdir多核扩展近乎完美总运行时间缩短12.4 倍在 10 核/20 线程的 i9-7900X 上单核频率 4.3GHz、全核频率 4.0GHz而总 CPU 时间几乎不变。CPU profile 的绝对数字也可以交叉印证同一负载下chromium 仓库25k 目录、300k 文件libgit2 的 200 次热运行总耗时 232 秒其中 111 秒47.7%花在stat()和目录读取类系统调用上gitstatusd 总耗时 62 秒算法核心之外的代码只占 3.77 秒比 libgit2 少 32 倍。两个实现的具体差异包括libgit2 对目录也执行不必要的stat()chromium 中有 25k 个目录可以省掉并用路径寻址的lstat()gitstatusd 改用基于父目录文件描述的fstatat()和openat()直接调用getdents64系统调用绕过 glibc 封装这部分优化细节单独写在 gitstatus/docs/listdir.md。注意git status自身也会使用所有可用核心而lg2是单线程——所以 12.4 倍的并行收益是相对于单线程执行的不是相对于git的完整表现。数据的边界这些数字能推出什么结论把基准数据落到自己的使用判断上文档实际支持和没有支持的结论如下数字来自单一环境特定 CPU、特定系统、特定仓库和特定提交。文档没有给出跨机器的性能模型不应把 291 ms / 30.9 ms 当成自己机器上的预期值只能作为gitstatusd 相对另外两个工具快多少的相对比较依据。干净仓库是刻意选择的条件因为干净仓库不触发 gitstatusd 的捷径这份数据测的是所有工具做同样工作时的基础性能差异在真实脏仓库中 gitstatusd 还能利用提前终止和脏文件优先检查进一步加速这部分没有量化数字。git的数值波动如前所述git status的热运行数值不稳定表格取的是最好观测值用它与 gitstatusd 对比已经对git最有利的口径。gitstatus 不是git status的替代品文档明确说明它不产生与git status相同格式的输不出不能直接替换git status命令它执行的是同样的计算主要用途是给交互式 shell 提供快速 git 提示。运行平台要求gitstatusd 支持 Linux、macOS、FreeBSD、Android、WSL、Cygwin 或 MSYS2如需自行编译需要 binutils、cmake、gcc、g、git 和 GNU make。如果你的问题是Powerlevel10k 的提示延迟会不会主要来自 git 状态查询这份基准给出的答案是热路径上 gitstatusd 的 status 计算约 30 ms 量级测试环境口径且交互式场景只走热路径git status即便按最好成绩也慢一个量级以上且实测波动更大。具体到自己仓库的规模可以用gitstatusd绑定实际运行后的提示响应速度做最终判断而不要依赖上表中的绝对毫秒数。【免费下载链接】powerlevel10kA Zsh theme项目地址: https://gitcode.com/GitHub_Trending/po/powerlevel10k创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表