为什么Windows Installers(.msi文件)比其他安装程序花费更长的时间?


31

从Windows XP开始,Windows Installers(.msi文件)(包括InstallShield安装程序(这只是MSI的引导程序))与其他安装程序相比,其卸载应用程序所需的时间大约是原来的五倍。安装也通常如此。

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

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

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


我只想指出,只有当您(1)禁用系统还原检查点功能,并且(2)它是一个巨大的安装程序(这不是Windows Installer所独有的-我见过很多慢的Inno安装程序,仅仅是因为它们很大)。我已经让Windows安装程序在几秒钟内(从字面意义上)安装删除了它们。(例如,Bootvis在我的系统上安装3秒钟。它在相同的时间内卸载。而且不,我的系统也不能很快运行。)区别在于Windows Installer具有很多功能,因此程序更大经常使用它。
Mehrdad

@Mehrdad您的意思是(1)启用系统还原?
克里斯·S

的确是错字。
Mehrdad

2
我之所以来到这里,是因为MSI的卸载工作将永远持续下去……实际上,原因是弹出窗口Do you want to allow the following program from an unknown publisher to make changes to this computer?隐藏在后台。
Nicolas Raoul

有关加快MSI安装的技术细节,请参见以下答案:superuser.com/a/296534/11906
SteinÅsmul2014年

Answers:


32

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

同样摘自标题为“ Windows Installer很烂”的文章的摘录:

过去,安装将由一个程序组成,该程序执行并采取一些简单的步骤来安装软件,然后在卸载时执行相反的操作。

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

看来,与其运行安装脚本,不如解决旅行商问题。这就是为什么它运行如此缓慢的原因。至少,这就是我的印象。

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


3
它可能比dpkg其软件包数据库使用的速度要快(尽管,dpkg不会在其中存储所有内容):/var/lib/dpkg/status是一个纯文本文件,其中列出了曾经安装过但尚未清除的每个软件包。甚至无法确定它总是会遗漏那些被清除的东西。
SamB 2010年

3
dpkg不会用进度条说“剩余时间:0秒”两分钟对我说谎,但是……
LawrenceC

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 Debug。或者,对于较少但仍然有价值的信息,这是一个如何激活日志记录的信息。


4
另外,据我所知,MSI会在所有操作中使用事务,因此只要操作失败,它总是可以进行正确的回滚。这可能也不会提高速度,但对于数据完整性来说是必不可少的。(我不再计算NSIS安装程序失败后需要多久进行一次清理-.-)
Joey

现在,我正在安装OpenOffice,已经快一个小时了;)
Quiark,2010年

非常丰富。我的一个msi日志似乎经常出现“无法创建还原点”错误(也许达到还原点引用了吗?),因此创建还原点并没有机会阻碍我的安装时间。无论如何,我的安装时间仍然很慢,并且如果值查找像您说的那么慢,我想微软没有任何理由为注册表的二进制规范中的额外叶/节点信息提供额外的实现,从而补充二进制搜索。
chaz

>但最终,应该问自己一分钟,两分钟或三分钟是否真的是安装和卸载软件时的争执问题。是。
阿列克谢·阿维琴科

6

Windows安装程序对于公司部署具有许多重要的优势,其中一些我已经在这里进行了描述: https //serverfault.com/a/274609/20599

Windows Installer会话的慢速很大程度上归因于其回滚功能。首先,它会在安装或卸载之前创建一个还原点(尚未禁用提供的系统还原)。然后它将在卸载和安装期间备份所有受影响的文件,以确保在发生错误时可以将系统还原到其原始状态。

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

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

有关加快MSI安装速度的技术详细信息,请参见此答案。


3

Windows Installer之所以如此普遍使用,其原因有很多-操作系统集成,安全策略,无人值守的安装等等。

我能想到的最常见原因是无人参与的安装和网络分布。大型公司可以通过将.MSI文件放在网络驱动器上,然后仅在远程计算机上调用批处理文件(或分发向导应用程序)来自动执行安装过程,从而轻松分发应用程序。

尽管.MSI文件之外还存在其他选项,但是有些独特的功能可以与大多数其他安装程序没有的大多数Windows版本集成

就像您知道的那样-InstallShield并不总是MSI文件的前端。他们也有自己专有的安装解决方案。


1
问题是,与纯.exe安装程序相比,为什么MSI需要花费这么长时间才能执行某些操作。
grawity

5
从问题开始……“为什么人们仍然使用MSI进行安装?”
突破

@grawity:从技术上讲,msi安装程序也可以打包在exe中,但这可能会造成分裂。
music2myear11年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.