参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

使用二分法解决扩展问题

2021年2月16日,作者:Johannes Rieken, @johannesrieken

“就像 git-bisect 一样,但用于 VS Code 扩展。”

Visual Studio Code 的真正强大之处在于它的扩展:主题扩展添加颜色和图标,语言扩展支持智能代码补全(IntelliSense)和导航,调试器扩展使您能够运行代码并轻松查找错误。还有些扩展可以播放音乐,有些可以显示股票行情,有些则支持跨地点和时区的协作工作。VS Code 市场托管了超过28,000个扩展,用户安装50个或更多扩展的情况并不少见。有这么多扩展,错误是不可避免的。我们不想否认错误,而是希望使故障排除变得容易。

“坏”扩展

我们热爱扩展,并不真正认为存在任何“坏”扩展。然而,像所有软件一样,扩展也有错误和功能缺陷。因此,为了便于阅读和制造一些戏剧性效果,我们使用“坏扩展”这个词,它指的是可能崩溃或只是显示不必要行为的扩展。幸运的是,我们在设计 VS Code 时考虑到了“坏”扩展,因此将它们运行在单独的进程中。这种隔离保证了 VS Code 会持续运行,光标始终闪烁,并且您始终可以保存您的工作。

为了有趣,也为了更容易演示扩展二分法,我们创建并发布了扩展二分法演示扩展。安装后,当您到达“bisect”一词时,它会令人恼火地重置您的光标。您可以使用此扩展来跟随这篇博文。

用困难的方式寻找“坏”扩展

今天,找到一个“坏”扩展可能容易也可能困难。打开扩展视图(⇧⌘X (Windows, Linux Ctrl+Shift+X)),禁用一个扩展,重新加载窗口(开发人员:重新加载窗口),然后检查问题是否仍然存在。如果问题消失了,那么该扩展就是“坏”的,您就完成了。否则,重新启用该扩展,并对下一个扩展重复此过程。

Disabling an extension step by step

如果您幸运的话,第一个扩展就是“坏”的;如果您不幸的话,它是最后一个扩展。用计算机科学语言来说,这意味着对于 N 个扩展,最坏情况下您需要重复该过程 O(N)(N 的数量级),平均情况下为 O(N/2)。由于此算法由人类(您)操作,即使 N 的值很小,也十分费力。这就是扩展二分法工具派上用场的地方。在最坏情况和平均情况下,它要好得多,因为它将扩展逐半禁用。

欢迎使用扩展二分法

VS Code 中的扩展二分法工具灵感来源于 git bisect 命令。对于熟悉 Git 的人来说,这个命令有助于找出仓库中是哪个提交引入了问题。

让我们举个例子:我安装了 24 个扩展,其中第 8 个扩展是“坏”的。我们知道迭代方法需要 8 步。那么二分法呢?

下面的视频展示了如何通过 帮助:开始扩展二分法 命令启动扩展二分法,然后选择 现在没问题仍然有问题,直到识别出“坏”扩展。一旦识别出来,您可以选择为该扩展报告问题。

The extension bisect process

以下是找到“坏”扩展的逐步过程

  1. 二分法将 24 个扩展分成两半,每半 12 个,并禁用第二半的所有 12 个扩展。
  2. 在此示例中,第8个扩展是“坏”扩展,因此它在前半部分,并未被禁用。事情仍然没有像我们预期的那样运行。由于仍然存在问题,扩展二分法会重复该过程,将前12个扩展分成两部分:6个启用,6个禁用。所有其他扩展也都被重新启用。
  3. 现在,第8个扩展已被禁用。现在一切都好了。这意味着二分法可以继续处理后半部分(扩展6-11),并将它们分成3个启用和3个禁用的扩展。
  4. 现在,第8个扩展被重新启用,问题再次出现。这意味着二分法继续处理前半部分。它将它们分为1个启用和2个禁用的扩展。
  5. 现在,第8个扩展被禁用,一切都恢复正常,二分法继续处理后半部分,将其分为1个启用和1个禁用的扩展。
  6. 第8个扩展是唯一被禁用的扩展,并且问题已经消失。这意味着我们已经找到了“坏”扩展,并且我们已经完成了。

更快地排查故障

我们看到,在每个步骤中,二分法都将搜索空间减少一半。现在它以对数时间运行,导致平均和最坏情况下的性能为 O(log N)。这相当不错,因为它具有良好的可扩展性。对于 24 个扩展,您需要 4 到 5 步才能找到一个“坏”扩展;对于 38 个扩展,只需再多一步。然而,最佳情况会更差,因为使用迭代方法,您可能运气好,在第一轮就找到“坏”扩展。

请记住,扩展二分法依赖于您提供正确的反馈。您很容易通过始终回答现在没问题(归咎于最后一个扩展)或仍然有问题(找不到扩展)来欺骗它,也欺骗自己。

另一个有用的见解是,扩展二分法会从考虑已启用的扩展的完整列表开始。这意味着您可以通过在开始之前禁用已知“良好”扩展并在之后重新启用它来将其排除在二分法之外。但是,只有当您确定该扩展不是“坏”扩展时才这样做。

最后,您可能会注意到二分法多花了一步 (log2(N) + 1)。这是因为它在第一轮中禁用了所有扩展。之所以这样做,是因为您可能遇到的问题是由 VS Code 本身引起的,而不是由扩展引起的,我们不想让您不必要地陷入困境。

就这样。我们希望您永远不需要使用扩展二分法。然而,如果您确实遇到可能与扩展相关的问题,那么我们希望能够使故障排除更容易、更快、更愉快。

编程愉快,

Johannes Rieken, VS Code 首席软件工程师 @johannesrieken

© . This site is unofficial and not affiliated with Microsoft.