为什么 Windows 安装程序(.msi 文件)比其他安装程序需要更长的时间来卸载?

Chr*_*s S 31 windows uninstall installer windows-installer

自 Windows XP 时代以来,Windows 安装程序(.msi 文件),包括 InstallShield 安装程序(这只是 MSI 的引导程序)卸载应用程序所需的时间是其他安装程序的五倍左右。安装通常也是如此。

为什么他们仍然需要这么长时间,为什么人们仍然使用 MSI 进行安装?例如:

卸载 VLC - 大约需要 5 秒钟。
卸载 XYZ - 启动“准备删除...”,然后延迟 15 秒。

它所做的只是删除文件和清理注册表(其中可能包括 COM 注册),那么为什么要花这么长时间呢?

har*_*ymc 32

Windows 安装程序首先系统地创建系统还原点,这是一个相当慢的操作。

同样来自题为“Windows Installer 糟糕透顶”的文章,摘录如下:

过去,安装将包括一个程序执行并采取几个简单的步骤来安装您的软件,然后在卸载时执行相反的操作。

这不是 Windows Installer 的工作方式。它不是运行一个程序来简单地安装并完成它,而是检查您的系统状态,然后检查作为程序安装程序的数据库的状态,然后进行一系列关于如何协调两者的过于复杂的计算。

看起来,它不是运行安装脚本,而是解决旅行商问题。这就是它运行如此缓慢的原因。或者至少,这是我的印象。

我还补充说,Windows 安装程序将所有信息保存在注册表中,这不是世界上最快的数据库。

  • 它可能比 `dpkg` 用于其包数据库的速度更快(尽管,不可否认,dpkg 不会在其中存储*所有内容*):`/var/lib/dpkg/status` 是一个纯文本文件,其中列出了每个包曾经安装过,并且此后没有被清除 - 我什至不确定它是否总是忽略被清除的那些。 (4认同)
  • `dpkg` 不会对我说谎,进度条会显示“剩余时间:0 秒”两分钟,但...... (3认同)

A D*_*arf 20

Windows Installer 确实以速度慢着称。有几件事对此有所贡献,我将在下面解决这些问题。但最终,人们应该问问自己,在安装和卸载软件时,一分钟、两分钟还是三分钟是否真的是一个争论的问题。我花的时间比翻阅电视频道要多:)

登记处
这是罪魁祸首。Windows Installer 大量使用注册表进行操作。随着系统的成熟、安装和卸载应用程序以及注册表的大小或变得碎片化,MSI 会变得更慢。与在成熟的系统上相比,相同的应用程序在原始 Windows 安装上的安装和卸载速度要快得多。这里的解决方案是尝试保持注册表清洁和碎片整理。

对于注册表清理,请使用可用的众多工具之一。但是对于注册表碎片整理,我不能推荐足够的NTREGOPT用于内部配置单元优化和PageDefrag用于物理文件碎片整理。

MSI 操作在注册表上变慢的原因与 MSI 使用它的方式有关。Windows Installer 使用注册表来跟踪哪些产品安装了哪些组件以及安装到哪个位置。原始安装 GUID 以压缩格式使用。关于安装的每台机器信息可以在 中找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18,而每用户数据可以在它旁边的下边HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\和带有用户 SID 的键上找到。

这两个键都可以非常大,并且包含许多子键和值。它们控制每个已安装应用程序的产品、组件和 KeyPath。必须阅读和处理所有这些信息才能执行正确的卸载过程。然而,注册表格式按字母顺序列出了允许二进制搜索的键。但价值观不是。它们在创建时存储,因此必须执行线性搜索过程。这会降低算法性能。

总而言之,MSI是一种相当完整和准确的软件安装和卸载方法。但它受其注册表依赖性的影响。该系统非常好。很久以前就应该对 Windows 注册表进行大修:)

有关更多高级信息:
有关 MSI 在每个安装或卸载过程中执行的操作的深入分析,请参阅这篇文章该文章解释了如何设置 MSI 调试。或者,对于较少但仍然有价值的信息,一个如何激活日志记录。

  • 此外,据我所知,MSI 对它所做的一切都使用事务,因此每当操作失败时,它始终可以进行适当的回滚。这可能也无助于提高速度,但对于数据完整性非常重要。(我不再计算在 NSIS 安装程序失败后需要清理的频率 -.-) (4认同)

Ste*_*mul 6

Windows 安装程序对于企业部署有很多很大的优势,其中一些我在这里描述过:https : //serverfault.com/a/274609/20599

大部分的缓慢Windows安装程序会话是由于其回滚功能。首先,它会在安装或卸载之前创建一个还原点(前提是尚未禁用系统还原)。然后它将在卸载和安装过程中备份所有受影响的文件,以确保系统在发生错误时可以恢复到其原始状态。

另一个促成因素是 MSI 中的所有组件都将在注册表中注册。这涉及一些开销

对于已编译的 MSI 文件,还需要一些时间来提取安装文件

有关加速 MSI 安装的技术细节,请参阅此答案。