Shitty:一个名字随意但速度惊人的终端模拟器
事件概述
Hacker News 上出现了一个名为 “Shitty” 的开源终端模拟器项目,标题是 “Show HN: Shitty – fast terminal. Memory-unsafe and faster than yours”,直译为“快速终端。内存不安全且比你快”。作者在 GitHub 上将其描述为“一个名字很蠢的严肃终端模拟器”。该项目主打低延迟、快速启动和可预测的资源使用,并且声称在吞吐量性能上超过了 Alacritty、Kitty 和 Ghostty 等知名终端。
尽管名字带有自嘲意味,仓库代码结构完整,包含大量测试(*_ut.cpp)、模糊测试(main_fuzz.cpp)以及持续集成配置,显然是一个认真开发的项目。发布时在 HN 上获得了 12 个点赞、0 条评论(原文未说明更多社区反馈)。
关键技术点
Shitty 的核心设计理念是:将终端状态保存在 CPU 上,使用原生计算后端进行渲染。具体来说:
- 渲染后端:Linux 使用 Vulkan,macOS 使用 Metal,均通过 GPU 进行单元格渲染,而不是依赖传统的 CPU 绘制。
- 终端状态管理:将终端状态(如屏幕内容、字符属性)保持在 CPU 内存中,由计算着色器负责绘制,从而减少 CPU-GPU 数据传输和同步开销。
- 自包含的原生窗口层:基于
third_party/plt构建,不依赖通用的窗口工具包(如 GTK/Qt),减少框架层开销。 - 构建要求:使用 C++23 和 Clang 编译。Linux 需要 FreeType、HarfBuzz、Wayland 客户端头、xkbcommon、Vulkan;macOS 则使用 CoreText、Cocoa、Metal 和 IOSurface。此外还依赖 Python3、glslangValidator、librsvg、Brotli、utf8proc 等工具库。
- 字符渲染:支持 Unicode 字素簇、组合字符、emoji 序列、双宽字符,以及 DEC 的单宽/双宽/双高行。采用惰性字形光栅化和持久 GPU 字形缓存,减少重复渲染。
- 协议支持:涵盖 VT52 到 VT5xx 的广泛控制序列、xterm 扩展,以及多种键盘和鼠标协议(如 Kitty 键盘协议、SGR 鼠标协议)。内部使用 UTF-8 编码,并导出
TERM=xterm-256color。 - 可选的加速库:如果安装了 simdutf 6.5 或更高版本,构建会自动使用它来加速 Base64 编码;Fontconfig 可选用于字体族查找。
项目自带性能对比脚本 dev/compare.py,用于在相同条件下测量不同终端的吞吐量。
性能对比
原文提供了一组在 Apple Silicon MacBook 上的基准测试数据。测试条件为:将 100MB 数据通过 GUI 输出,所有终端统一设置为 Menlo 12pt、相同的 14x28px 单元格、80x24 网格、500 行滚动缓冲区,取三次运行中的最佳墙钟时间。
可打印 ASCII(滚动路径):
| 终端 | wall(秒) | user(秒) | 吞吐量 |
|---|---|---|---|
| Shitty | 0.81 | 0.50 | ~118 MiB/s |
| Alacritty 0.17.0 | 0.96 | 0.78 | ~99 MiB/s |
| Kitty 0.48.2 | 1.28 | 0.95 | ~75 MiB/s |
| Ghostty 1.3.1 | 1.49 | 1.60 | ~64 MiB/s |
随机字节(解析器最坏情况,无效 UTF-8):
| 终端 | wall(秒) | user(秒) | 吞吐量 |
|---|---|---|---|
| Shitty | 1.88 | 1.79 | ~51 MiB/s |
| Alacritty 0.17.0 | 3.07 | 2.92 | ~31 MiB/s |
| Ghostty 1.3.1 | 4.63 | ~7.0 | ~21 MiB/s |
| Kitty 0.48.2 | - | - | - |
Kitty 在随机字节测试中缺席,原因是它会对嵌入的转义垃圾做出标题更改和响铃反应,而不是直接绘制。所有数据可运行 dev/compare.py 复现。
对数据科学和 AI Agent 落地的意义
终端是数据科学家和 AI Agent 与底层系统交互的重要接口。Shitty 这类追求极致性能的终端对实际工作流有潜在价值:
- 加速命令密集型任务:数据管道、日志分析、批量文件处理等场景常需要大量文本输出。更高的终端吞吐量意味着更短的等待时间,特别是在 CI/CD 日志滚动或调试大型数据集时。
- 改善 Agent 执行环境的响应速度:许多 AI Agent 通过终端执行命令、读取输出。一个低延迟的终端可以减少 Agent 在“等待命令回显”上的时间消耗,间接提升任务执行效率。
- 资源占用可预测:Shitty 强调“可预测的资源使用”,这在同时运行多个容器或虚拟环境的数据科学场景中至关重要——终端不应成为内存或 CPU 的不可控消耗者。
当然,Shitty 目前仅支持 Linux(Wayland)和 macOS,且 Linux 需要 Vulkan 驱动和 Wayland 合成器,这对部分老旧服务器或远程开发环境来说门槛较高。另外,“内存不安全”意味着它可能不适合处理不可信输出或在高安全环境下运行。
我的技术点评
Shitty 是一个很有意思的项目。它的名字虽然荒诞,但技术选择非常严肃:将终端状态放在 CPU、用 GPU 计算渲染,这是一种与现代 GPU 驱动 UI 主流相一致的架构(类似浏览器和游戏 UI)。从基准数据看,它在 ASCII 和随机字节两种极端负载下都领先于几
