Compare commits

...

5 Commits

Author SHA1 Message Date
Adam Hathcock
98d0f1913e make sure things compile adam 2026-02-11 14:19:21 +00:00
Adam Hathcock
8aa93f4e34 fix fmt 2026-02-11 14:02:27 +00:00
Adam Hathcock
3689b893db Update tests/SharpCompress.Performance/Benchmarks/SevenZipBenchmarks.cs
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
2026-02-11 14:00:37 +00:00
Adam Hathcock
fbec7dc083 generate github actions baseline 2026-02-11 13:57:06 +00:00
Adam Hathcock
7cf7623438 update benchmarks to include async paths 2026-02-11 13:36:26 +00:00
9 changed files with 266 additions and 36 deletions

View File

@@ -103,8 +103,11 @@ tests/
### Factory Pattern
Factory implementations can implement one or more interfaces (`IArchiveFactory`, `IReaderFactory`, `IWriterFactory`) depending on format capabilities:
- `ArchiveFactory.OpenArchive()` - Opens archive API objects from seekable streams/files
- `ArchiveFactory.OpenAsyncArchive()` - Opens async archive API objects for async archive use cases
- `ReaderFactory.OpenReader()` - Auto-detects and opens forward-only readers
- `ReaderFactory.OpenAsyncReader()` - Auto-detects and opens forward-only async readers
- `WriterFactory.OpenWriter()` - Creates a writer for a specified `ArchiveType`
- `WriterFactory.OpenAsyncWriter()` - Creates an async writer for async write scenarios
- Factories located in: `src/SharpCompress/Factories/`
## Nullable Reference Types
@@ -132,6 +135,9 @@ SharpCompress supports multiple archive and compression formats:
### Async/Await Patterns
- All I/O operations support async/await with `CancellationToken`
- Async methods follow the naming convention: `MethodNameAsync`
- For async archive scenarios, prefer `ArchiveFactory.OpenAsyncArchive(...)` over sync `OpenArchive(...)`.
- For async forward-only read scenarios, prefer `ReaderFactory.OpenAsyncReader(...)` over sync `OpenReader(...)`.
- For async write scenarios, prefer `WriterFactory.OpenAsyncWriter(...)` over sync `OpenWriter(...)`.
- Key async methods:
- `WriteEntryToAsync` - Extract entry asynchronously
- `WriteAllToDirectoryAsync` - Extract all entries asynchronously
@@ -199,7 +205,8 @@ SharpCompress supports multiple archive and compression formats:
## Common Pitfalls
1. **Don't mix Archive and Reader APIs** - Archive needs seekable stream, Reader doesn't
2. **Solid archives (Rar, 7Zip)** - Use `ExtractAllEntries()` for best performance, not individual entry extraction
3. **Stream disposal** - Always set `LeaveStreamOpen` explicitly when needed (default is to close)
4. **Tar + non-seekable stream** - Must provide file size or it will throw
5. **Format detection** - Use `ReaderFactory.OpenReader()` for auto-detection, test with actual archive files
2. **Don't mix sync and async open paths** - For async workflows use `OpenAsyncArchive`/`OpenAsyncReader`/`OpenAsyncWriter`, not `OpenArchive`/`OpenReader`/`OpenWriter`
3. **Solid archives (Rar, 7Zip)** - Use `ExtractAllEntries()` for best performance, not individual entry extraction
4. **Stream disposal** - Always set `LeaveStreamOpen` explicitly when needed (default is to close)
5. **Tar + non-seekable stream** - Must provide file size or it will throw
6. **Format detection** - Use `ReaderFactory.OpenReader()` / `ReaderFactory.OpenAsyncReader()` for auto-detection, test with actual archive files

View File

