快速机器,慢速机器 (2023) - 现代系统中的性能倒退
快速机器,慢速机器
2023年6月27日 · 大约16分钟 · 标签:featured, opinion, twitter-thread
好吧,这真是_意料之外_。我花了5分钟录制了几个糟糕的视频,发布在了一个 Twitter 帖子里,结果火了,目前已经有8.8K个赞。考虑到我多年来一直在发布我认为有趣的内容,但几乎没有引起任何兴趣,我真的无法预测到这一点。现在事情已经平息下来,是时候重新激起一些波澜,更理性地阐述一下这些想法了。
总而言之,这个 Twitter 帖子展示了两个视频:一个是在旧电脑上运行的 Windows NT 3.51,另一个是在新电脑上运行的 Windows 11。在每个视频中,我打开并关闭了命令提示符、文件资源管理器、Notepad 和 Paint。你可以清楚地看到旧电脑上的应用程序是如何立即打开的,而新电脑上的应用程序在加载时则表现出明显的延迟。我质疑说,当像这样的小事都在退步时,计算机实际上是如何变得更好的。然后,点赞和转发就开始涌入。显然,有些人对我的说法有异议,但似乎绝大多数人都同意我们遇到了问题。
首先,我将坚持我的观点:现代计算机界面,使用现代操作系统和现代应用程序,其延迟是非常糟糕的,并且还在变得更糟。这也适用于智能手机。与此同时,虽然过去的计算机上的 UI 更加灵敏,但这些计算机在许多方面也很糟糕:新系统已经极大地改变了我们的生活。那么,问题出在哪里?
关于操作系统、编程语言、测试、构建系统、我自己的软件项目,甚至个人效率的博客。具体包括 FreeBSD、Linux、Rust、Bazel 和 EndBASIC。
订阅
0 位订阅者
最初的比较
首先,让我们解决房间里的大象。我发布的最初的比较_并不_公平,而且我一开始就意识到了这一点。也就是说,我_知道_ “正确地”重复这个实验会产生相同的结果,所以我直接用我当时拥有的东西开始了。这些视频是未经计划的,因为当我启动旧机器,点击命令提示符时,立即启动应用程序的这种感觉让我印象深刻,于是就产生了发推文的想法。
最初的比较视频显示:
- 一台配备 128MB 内存和 5400 RPM HDD 的 AMD K7-600,运行 Windows NT 3.51。这是一台来自 1999-2000 年的机器,其操作系统比它大约早 5 年。当时的硬件正在经历非常快速的改进,尤其是在 CPU 速度方面,你几乎必须跟上 2 年的升级周期,否则会遭受难以置信的缓慢。所有这些都表明,这台机器对于我使用的操作系统来说确实是过剩的。
请提醒我我们是如何前进的。在这个视频中,一台来自 2000 年左右的机器(600MHz,128MB 内存,旋转磁盘)运行 Windows NT 3.51。请注意打开应用程序是多么的迅速。👇 pic.twitter.com/YEO824vIqI — Julio Merino (@jmmv) 2023年6月22日
- 一台 Surface Go 2,配备 Intel Core m3 CPU、8GB 内存和一个运行 Windows 11 的 SSD。这是一台 3 年前的机器,出厂时预装了 Windows 10,但 Windows 11 得到了官方支持——而且你知道,这意味着你会被诱骗升级。这_绝对不是_一台强大的机器,但是:首先,它运行的是原汁原味的微软体验,其次,它_应该_比 K7 系统强大得多,不是吗?我们不断地被提醒说,今天的任何计算机或手机都比过去的机器拥有多个数量级的性能。
现在看看在 Surface Go 2 上运行 Windows 11 时打开相同应用程序的情况(四核 i5 处理器,2.4GHz,8GB 内存,SSD)。一切都非常迟缓。pic.twitter.com/W722PNEGv0 — Julio Merino (@jmmv) 2023年6月22日
哦,是的,我在最初的推文中引用了错误的硬件规格。再次查看我是如何犯这个错误的:我在 Bing 中搜索了 “Surface Go 2”,我进入了 “Surface Laptop Go 2” 页面,并复制了我在那里看到的内容,而没有注意到它不准确。
所有应用程序之前都已打开,因此它们都应该舒适地驻留在内存中。
更好的比较
显然,有些人注意到我的比较存在问题(硬件配置不公平,规格错误),所以当这个帖子开始受到关注时,我重新做了比较:
- 在 K7-600 机器上运行 Windows 2000(参见安装帖子)。这是一个来自 1999 年的操作系统,运行在同年份的硬件上。而且,如果你问我,这是有史以来最好的 Windows 版本:在 NT 内核上拥有超级干净的 UI,并具有你想要的所有关于性能和稳定性的特性(除了糟糕的启动时间)。正如你所看到的,就 UI 响应性而言,旧机器仍然表现得_非常_好。
对于那些认为比较不公平的人,这是在同一台 600MHz 机器上运行的 Windows 2000。两者都来自同一年,1999 年。请注意,这种即时性仍然完全相同,并且尚未被破坏。pic.twitter.com/Tpks2Hd1Id — Julio Merino (@jmmv) 2023年6月23日
- 在 Mac Pro 2013 上运行 Windows 11(参见安装说明),配备 6 核 Xeon E5-1650v2,主频 3.5GHz,32GB 内存,双 GPU 和一个可以维持高达 1GB/s 的 SSD。我知道,在这一点上,这是一台 10 年前的机器,运行着一个更现代的操作系统。但是请,请你严肃地告诉我,具有这些规格的硬件无法毫无延迟地处理打开简单的桌面应用程序。我等着。
哦,还有一件事。是的,是的,Surface Go 2 的性能不足,这是你们都想说的。但是看看这个视频。在配备 3.5GHz 6 核处理器和 32GB 内存的 Mac Pro 上执行相同的步骤。所有应用程序都已缓存。请注意它们是如何分块绘制的。这不是因为动画效果或平庸的硬件。pic.twitter.com/9TOGAdaTXO — Julio Merino (@jmmv) 2023年6月23日
我使用 Mac Pro 的原因是它是我目前运行 Windows 的最好的机器,事实上,它是我日常使用的机器。但是,我并不关心在这种 “旧” 机器上运行这种比较可能存在的 “不准确性”。当我去年离开微软时,我经常使用 2022 年的 Z4 桌面、配备 32GB 内存的满配四核 i7 ThinkPad 和配备 16GB 内存的 i7 Surface Laptop 3。在这些机器上,延迟当然会更短,但交互仍然明显缓慢。
所以,在任何情况下:我同意最初的比较可能存在缺陷,但正如你所看到的,一个更好的比较会产生相同的结果——这是我早就知道的。经过年复一年的计算机使用,你对事物应该如何运行产生了直觉,并且只要你稍后_验证_你的假设,相信这种直觉通常会运作良好,不要误会我的意思!
计算机的进步
让我们把推文放在一边,谈谈自 2000 年代以来发生的变化。我开玩笑地问我们作为一个行业是如何 “前进” 的,所以值得研究一下。
事实上,我们在许多方面_都_取得了进步:我们现在拥有令人难以置信的图形和高分辨率显示器、超快的网络、实时视频编辑等等。所有这些年来都得到了改进,而且这些进步确实促成了一些生活方式的转变。一些例子:由于高质量的视频会议,能够更容易地与亲人沟通;能够拥有流媒体 “家庭影院”;以及在大流行期间轻松地切换到远程工作1。
我们在 I/O 方面也取得了进步。磁盘 I/O 一直是过去系统中最薄弱的环节。软盘不可靠且缓慢。CD 和 DVD 的可靠性稍高一些,但也很慢。HDD 是许多事情的瓶颈:它们的吞吐量随着时间的推移而提高,从而实现了更高分辨率的视频编辑等功能,但随机 I/O 达到了物理极限——而快速随机 I/O 本质上驱动着桌面响应性。
然后,砰的一声,SSD 出现了,并开始出现在桌面上。这些改变了游戏规则,因为它们解决了随机 I/O 的问题。突然之间,启动计算机、启动大型游戏、打开包含大量小照片的文件夹,或者仅仅是使用你的计算机……所有这些都得到了极大的改善。如果你没有经历过这种转变,就很难解释这些带来的可用性改进,而且令人恐惧的是这些改进几乎消失了;稍后会详细介绍。
其他方面也得到了改进,例如安装新硬件的简单性、无线连接和设备的普遍性、文本和应用程序的国际化(Unicode 既不容易也不便宜,我承认)……所有这些都提供了比以往任何时候都更可用、更适应更多情境的机器。
所以是的,事情在许多方面都变得更好了,我们拥有比以往任何时候都更多的能力。否则,我们就无法在小手机上进行 ML 辅助的照片处理等操作,这在 2000 年代是无法想象的。
可怕的延迟
然而……所有这些进步都无法解释为什么今天的 UI 延迟如此令人痛苦地缓慢。来自 1999 年的旧硬件,加上同年份的操作系统,表明响应式系统是存在的2。如果有什么不同的话,我描述的所有这些硬件改进都应该使事情变得_更好_,而不是更糟,不是吗?
有些人回复比较时告诉我,图形动画和更大的屏幕是 “罪魁祸首”,因为我们必须绘制更多的像素,因此,我们拥有这些新的优点意味着我们必须容忍缓慢。好吧,不完全是。亲眼见证:
还有……一件事?对于那些说:“这是更高的 4K 分辨率!” 或者 “这是好看的动画!” 或者 “这是漂亮的桌面背景!”——不,它们不是罪魁祸首。你看,即使禁用所有这些,仍然可以看到缓慢。最后……博客文章即将发布。pic.twitter.com/9BQy6IpK6a — Julio Merino (@jmmv) 2023年6月26日
GPU 现在是一种商品,它们减轻了 CPU 的图形管理负担。桌面渲染的图形动画类型计算起来非常便宜,并且自 macOS 推出以来就证明了这一点:macOS 桌面上的所有图形效果都感觉是即时的。这些效果_确实_会延迟交互——桌面切换动画尤其具有侵入性,天啊,我有多讨厌它——但延迟通常来自动画期间的有意暂停。当效果引入延迟是因为 GPU 无法跟上时,例如当你将 4K 显示器连接到非常旧的 Mac 时,动画会因缺少性能而卡顿,这一点显而易见。但是我在上面的任何视频中都没有遇到后者,这就是为什么动画等与我的担忧无关的原因。
所以,请用批判的眼光来思考它。实时编辑多个 4K 视频流或流式传输 4K 电影的能力如何导致启动像 Notepad 这样的应用程序变慢?或者打开桌面上的上下文菜单?或者阅读你的电子邮件?我们获得的新能力从 CPU 和 GPU 中获得了更多的性能,但它们不应该从本质上受 I/O 限制的任务中移除性能。打开一个简单的应用程序不应该比 20 多年前慢;真的不应该。但事实就是如此。桌面延迟的原因来自其他地方,我对这些原因有一些猜测。但首先,让我们看看几个例子。
例子
在 Windows 领域,我想提出两个明显的例子,并在 Twitter 帖子中提到:
- Notepad 一直到最近还是一个原生应用程序,并且仍然几乎立即打开。随着它被重写为 UWP 应用程序,情况变得更糟。前后变化显而易见,但……该应用程序仍然像以往一样缺乏功能。这是额外的缓慢,对用户没有任何好处。
- 至于 Windows Terminal,当然,它比以往的任何东西都好,但它明显比旧的命令提示符重得多。如果你将 PowerShell 添加到其中,那么除非你拥有顶级的硬件,否则一个新的终端窗口需要几_秒_才能运行。
macOS 的表现确实比 Windows 更好,但它仍然存在问题。请参阅 @AlexRugerMusic 提供的这个示例。即使是强大的 M1 也难以打开系统设置应用程序:
另一个例子:左:2006 MBP(2GHz Core 2 Duo,2GB DDR2 内存,Max OS X 10.6.8;有 SSD)右:2021 MacBook Air(M1,16GB 内存,macOS 13)在 Pro 上打开应用程序的速度大约是在 Air 上的两倍(大多数,不仅仅是系统偏好设置/设置)。pic.twitter.com/PjMX1DI4uz — rewgs (@AlexRugerMusic) 2023年6月27日
Linux 可能是受这些问题影响最小的系统,因为它在适度的硬件上仍然感觉非常流畅。Fedora Linux 38 于 2023 年 4 月发布,在 11 年前的一台微型 PC 上运行得非常好——即使 Gnome 或 KDE 在过去也是资源大户。也就是说,这只是一种错觉。一旦你开始安装任何不是专门为 Linux 开发的现代应用程序……缓慢的应用程序启动时间和总体较差的性能就会显现出来。
相关的,但我认为需要说一下:对我来说最大的震惊是我在 2009 年加入 Google 时。当时,Google Search 和 GMail 具有出色的性能:它们是值得效仿的榜样。但是从内部来看……我对所有内部工具的缓慢程度感到非常震惊,特别是内部命令行工具的缓慢程度。实际上,我认为 Google 对我们今天所处的局面负有责任,因为他们令人印象深刻的内部系统以及他们不遗余力地推动 Web 应用程序,这使我们想到了……
原因
这一切是如何发生的?很容易说 “臃肿!”,但这是一个很难定义的东西,因为臃肿是可以理解的:一个人认为的臃肿与另一个人认为的臃肿不同。毕竟,“80% 的用户只使用他们所使用的软件的 20%”(参见 帕累托原则),但关键的见解是,每个用户使用的 20% 是彼此不同的。因此,臃肿不一定在于软件提供的功能;它在其他地方。
然后我们有了框架和抽象层,这些框架和抽象层似乎为了臃肿而引入了臃肿。但我不确定这也是正确的:抽象本身并不一定非得让事情变慢,正如 Rust 所证明的那样。使事情变慢的是优先级。除非在重要的关键情况下(视频游戏、转码视频等),否则现在没有人再优先考虑性能。人们(公司)优先考虑的是开发人员的时间。例如:你可能不想使用 Rust,因为其陡峭的学习曲线意味着你将花费更多的时间学习而不是交付,或者其更长的编译器时间意味着你将花费更多的时间等待编译器而不是~~发布~~调试生产。或者另一个例子:你可能不想开发原生应用程序,因为这意味着 “重复工作”,因此你寻求一个跨平台的 Web 框架。也就是说,Electron。
我知道很容易贬低 Electron,但有明显的迹象表明这个平台是造成桌面延迟的很多损害的原因。以 1Password 的第 8 版为例,许多从第 7 版迁移过来的用户都鄙视它,因为新界面的缓慢。或者以 Spotify 为例,在其成立之初,它将启动和播放延迟优先于其他任何事情,但是如果你使用它,你就会知道,现在情况并非如此:
2009 版本:20MB 完全原生的 cocoa 应用程序,在一秒内启动,当你点击时会立即反馈,播放通常在 50 毫秒内开始。pic.twitter.com/Enzi40PDCX — Rasmus Andersson (@rsms) 2023年5月10日
这些应用程序用 Electron 重写,以便在桌面上提供统一的体验并降低成本……但为了谁?成本削减是为了拥有这些产品的公司,而不是为了用户。由于我们每天的挫败感以及不必要地升级硬件的需要,这些削减对_我们每个人_征收了税。将这些重写与操作系统无法跨应用程序重用重型框架这一事实相结合(与使用所有内存作为缓存是一个有缺陷的前提这一概念相同)……当你同时运行这些应用程序时,臃肿会迅速增加。
除了 Electron 之外,另一个可能引入延迟的决定是大量采用托管和解释型语言。我知道也很容易贬低这些语言,但那是因为我们有理由这样做。以 Java 或 .NET 为例:几个 Windows 应用程序已慢慢用 C# 重写,虽然我没有证据证明这一点,但我从过去的经验中确信,这可能是我们注意到的迟缓背后的原因。JDK 和 CLR 在优化长时间运行的进程方面做得非常出色(它们的 JIT 可以使用 PGO 获取实时数据),但是处理快速启动时间并不是它们擅长的事情。这就是为什么例如 Bazel 会生成一个后台服务器进程来掩盖启动延迟,以及为什么 Android 经历了 AOT 编译的多次迭代。(编辑:肯定还有我没有研究过的其他原因。正如有人指出的,我假设 Windows Terminal 主要用 C# 编写的假设是不正确的。)
更多内容请参见 Wirth 定律。
一次性的改进被蚕食
最后,让我以悲观的口吻结束,回到硬件的进步。
SSD 给我们带来的特殊改进是一次性的_转变_。HDD 多年来一直在变得更快,但它们永远无法提供桌面流畅运行所需的随机 I/O。切换到 SSD 带来了一种不同层次的改进。不幸的是……我们只能购买_一次_这些好处:没有其他技术可以切换到提供这种变革性的体验。因此,一旦新技术带来的好处被粗心的软件蚕食,我们就几乎回到了原点。是的,SSD 正在变得更快,但是较新的驱动器不会带来从 HDD 到 SSD 的变化所带来的那种巨大的差异。
如果你尝试使用最新版本的 Windows 或 macOS 而没有 SSD,你就可以自己看到这一点:这几乎是不可能的。这些系统现在假设计算机中有 SSD,这是一个公平的假设,但由于我上面提到的原因,这是一个有问题的假设。这同样适用于应用程序中的 “臃肿”:打开你喜欢的资源监视器,查找磁盘 I/O 带宽图,然后启动任何现代应用程序。你将看到从磁盘加载到内存中的 MB 又 MB 的数据流,所有这些都必须在应用程序响应之前完成。这就是 Electron 添加的以及 SSD 允许的臃肿类型,但是可以通过不同的设计决策完全避免。
这让我担心 Apple Silicon。还记得 M1 发布时的所有狂热以及这些新机器如何具有卓越的性能、极长的电池续航时间和无风扇噪音吗?好吧,等着瞧:如果我们继续走同样的粗心道路,这些好处将会被蚕食。一旦发生这种情况,就为时已晚。将性能改造到现有应用程序中在技术上非常困难,并且几乎不可能在组织上优先考虑。
那么……计算机架构师能否通过其他革命性的技术转变来拯救我们?我不想依赖这一点。不是因为可能不存在转变,而是因为我们_不需要它们_。
- 哦,等等:远程工作不符合条件。我很抱歉:如果你在 90 年代或 2000 年代进行了任何类型的开源开发,你_知道_当时完全可以进行完全分布式_和_真正异步的工作。↩︎
- 为了进行更详细的分析,Dan Luu 已经在他的著名文章“计算机延迟:1977-2017”中介绍了这种由延迟引起的减速。请注意,这篇文章比 1999 年更早,并且他发现的延迟最佳的计算机来自 1983 年。但是,是的,那台旧计算机无法匹配我们现在计算机所承受的工作负载,因此我认为将其与现代桌面进行比较是不公平的。↩︎