add fixes and benchmarks for system providers

This commit is contained in:
Adam Hathcock
2026-02-10 16:15:31 +00:00
parent d220532b16
commit 19ed4d16db
6 changed files with 96 additions and 22 deletions

View File

@@ -4,6 +4,8 @@ using System.Linq;
using BenchmarkDotNet.Attributes;
using SharpCompress.Archives.Tar;
using SharpCompress.Common;
using SharpCompress.Compressors;
using SharpCompress.Compressors.Providers;
using SharpCompress.Readers;
using SharpCompress.Writers;
@@ -48,6 +50,42 @@ public class TarBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "Tar: Extract all entries (Archive API) - SystemGzip")]
public void SystemTarExtractArchiveApi()
{
using var stream = new MemoryStream(_tarBytes);
using var archive = TarArchive.OpenArchive(
stream,
new ReaderOptions().WithProviders(
CompressionProviderRegistry.Default.With(new SystemGZipCompressionProvider())
)
);
foreach (var entry in archive.Entries.Where(e => !e.IsDirectory))
{
using var entryStream = entry.OpenEntryStream();
entryStream.CopyTo(Stream.Null);
}
}
[Benchmark(Description = "Tar: Extract all entries (Reader API) - SystemGzip")]
public void SystemTarExtractReaderApi()
{
using var stream = new MemoryStream(_tarBytes);
using var reader = ReaderFactory.OpenReader(
stream,
new ReaderOptions().WithProviders(
CompressionProviderRegistry.Default.With(new SystemGZipCompressionProvider())
)
);
while (reader.MoveToNextEntry())
{
if (!reader.Entry.IsDirectory)
{
reader.WriteEntryTo(Stream.Null);
}
}
}
[Benchmark(Description = "Tar.GZip: Extract all entries")]
public void TarGzipExtract()
{

View File

@@ -4,6 +4,8 @@ using System.Linq;
using BenchmarkDotNet.Attributes;
using SharpCompress.Archives.Zip;
using SharpCompress.Common;
using SharpCompress.Compressors;
using SharpCompress.Compressors.Providers;
using SharpCompress.Readers;
using SharpCompress.Writers;
@@ -22,6 +24,23 @@ public class ZipBenchmarks : ArchiveBenchmarkBase
_archiveBytes = File.ReadAllBytes(_archivePath);
}
[Benchmark(Description = "System Zip: Extract all entries (Archive API)")]
public void SystemZipExtractArchiveApi()
{
using var stream = new MemoryStream(_archiveBytes);
using var archive = ZipArchive.OpenArchive(
stream,
new ReaderOptions().WithProviders(
CompressionProviderRegistry.Default.With(new SystemDeflateCompressionProvider())
)
);
foreach (var entry in archive.Entries.Where(e => !e.IsDirectory))
{
using var entryStream = entry.OpenEntryStream();
entryStream.CopyTo(Stream.Null);
}
}
[Benchmark(Description = "Zip: Extract all entries (Archive API)")]
public void ZipExtractArchiveApi()
{
@@ -34,6 +53,25 @@ public class ZipBenchmarks : ArchiveBenchmarkBase
}
}
[Benchmark(Description = "System Zip: Extract all entries (Reader API)")]
public void SystemZipExtractReaderApi()
{
using var stream = new MemoryStream(_archiveBytes);
using var reader = ReaderFactory.OpenReader(
stream,
new ReaderOptions().WithProviders(
CompressionProviderRegistry.Default.With(new SystemDeflateCompressionProvider())
)
);
while (reader.MoveToNextEntry())
{
if (!reader.Entry.IsDirectory)
{
reader.WriteEntryTo(Stream.Null);
}
}
}
[Benchmark(Description = "Zip: Extract all entries (Reader API)")]
public void ZipExtractReaderApi()
{

View File

@@ -50,6 +50,7 @@ public class CompressionProviderTests
// Original should still have the default provider
var originalProvider = original.GetProvider(CompressionType.Deflate);
originalProvider.Should().NotBeSameAs(modified);
originalProvider.Should().NotBeSameAs(customProvider);
}

View File

@@ -5,12 +5,10 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AwesomeAssertions;
using SharpCompress.Archives;
using SharpCompress.Common;
using SharpCompress.Factories;
using SharpCompress.IO;
using SharpCompress.Readers;
using SharpCompress.Readers.GZip;
using SharpCompress.Test.Mocks;
using Xunit;
@@ -18,19 +16,14 @@ namespace SharpCompress.Test;
public abstract class ReaderTests : TestBase
{
protected void Read(string testArchive, ReaderOptions? options = null)
{
protected void Read(string testArchive, ReaderOptions? options = null) =>
ReadCore(testArchive, options, ReadImpl);
}
protected void Read(
string testArchive,
CompressionType expectedCompression,
ReaderOptions? options = null
)
{
ReadCore(testArchive, options, (path, opts) => ReadImpl(path, expectedCompression, opts));
}
) => ReadCore(testArchive, options, (path, opts) => ReadImpl(path, expectedCompression, opts));
private void ReadCore(
string testArchive,
@@ -50,19 +43,14 @@ public abstract class ReaderTests : TestBase
VerifyFiles();
}
private void ReadImpl(string testArchive, ReaderOptions options)
{
private void ReadImpl(string testArchive, ReaderOptions options) =>
ReadImplCore(testArchive, options, UseReader);
}
private void ReadImpl(
string testArchive,
CompressionType expectedCompression,
ReaderOptions options
)
{
ReadImplCore(testArchive, options, r => UseReader(r, expectedCompression));
}
) => ReadImplCore(testArchive, options, r => UseReader(r, expectedCompression));
private void ReadImplCore(string testArchive, ReaderOptions options, Action<IReader> useReader)
{
@@ -105,15 +93,22 @@ public abstract class ReaderTests : TestBase
}
}
protected async Task AssertArchiveAsync<T>(
protected async Task AssertArchiveAsync(
string testArchive,
CancellationToken cancellationToken = default
)
where T : IFactory
{
testArchive = Path.Combine(TEST_ARCHIVES_PATH, testArchive);
var factory = new TarFactory();
factory.IsArchive(new FileInfo(testArchive).OpenRead()).Should().BeTrue();
(
await factory.IsArchiveAsync(
new FileInfo(testArchive).OpenRead(),
null,
cancellationToken
)
)
.Should()
.BeTrue();
(
await factory.IsArchiveAsync(
new FileInfo(testArchive).OpenRead(),
@@ -178,7 +173,8 @@ public abstract class ReaderTests : TestBase
await using (
var reader = await ReaderFactory.OpenAsyncReader(
new AsyncOnlyStream(testStream),
options
options,
cancellationToken
)
)
{

View File

@@ -44,7 +44,7 @@ public class TarReaderAsyncTests : ReaderTests
await ReadAsync("Tar.tar.Z", CompressionType.Lzw);
[Fact]
public async ValueTask Tar_Async_Assert() => await AssertArchiveAsync<TarFactory>("Tar.tar");
public async ValueTask Tar_Async_Assert() => await AssertArchiveAsync("Tar.tar");
[Fact]
public async ValueTask Tar_BZip2_Reader_Async() =>

View File

@@ -91,7 +91,8 @@ public class WriterTests : TestBase
await using var reader = await ReaderFactory.OpenAsyncReader(
new AsyncOnlyStream(SharpCompressStream.CreateNonDisposing(stream)),
readerOptions
readerOptions,
cancellationToken
);
await reader.WriteAllToDirectoryAsync(SCRATCH_FILES_PATH, cancellationToken);
}