跳到正文

Listary 7.1 Beta 发布:速度最高提升 4 倍,内存占用降低 21%

Xinyi

一个每天用几十次的工具,值得打磨到什么程度?

我们的答案是:要做到极致。

已经很快了,继续让它更快。已经很轻了,继续减少占用。已经很好用了,继续琢磨每一次输入、每一次选择,让速度更快,让结果更准。

7.0 我们重写了搜索引擎的代码,7.1 我们又把界面、应用逻辑和后台服务重写了一遍。

这次重写带来了多大的变化?先看速度和内存占用:

图 1:各版本与 Everything 的性能对比。
图 1:各版本与 Everything 的性能对比。

启动器的打开速度,从 0.044 秒减到了 0.027 秒。

这个数字有多快?眨眼时,眼睑遮住瞳孔的时间通常约为 0.1 到 0.15 秒。0.027 秒,只有这段时间的约四分之一到六分之一。

竞技游戏里,0.03 秒也值得争取。NVIDIA 的一项射击任务实验发现,额外增加约 0.03 秒的系统延迟,就会显著影响玩家完成任务的速度。再微小的提升,也会改变每天反复操作时的手感。

文件搜索窗口里,显示搜索结果的时间,从 0.158 秒降到了 0.039 秒,耗时减少约 75%。

内存占用减少至少 100 MB。

Listary 常驻后台,应该尽可能少地占用资源,把更多内存和处理能力留给你正在做的事。无论是配置强劲的台式机,还是用了好几年的笔记本,这都是一个常驻工具应该有的克制。

这次重写,我们换用了更轻量的原生界面框架。默认采用软件渲染,不再使用显卡绘制主程序界面。

后台空闲时,全部进程的内存占用从 7.0 的 370 MB 降到了 291 MB,减少约 21%。显卡共享内存从 77 MB 降到了 0。

为什么会有如此大的改变

V5 的界面框架基本上是我们自己写的。那时候,主要框架掌握在自己手里。哪里影响速度,哪里影响手感,我们可以一直往下找,改到真正负责这件事的那行代码。所以 V5 速度很快,手感很好。

做 V6 时,为了适应高分辨率屏幕和更多集成场景,我们选择了 WPF。它替我们承担了大量界面开发工作,也帮助 Listary 实现了更多功能。

但后来,一些问题逐渐显现:快速使用输入法时可能闪退,部分显卡环境下内存异常增长,阴影可能影响文字清晰度,双显卡切换也可能受到干扰。我们修复或绕过了其中一些问题,但当问题涉及框架内部及其与系统的配合时,继续深入的成本往往很高。

我们想重新找回以前那种感觉:主要框架掌握在自己手里,能够深入底层代码,能够把体验做到极致。

所以到了 V7,我们选择用 Rust 重写界面、应用逻辑和后台服务,并构建原生界面。

遇到问题时,我们可以继续深入窗口管理、输入处理和绘制实现,需要时维护自己的框架分支,和应用一起修改、构建与验证。

这次重写,我们新写了超过 20 万行 Rust 代码。任务非常艰巨,但这份掌控已经让我们能够深入一些以前很难触及的细节:

极致丝滑的 UI

我们希望每次输入、每次滚动,界面都能及时跟上你的操作。文件搜索窗口的列表滚动,就是其中一个例子。

这个窗口一次可能列出几十万甚至上百万条结果。在 7.0 里,结果超过 2 万条后,拖动滚动条经过尚未加载的位置,列表要等滚动条停下约 0.1 秒后才更新。

7.1 重新调整了数据读取与绘制的配合:先读好需要显示的结果,再更新对应的区域。在 30 万条测试数据中,使用鼠标滚轮、拖动滚动条和键盘连续翻页三种方式,一帧耗时的中位数分别约为 0.007 秒、0.006 秒和 0.002 秒,测试中没有一帧超过 0.033 秒。

视频:在约 11.5 万条结果里拖动滚动条。

深入文字渲染

换上新界面后,我们发现部分汉字出现了笔画粘连、上下位置不一致的问题。同样的文字,在输入框和结果列表里也可能画得不同。

我们写了一套独立的文字渲染程序,用同一份字体测试 15 种渲染参数组合、3 个字号。从笔画之间的空隙,到每个字的上下位置,先逐像素检查,再回到实际大小判断阅读效果。

图 2:16 种备选字体画法与最终选择(重绘示意)。
图 2:16 种备选字体画法与最终选择(重绘示意)。

深入软件渲染

迁移初期,各个窗口的圆角和阴影不够协调:有些阴影过浓,有些被边界裁掉。换成软件渲染后,阴影还需要依赖预制图片,圆角也需要把界面拆成多块绘制。

我们参考多个成熟图形项目的实现,在自己维护的界面框架分支里补上阴影绘制和圆角裁剪,再统一不同窗口的外观规则,同时修正阴影区域的点击转交。

补齐底层实现后,界面可以更直接地绘制,相关新增界面代码从 204 行减少到 115 行。独立基准中,整窗重画耗时从旧预制图片方案的 0.0063 秒降到约 0.0023 秒。

图 3:菜单圆角与阴影的设计示意,右侧为最终选择。
图 3:菜单圆角与阴影的设计示意,右侧为最终选择。

这些优化只是开始。接下来,我们还会探索磨砂背景,继续提升速度、打磨体验细节,甚至在这套基础上推进 macOS 版本的开发。

除了界面,我们现在也能深入更底层的系统接口,把 Listary 与系统的配合做得更好。最让我们激动的是,以前受限于框架、很难推进的事情,现在终于有条件放手去做了。我们可以继续把 Listary 往极致打磨。

一个意外之喜

超过 20 万行代码的重写,加上多平台开发和测试,需要组织大量相互关联的工作。为了推进这件事,我们自己做了一个工具:Towery。

通过 Towery,不同电脑上的 AI 可以围绕同一个目标分工协作。任务、上下文和结果能够接续起来,让大量开发、排查和验证工作持续往前推进。我们则把精力放在最核心的部分:决定做什么、作出关键取舍,以及验收最终的体验。需要人判断时,工作会带着具体问题和建议回到我们这里;方向确定后,AI 再继续推进。

真正用下来,我们发现 Towery 比预想中好用。Agent 让原本需要古法编程一两年的工作量缩短到了半年,Towery 又让半年缩短到了一个月。

Towery 帮了我们很多,我们也希望让更多人受益。我们计划将它开源,等它更成熟时,就和大家见面,让大家也能用它组织 AI、推进自己的工作。

下一步计划

现阶段,7.1 的主要目标是与 V6 在功能上对齐,让大家熟悉的功能和操作在重写后正常回归,同时做一些细节上的改进。更深入、系统性的优化还没有正式展开,接下来我们会继续推进。大家如果有任何想法或期待,欢迎告诉我们。

Listary 已经开发了 16 年,积累了很多功能、系统适配和使用细节。新版经过了一个月的内部测试,现在应该已经没有什么明显的问题了。但测试还无法覆盖所有使用场景,仍然可能有一些遗漏或小问题。

如果你在使用中发现了问题,欢迎向我们反馈。我们会及时跟进、修复,也会继续根据大家的实际使用体验打磨 7.1。

欢迎下载 Listary 7.1.0.37 Beta 安装包,体验这次重写带来的变化。目前的安装包适用于 64 位 Windows 10 和 Windows 11。

完整变化见更新日志。

ARM 版本也会很快推出,不久之后也会推出 macOS 版本,敬请期待。

让 Listary 来提升你的工作效率吧!

有了 Listary,你终于能双休了 🐶

免费下载 Listary