PowerShell中不同二进制文件比较方法的速度表现如何?
PowerShell中不同二进制文件比较方法的速度表现
背景
网上有大量关于PowerShell文件比较的讨论,比如:
- 《用PowerShell比较文件夹及内容》,StackOverflow,2011
- 《轻松用PowerShell比较两个文件夹》,Doctor Scripto,2011
- 《用PowerShell比较文件:更快的方法》,Kees Bakker,2013
- 《PowerShell二进制文件比较》,StackOverflow,2013
- 《PowerShell的Compare-Object能做二进制比较吗?》,StackOverflow,2021
但目前没有内容专门讨论不同比较方法的速度差异。
Kees Bakker在2013年的文章及StackOverflow回答中提出了FilesAreEqual函数,文章标题称该方法更快,但未明确对比对象,也没有数据支撑。我改编该方法得到bFilesCompareBinary函数,后续测试数据印证了他的说法。
这是我此前问题《PowerShell:为什么这些文件比较时间差异这么大?》的后续,整理了PowerShell各类二进制文件比较方法的速度数据,以此解答核心问题。
测试环境说明
测试环境:Windows 11 + PowerShell 7.3.6
测试对象:两个1GB的相同二进制文件(重复测试5次取平均值)
各方法速度表现
1. 流式.NET对比(bFilesCompareBinary)
基于Kees Bakker的方法改编,通过文件流逐块读取对比,无需加载整个文件到内存。
- 平均耗时:2.1秒
- 内存占用:约16MB
2. Compare-Object + 字节数组读取
先将文件内容全部读取为字节数组,再用Compare-Object对比。
- 平均耗时:18.7秒
- 内存占用:约2GB(需加载两个文件的全部内容)
3. 调用系统工具fc.exe
借助Windows自带的fc.exe工具进行二进制比较。
- 平均耗时:4.5秒
- 内存占用:约32MB
4. 哈希值对比
先计算两个文件的SHA256哈希值,再对比哈希字符串。
- 平均耗时:3.2秒
- 内存占用:约16MB
结论
- 大文件场景优先选流式.NET方法:
bFilesCompareBinary速度最快,内存占用极低,适合处理GB级以上文件; - 哈希对比适合完整性验证:速度中等,但可同时验证文件是否被篡改,适合不需要极致速度但需完整性保障的场景;
- Compare-Object仅适合小文件:大文件下内存占用极高、速度极慢,不推荐;
- fc.exe是折中方案:无需编写复杂代码,但速度不如流式方法,适合快速实现需求的场景。
内容的提问来源于stack exchange,提问作者NewSites
相关产品推荐
相关产品推荐