@@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using SharpCompress.Compressors;
using SharpCompress.Compressors.Deflate;
@@ -36,6 +37,14 @@ public class GZipBenchmarks
gzipStream.Write(_sourceData, 0, _sourceData.Length);
}
[Benchmark(Description = "GZip: Compress 100KB (Async)")]
public async Task GZipCompressAsync()
{
using var outputStream = new MemoryStream();
using var gzipStream = new GZipStream(outputStream, CompressionMode.Compress);
await gzipStream.WriteAsync(_sourceData, 0, _sourceData.Length).ConfigureAwait(false);
}
[Benchmark(Description = "GZip: Decompress 100KB")]
public void GZipDecompress()
{
@@ -43,4 +52,12 @@ public class GZipBenchmarks
using var gzipStream = new GZipStream(inputStream, CompressionMode.Decompress);
gzipStream.CopyTo(Stream.Null);
}
[Benchmark(Description = "GZip: Decompress 100KB (Async)")]
public async Task GZipDecompressAsync()
{
using var inputStream = new MemoryStream(_compressedData);
using var gzipStream = new GZipStream(inputStream, CompressionMode.Decompress);
await gzipStream.CopyToAsync(Stream.Null).ConfigureAwait(false);
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using SharpCompress.Archives.Rar;
using SharpCompress.Readers;
@@ -30,6 +31,18 @@ public class RarBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "Rar: Extract all entries (Archive API, Async)")]
public async Task RarExtractArchiveApiAsync()
{
using var stream = new MemoryStream(_rarBytes);
await using var archive = RarArchive.OpenAsyncArchive(stream);
await foreach (var entry in archive.EntriesAsync.Where(e => !e.IsDirectory))
{
await using var entryStream = await entry.OpenEntryStreamAsync().ConfigureAwait(false);
await entryStream.CopyToAsync(Stream.Null).ConfigureAwait(false);
}
}
[Benchmark(Description = "Rar: Extract all entries (Reader API)")]
public void RarExtractReaderApi()
{
@@ -43,4 +56,18 @@ public class RarBenchmarks : ArchiveBenchmarkBase
}
}
}
[Benchmark(Description = "Rar: Extract all entries (Reader API, Async)")]
public async Task RarExtractReaderApiAsync()
{
using var stream = new MemoryStream(_rarBytes);
await using var reader = await ReaderFactory.OpenAsyncReader(stream).ConfigureAwait(false);
while (await reader.MoveToNextEntryAsync().ConfigureAwait(false))
{
if (!reader.Entry.IsDirectory)
{
await reader.WriteEntryToAsync(Stream.Null).ConfigureAwait(false);
}
}
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using SharpCompress.Archives.SevenZip;
@@ -31,6 +32,18 @@ public class SevenZipBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "7Zip LZMA: Extract all entries (Async)")]
public async Task SevenZipLzmaExtractAsync()
{
using var stream = new MemoryStream(_lzmaBytes);
await using var archive = SevenZipArchive.OpenAsyncArchive(stream);
await foreach (var entry in archive.EntriesAsync.Where(e => !e.IsDirectory))
{
await using var entryStream = await entry.OpenEntryStreamAsync().ConfigureAwait(false);
await entryStream.CopyToAsync(Stream.Null).ConfigureAwait(false);
}
}
[Benchmark(Description = "7Zip LZMA2: Extract all entries")]
public void SevenZipLzma2Extract()
{
@@ -42,4 +55,42 @@ public class SevenZipBenchmarks : ArchiveBenchmarkBase
entryStream.CopyTo(Stream.Null);
}
}
[Benchmark(Description = "7Zip LZMA2: Extract all entries (Async)")]
public async Task SevenZipLzma2ExtractAsync()
{
using var stream = new MemoryStream(_lzma2Bytes);
await using var archive = SevenZipArchive.OpenAsyncArchive(stream);
await foreach (var entry in archive.EntriesAsync.Where(e => !e.IsDirectory))
{
await using var entryStream = await entry.OpenEntryStreamAsync().ConfigureAwait(false);
await entryStream.CopyToAsync(Stream.Null).ConfigureAwait(false);
}
}
[Benchmark(Description = "7Zip LZMA2 Reader: Extract all entries")]
public void SevenZipLzma2Extract_Reader()
{
using var stream = new MemoryStream(_lzma2Bytes);
using var archive = SevenZipArchive.OpenArchive(stream);
using var reader = archive.ExtractAllEntries();
foreach (var entry in archive.Entries.Where(e => !e.IsDirectory))
{
using var entryStream = entry.OpenEntryStream();
entryStream.CopyTo(Stream.Null);
}
}
[Benchmark(Description = "7Zip LZMA2 Reader: Extract all entries (Async)")]
public async Task SevenZipLzma2ExtractAsync_Reader()
{
using var stream = new MemoryStream(_lzma2Bytes);
await using var archive = SevenZipArchive.OpenAsyncArchive(stream);
await using var reader = await archive.ExtractAllEntriesAsync();
while (await reader.MoveToNextEntryAsync().ConfigureAwait(false))
{
await using var entryStream = await reader.OpenEntryStreamAsync().ConfigureAwait(false);
await entryStream.CopyToAsync(Stream.Null).ConfigureAwait(false);
}
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using SharpCompress.Archives.Tar;
using SharpCompress.Common;
@@ -34,6 +35,18 @@ public class TarBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "Tar: Extract all entries (Archive API, Async)")]
public async Task TarExtractArchiveApiAsync()
{
using var stream = new MemoryStream(_tarBytes);
await using var archive = TarArchive.OpenAsyncArchive(stream);
await foreach (var entry in archive.EntriesAsync.Where(e => !e.IsDirectory))
{
await using var entryStream = await entry.OpenEntryStreamAsync().ConfigureAwait(false);
await entryStream.CopyToAsync(Stream.Null).ConfigureAwait(false);
}
}
[Benchmark(Description = "Tar: Extract all entries (Reader API)")]
public void TarExtractReaderApi()
{
@@ -48,6 +61,20 @@ public class TarBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "Tar: Extract all entries (Reader API, Async)")]
public async Task TarExtractReaderApiAsync()
{
using var stream = new MemoryStream(_tarBytes);
await using var reader = await ReaderFactory.OpenAsyncReader(stream).ConfigureAwait(false);
while (await reader.MoveToNextEntryAsync().ConfigureAwait(false))
{
if (!reader.Entry.IsDirectory)
{
await reader.WriteEntryToAsync(Stream.Null).ConfigureAwait(false);
}
}
}
[Benchmark(Description = "Tar.GZip: Extract all entries")]
public void TarGzipExtract()
{
@@ -60,6 +87,18 @@ public class TarBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "Tar.GZip: Extract all entries (Async)")]
public async Task TarGzipExtractAsync()
{
using var stream = new MemoryStream(_tarGzBytes);
await using var archive = TarArchive.OpenAsyncArchive(stream);
await foreach (var entry in archive.EntriesAsync.Where(e => !e.IsDirectory))
{
await using var entryStream = await entry.OpenEntryStreamAsync().ConfigureAwait(false);
await entryStream.CopyToAsync(Stream.Null).ConfigureAwait(false);
}
}
[Benchmark(Description = "Tar: Create archive with small files")]
public void TarCreateSmallFiles()
{
@@ -78,4 +117,22 @@ public class TarBenchmarks : ArchiveBenchmarkBase
writer.Write($"file{i}.txt", entryStream);
}
}
[Benchmark(Description = "Tar: Create archive with small files (Async)")]
public async Task TarCreateSmallFilesAsync()
{
using var outputStream = new MemoryStream();
await using var writer = WriterFactory.OpenAsyncWriter(
outputStream,
ArchiveType.Tar,
new WriterOptions(CompressionType.None) { LeaveStreamOpen = true }
);
for (int i = 0; i < 10; i++)
{
var data = new byte[1024];
using var entryStream = new MemoryStream(data);
await writer.WriteAsync($"file{i}.txt", entryStream).ConfigureAwait(false);
}
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using SharpCompress.Archives.Zip;
using SharpCompress.Common;
@@ -34,6 +35,18 @@ public class ZipBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "Zip: Extract all entries (Archive API, Async)")]
public async Task ZipExtractArchiveApiAsync()
{
using var stream = new MemoryStream(_archiveBytes);
await using var archive = ZipArchive.OpenAsyncArchive(stream);
await foreach (var entry in archive.EntriesAsync.Where(e => !e.IsDirectory))
{
await using var entryStream = await entry.OpenEntryStreamAsync().ConfigureAwait(false);
await entryStream.CopyToAsync(Stream.Null).ConfigureAwait(false);
}
}
[Benchmark(Description = "Zip: Extract all entries (Reader API)")]
public void ZipExtractReaderApi()
{
@@ -48,6 +61,20 @@ public class ZipBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "Zip: Extract all entries (Reader API, Async)")]
public async Task ZipExtractReaderApiAsync()
{
using var stream = new MemoryStream(_archiveBytes);
await using var reader = await ReaderFactory.OpenAsyncReader(stream).ConfigureAwait(false);
while (await reader.MoveToNextEntryAsync().ConfigureAwait(false))
{
if (!reader.Entry.IsDirectory)
{
await reader.WriteEntryToAsync(Stream.Null).ConfigureAwait(false);
}
}
}
[Benchmark(Description = "Zip: Create archive with small files")]
public void ZipCreateSmallFiles()
{
@@ -66,4 +93,22 @@ public class ZipBenchmarks : ArchiveBenchmarkBase
writer.Write($"file{i}.txt", entryStream);
}
}
[Benchmark(Description = "Zip: Create archive with small files (Async)")]
public async Task ZipCreateSmallFilesAsync()
{
using var outputStream = new MemoryStream();
await using var writer = WriterFactory.OpenAsyncWriter(
outputStream,
ArchiveType.Zip,
new WriterOptions(CompressionType.Deflate) { LeaveStreamOpen = true }
);
for (int i = 0; i < 10; i++)
{
var data = new byte[1024];
using var entryStream = new MemoryStream(data);
await writer.WriteAsync($"file{i}.txt", entryStream).ConfigureAwait(false);
}
}
}

