使用二分查找解决扩展问题
2021 年 2 月 16 日,作者 Johannes Rieken,@johannesrieken
"就像 git-bisect,但适用于 VS Code 扩展。"
Visual Studio Code 的真正强大之处在于其扩展:主题扩展添加颜色和图标,语言扩展启用智能代码补全(IntelliSense)和导航,调试器扩展使您能够运行代码并轻松找到错误。有一些扩展可以播放音乐,有些扩展可以显示股票行情,还有一些扩展可以跨位置和时区进行协作工作。VS Code Marketplace 托管了超过 28,000 个扩展,用户安装 50 个或更多扩展并不罕见。有如此多的扩展,错误是不可避免的。与其否认,我们希望使故障排除变得更容易。
"不良"扩展
我们喜欢扩展,并不认为有任何“不良”扩展。然而,与所有软件一样,扩展也存在错误和功能差距。所以,为了便于阅读和制造戏剧性,让我们使用“不良扩展”一词,指的是可能崩溃或显示意外行为的扩展。幸运的是,我们在设计 VS Code 时考虑了“不良”扩展,因此在单独的 进程 中运行它们。这种隔离保证了 VS Code 继续运行,光标始终闪烁,并且您始终可以保存工作。
为了好玩,并为了更轻松地演示扩展二分查找,我们创建并发布了 扩展二分查找演示 扩展。安装后,它会烦人地重置您的光标,无论何时您遇到“bisect”一词。您可以使用此扩展来遵循本文中的步骤。
以艰难的方式找到一个"不良"扩展
如今,查找“不良”扩展可能很容易或很困难。打开“扩展”视图(⇧⌘X (Windows、Linux Ctrl+Shift+X)),禁用扩展,重新加载窗口(**开发人员:重新加载窗口**),并检查问题是否仍然存在。如果问题消失了,那么该扩展就是“不良”的,您就完成了。否则,重新启用该扩展并对下一个扩展重复该过程。
如果您幸运,第一个扩展就是“不良”的;如果您不幸,则是最后一个扩展。使用计算机科学语言来说,这意味着对于 N
个扩展,您在最坏情况下需要重复该过程 O(N)
(N 阶),在平均情况下需要重复 O(N/2)
。因为该算法由人类(您)操作,所以即使是 N
的较小值也很费力。这就是 扩展二分查找 工具派上用场的地方。它在最坏情况和平均情况下都更好,因为它通过二分法禁用扩展。
欢迎使用扩展二分查找
VS Code 中的扩展二分查找工具的灵感来自 git bisect 命令。对于熟悉 Git 的人来说,此命令有助于找出存储库中哪个提交引入了问题。
让我们用一个示例:我安装了 24 个扩展,第 8 个扩展是“不良”的。我们知道迭代方法需要 8 步。二分查找呢?
下面的视频展示了如何通过 帮助:启动扩展二分查找 命令启动扩展二分查找,然后选择 现在好了 或 这很糟糕,直到找到“不良”扩展。一旦找到,您可以选择为该扩展报告问题。
以下是找到“不良”扩展的步骤:
- 二分查找将 24 个扩展分成两半,每半 12 个扩展,并禁用第二半的所有 12 个扩展。
- 在这个示例中,第 8 个扩展是“不良”的,因此它是前半部分,没有被禁用。事情仍然没有按预期进行。因为仍然存在问题,扩展二分查找会重复该过程,将前 12 个扩展分成两部分:6 个启用,6 个禁用。所有其他扩展也被重新启用。
- 第 8 个扩展现在被禁用了。现在一切正常。这意味着二分查找可以在第二半(扩展 6-11)上继续进行,并将它们分成 3 个启用和 3 个禁用的扩展。
- 现在,第 8 个扩展被重新启用,问题再次出现。这意味着二分查找在前半部分继续进行。它将它们分成 1 个启用和 2 个禁用的扩展。
- 第 8 个扩展现在被禁用了,一切再次正常,二分查找在后半部分继续进行,将其分成 1 个启用和 1 个禁用的扩展。
- 第 8 个扩展是唯一禁用的扩展,问题消失了。这意味着我们找到了“不良”扩展,并且已经完成了。
更快地排查问题
我们看到,在每一步中,二分查找都会将搜索空间减半。它现在以对数时间运行,导致平均和最坏情况下的性能为 O(log N)
。这很好,因为它扩展性很好。对于 24 个扩展,您需要 4 到 5 步才能找到“不良”扩展,对于 38 个扩展,只需要多走一步。但是,最优情况更糟,因为在迭代方法中,您可能会很幸运,并在第一轮中找到“不良”扩展。
请记住,扩展二分查找依赖于您提供正确的反馈。您可以轻松地欺骗它,以及你自己,通过始终回答 现在好了(责怪最后一个扩展)或 这很糟糕(找不到扩展)。
另一个有用的见解是,扩展二分查找从考虑所有已启用扩展的完整列表开始。这意味着您可以在开始之前禁用已知的“良好”扩展,并在之后重新启用它,以将它从二分查找中排除。但是,只有在您确定该扩展不是“不良”的扩展时才这样做。
最后,您可能会注意到,二分查找多走一步 (log2(N) + 1
)。这是因为它在第一轮中开始禁用所有扩展。第一步是完成的,因为您可能遇到的问题可能是由 VS Code 本身引起的,而不是由扩展引起的,我们不希望不必要地让您陷入困境。
就是这样。我们希望您永远不需要使用扩展二分查找。但是,如果您遇到可能与扩展相关的错误,那么我们希望我们能够使故障排除更容易、更快、更愉快。
祝您编程愉快!
Johannes Rieken,VS Code 首席软件工程师,@johannesrieken