Files
sharpcompress/tests/SharpCompress.Performance/Benchmarks/RarBenchmarks.cs
2026-02-12 11:07:11 +00:00

74 lines
2.4 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using SharpCompress.Archives.Rar;
using SharpCompress.Readers;
namespace SharpCompress.Performance.Benchmarks;
[MemoryDiagnoser]
public class RarBenchmarks : ArchiveBenchmarkBase
{
private byte[] _rarBytes = null!;
[GlobalSetup]
public void Setup()
{
_rarBytes = File.ReadAllBytes(GetArchivePath("Rar.rar"));
}
[Benchmark(Description = "Rar: Extract all entries (Archive API)")]
public void RarExtractArchiveApi()
{
using var stream = new MemoryStream(_rarBytes);
using var archive = RarArchive.OpenArchive(stream);
foreach (var entry in archive.Entries.Where(e => !e.IsDirectory))
{
using var entryStream = entry.OpenEntryStream();
entryStream.CopyTo(Stream.Null);
}
}
[Benchmark(Description = "Rar: Extract all entries (Archive API, Async)")]
public async Task RarExtractArchiveApiAsync()
{
using var stream = new MemoryStream(_rarBytes);
await using var archive = await RarArchive.OpenAsyncArchive(stream).ConfigureAwait(false);
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()
{
using var stream = new MemoryStream(_rarBytes);
using var reader = ReaderFactory.OpenReader(stream);
while (reader.MoveToNextEntry())
{
if (!reader.Entry.IsDirectory)
{
reader.WriteEntryTo(Stream.Null);
}
}
}
[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);
}
}
}
}