View File

@@ -20,10 +20,10 @@ public class Program
// Default: Run BenchmarkDotNet
var config = DefaultConfig.Instance.AddJob(
Job.Default.WithToolchain(InProcessEmitToolchain.Instance)
.WithWarmupCount(3) // Minimal warmup iterations for CI
.WithIterationCount(10) // Minimal measurement iterations for CI
.WithInvocationCount(10)
.WithUnrollFactor(1)
.WithWarmupCount(5) // Minimal warmup iterations for CI
.WithIterationCount(30) // Minimal measurement iterations for CI
.WithInvocationCount(30)
.WithUnrollFactor(2)
);
BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args, config);

View File

@@ -5,11 +5,11 @@ This project contains performance benchmarks for SharpCompress using [BenchmarkD
## Overview
The benchmarks test all major archive formats supported by SharpCompress:
- **Zip**: Read (Archive & Reader API) and Write operations
- **Tar**: Read (Archive & Reader API) and Write operations, including Tar.GZip
- **Rar**: Read operations (Archive & Reader API)
- **7Zip**: Read operations for LZMA and LZMA2 compression
- **GZip**: Compression and decompression
- **Zip**: Read (Archive & Reader API) and Write operations, each with sync and async variants
- **Tar**: Read (Archive & Reader API) and Write operations, including Tar.GZip, each with sync and async variants
- **Rar**: Read operations (Archive & Reader API), each with sync and async variants
- **7Zip**: Read operations for LZMA and LZMA2 compression, each with sync and async variants
- **GZip**: Compression and decompression, each with sync and async variants
## Running Benchmarks

View File

@@ -1,23 +1,49 @@
| Method | Mean | Error | StdDev | Allocated |
|------------------------- |-----------:|---------:|---------:|----------:|
| &#39;GZip: Compress 100KB&#39; | 3,268.7 μs | 28.50 μs | 16.96 μs | 519.2 KB |
| &#39;GZip: Decompress 100KB&#39; | 436.6 μs | 3.23 μs | 1.69 μs | 34.18 KB |
| Method | Mean | Error | StdDev | Allocated |
|----------------------------------------- |---------:|----------:|----------:|----------:|
| &#39;Rar: Extract all entries (Archive API)&#39; | 2.054 ms | 0.3927 ms | 0.2598 ms | 91.09 KB |
| &#39;Rar: Extract all entries (Reader API)&#39; | 2.235 ms | 0.0253 ms | 0.0132 ms | 149.48 KB |
| Method | Mean | Error | StdDev | Allocated |
|---------------------------------- |---------:|----------:|----------:|----------:|
| &#39;7Zip LZMA: Extract all entries&#39; | 9.124 ms | 2.1930 ms | 1.4505 ms | 272.8 KB |
| &#39;7Zip LZMA2: Extract all entries&#39; | 7.810 ms | 0.1323 ms | 0.0788 ms | 272.58 KB |
| Method | Mean | Error | StdDev | Allocated |
|----------------------------------------- |----------:|---------:|---------:|----------:|
| &#39;Tar: Extract all entries (Archive API)&#39; | 56.36 μs | 3.312 μs | 1.971 μs | 16.65 KB |
| &#39;Tar: Extract all entries (Reader API)&#39; | 175.34 μs | 2.616 μs | 1.557 μs | 213.36 KB |
| &#39;Tar.GZip: Extract all entries&#39; | NA | NA | NA | NA |
| &#39;Tar: Create archive with small files&#39; | 51.38 μs | 2.349 μs | 1.398 μs | 68.7 KB |
| Method | Mean | Error | StdDev | Gen0 | Allocated |
|----------------------------------------- |-----------:|---------:|---------:|---------:|-----------:|
| &#39;Zip: Extract all entries (Archive API)&#39; | 1,188.4 μs | 28.62 μs | 14.97 μs | - | 181.66 KB |
| &#39;Zip: Extract all entries (Reader API)&#39; | 1,137.0 μs | 5.58 μs | 2.92 μs | - | 123.19 KB |
| &#39;Zip: Create archive with small files&#39; | 258.2 μs | 8.98 μs | 4.70 μs | 100.0000 | 2806.93 KB |
| Method | Mean | Error | StdDev | Allocated |
|---------------------------- |---------:|---------:|---------:|----------:|
| SharpCompress_0_44_Original | 581.8 ms | 11.56 ms | 17.65 ms | 48.77 MB |
| Method | Mean | Error | StdDev | Median | Gen0 | Gen1 | Gen2 | Allocated |
|-------------------- |-----------:|----------:|----------:|-----------:|---------:|---------:|---------:|----------:|
| ZipArchiveRead | 959.2 μs | 52.16 μs | 153.78 μs | 928.7 μs | 27.3438 | 5.8594 | - | 345.75 KB |
| TarArchiveRead | 252.1 μs | 20.97 μs | 61.82 μs | 251.9 μs | 12.2070 | 5.8594 | - | 154.78 KB |
| TarGzArchiveRead | 600.9 μs | 19.25 μs | 53.98 μs | 607.8 μs | 16.6016 | 6.8359 | - | 204.95 KB |
| TarBz2ArchiveRead | NA | NA | NA | NA | NA | NA | NA | NA |
| SevenZipArchiveRead | 8,354.4 μs | 273.01 μs | 747.35 μs | 8,093.2 μs | 109.3750 | 109.3750 | 109.3750 | 787.99 KB |
| RarArchiveRead | 1,648.6 μs | 131.91 μs | 388.94 μs | 1,617.6 μs | 17.5781 | 5.8594 | - | 222.62 KB |
| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|--------------------------------- |-----------:|--------:|---------:|--------:|--------:|--------:|----------:|
| &#39;GZip: Compress 100KB&#39; | 3,317.1 μs | 7.15 μs | 10.02 μs | 33.3333 | 33.3333 | 33.3333 | 519.31 KB |
| &#39;GZip: Compress 100KB (Async)&#39; | 3,280.3 μs | 8.30 μs | 11.63 μs | 33.3333 | 33.3333 | 33.3333 | 519.46 KB |
| &#39;GZip: Decompress 100KB&#39; | 432.5 μs | 2.43 μs | 3.56 μs | - | - | - | 33.92 KB |
| &#39;GZip: Decompress 100KB (Async)&#39; | 442.8 μs | 1.20 μs | 1.76 μs | - | - | - | 34.24 KB |
| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|------------------------------------------------ |-----------:|----------:|----------:|---------:|---------:|---------:|-----------:|
| &#39;Rar: Extract all entries (Archive API)&#39; | 908.2 μs | 12.42 μs | 17.01 μs | - | - | - | 90.68 KB |
| &#39;Rar: Extract all entries (Archive API, Async)&#39; | 1,175.4 μs | 118.74 μs | 177.72 μs | - | - | - | 96.09 KB |
| &#39;Rar: Extract all entries (Reader API)&#39; | 1,215.1 μs | 2.26 μs | 3.09 μs | - | - | - | 148.85 KB |
| &#39;Rar: Extract all entries (Reader API, Async)&#39; | 1,592.0 μs | 22.58 μs | 33.10 μs | 500.0000 | 500.0000 | 500.0000 | 4776.76 KB |
| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|------------------------------------------------- |----------:|----------:|----------:|---------:|---------:|---------:|-----------:|
| &#39;7Zip LZMA: Extract all entries&#39; | 7.723 ms | 0.0111 ms | 0.0152 ms | 33.3333 | 33.3333 | 33.3333 | 272.68 KB |
| &#39;7Zip LZMA: Extract all entries (Async)&#39; | 35.827 ms | 0.0381 ms | 0.0546 ms | 200.0000 | 33.3333 | 33.3333 | 3402.82 KB |
| &#39;7Zip LZMA2: Extract all entries&#39; | 7.758 ms | 0.0074 ms | 0.0104 ms | 33.3333 | 33.3333 | 33.3333 | 272.46 KB |
| &#39;7Zip LZMA2: Extract all entries (Async)&#39; | 36.317 ms | 0.0345 ms | 0.0506 ms | 200.0000 | 33.3333 | 33.3333 | 3409.72 KB |
| &#39;7Zip LZMA2 Reader: Extract all entries&#39; | 7.706 ms | 0.0114 ms | 0.0163 ms | 33.3333 | 33.3333 | 33.3333 | 273.03 KB |
| &#39;7Zip LZMA2 Reader: Extract all entries (Async)&#39; | 22.951 ms | 0.0973 ms | 0.1426 ms | 100.0000 | 100.0000 | 100.0000 | 2420.81 KB |
| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|------------------------------------------------ |----------:|---------:|---------:|--------:|--------:|--------:|----------:|
| &#39;Tar: Extract all entries (Archive API)&#39; | 40.82 μs | 0.292 μs | 0.427 μs | - | - | - | 16.36 KB |
| &#39;Tar: Extract all entries (Archive API, Async)&#39; | 105.12 μs | 6.183 μs | 9.254 μs | - | - | - | 14.57 KB |
| &#39;Tar: Extract all entries (Reader API)&#39; | 187.89 μs | 1.571 μs | 2.254 μs | 66.6667 | 66.6667 | 66.6667 | 341.24 KB |
| &#39;Tar: Extract all entries (Reader API, Async)&#39; | 229.78 μs | 4.852 μs | 6.802 μs | 66.6667 | 66.6667 | 66.6667 | 376.64 KB |
| &#39;Tar.GZip: Extract all entries&#39; | NA | NA | NA | NA | NA | NA | NA |
| &#39;Tar.GZip: Extract all entries (Async)&#39; | NA | NA | NA | NA | NA | NA | NA |
| &#39;Tar: Create archive with small files&#39; | 46.98 μs | 0.287 μs | 0.394 μs | - | - | - | 68.11 KB |
| &#39;Tar: Create archive with small files (Async)&#39; | 53.14 μs | 0.352 μs | 0.493 μs | - | - | - | 68.11 KB |
| Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated |
|------------------------------------------------ |---------:|---------:|---------:|---------:|--------:|-----------:|
| &#39;Zip: Extract all entries (Archive API)&#39; | 556.7 μs | 3.38 μs | 4.74 μs | - | - | 180.22 KB |
| &#39;Zip: Extract all entries (Archive API, Async)&#39; | 615.7 μs | 15.98 μs | 22.92 μs | - | - | 125.52 KB |
| &#39;Zip: Extract all entries (Reader API)&#39; | 542.2 μs | 1.10 μs | 1.46 μs | - | - | 121.04 KB |
| &#39;Zip: Extract all entries (Reader API, Async)&#39; | 562.8 μs | 2.42 μs | 3.55 μs | - | - | 123.34 KB |
| &#39;Zip: Create archive with small files&#39; | 271.1 μs | 12.93 μs | 18.95 μs | 166.6667 | 33.3333 | 2806.28 KB |
| &#39;Zip: Create archive with small files (Async)&#39; | 394.3 μs | 25.59 μs | 36.71 μs | 166.6667 | 33.3333 | 2811.42 KB |