How to expand archive with PowerShell?

The PowerShell 5.0 has features to support ZIP archives – Expand-Archive and Compress-Archive. They are very handy but what about performance?

During deployment we have to extract a ZIP archive, and I wrote a simple PowerShell script to measure a performance two different ways to extract ZIP archive. The first method is using native PowerShell command Expand-Archive; the second method is using ExtractToDirectory method from System.IO.Compression.Filesystem.

$measureExpand = Measure-Command {
    $ProgressPreference=’SilentlyContinue’
    Expand-Archive $archivePath "$destinationFolder\TestExpand" -Force
}
$measureExpand


$measureExtract = Measure-Command { 
    Add-Type -assembly System.IO.Compression.Filesystem
    [io.compression.zipfile]::ExtractToDirectory($archivePath, "$destinationFolder\TestExtract")
 }

$measureExtract

The results are the following for around 90MB archive (10 tries).

  • First column – ZIP archive and destination folder are on the same disk
  • Second column – ZIP archive and destination folder are on different disks
  • With antivirus software, expand archive takes around 10 – 15 minutes
---
ExtractToDirectory 0:46
Expand-Archive     1:45
---
ExtractToDirectory 0:54
Expand-Archive     2:29
---
ExtractToDirectory 1:04
Expand-Archive     1:57
---
ExtractToDirectory 1:10
Expand-Archive     1:59
---
ExtractToDirectory 1:05
Expand-Archive     1:55
---
ExtractToDirectory 1:05
Expand-Archive     1:56
---
ExtractToDirectory 1:01
Expand-Archive     1:53
---
ExtractToDirectory 0:56
Expand-Archive     2:00
---
ExtractToDirectory 1:01
Expand-Archive     1:59
---
ExtractToDirectory 1:02
Expand-Archive     1:57
---
ExtractToDirectory 0:12
Expand-Archive     1:20
---
ExtractToDirectory 0:14
Expand-Archive     1:25
---
ExtractToDirectory 0:13
Expand-Archive     1:28
---
ExtractToDirectory 0:13
Expand-Archive     1:28
---
ExtractToDirectory 0:13
Expand-Archive     1:28
---
ExtractToDirectory 0:13
Expand-Archive     1:28
---
ExtractToDirectory 0:13
Expand-Archive     1:28
---
ExtractToDirectory 0:14
Expand-Archive     1:28
---
ExtractToDirectory 0:14
Expand-Archive     1:25
---
ExtractToDirectory 0:13
Expand-Archive     1:26

Conclusions

  • ExtractToDirectory is much faster then Expand-Archive
  • Antivirus software kills performance – it’s obvious, but we sometimes forget about things working in a background
  • Extract from/to the same disk drive is a bad idea

How can I reproduce your test?

Here is script used by me for performance tests.

$archivePath = "C:\test80MB.zip"
$destinationFolder = "D:\Test"
mkdir $destinationFolder -Force
Clear-Host
for( $i = 0; $i -lt 10; $i++ )
{
$measureExpand = Measure-Command {
$ProgressPreference=’SilentlyContinue’
Expand-Archive $archivePath "$destinationFolder\TestExpand$i" -Force
}
$measureExtract = Measure-Command {
Add-Type -assembly System.IO.Compression.Filesystem
[io.compression.zipfile]::ExtractToDirectory($archivePath, "$destinationFolder\TestExtract$i")
}
Write-Host "Measure archive extraction $((Get-Item $archivePath).length/1MB) MB" -ForegroundColor Green
Write-Host "ExtractToDirectory $($measureExtract.Minutes):$($measureExtract.Seconds)"
Write-Host "Expand-Archive $($measureExpand.Minutes):$($measureExpand.Seconds)"
}
rmdir $destinationFolder -Force -Recurse

1 comment

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.