Files
sharpcompress/tests/SharpCompress.Performance/Benchmarks/TarBenchmarks.cs
2026-02-05 13:30:57 +00:00

82 lines
2.5 KiB
C#

using System;
using System.IO;
using System.Linq;
using BenchmarkDotNet.Attributes;
using SharpCompress.Archives.Tar;
using SharpCompress.Common;
using SharpCompress.Readers;
using SharpCompress.Writers;
namespace SharpCompress.Performance.Benchmarks;
[MemoryDiagnoser]
public class TarBenchmarks : ArchiveBenchmarkBase
{
private byte[] _tarBytes = null!;
private byte[] _tarGzBytes = null!;
[GlobalSetup]
public void Setup()
{
_tarBytes = File.ReadAllBytes(GetArchivePath("Tar.tar"));
_tarGzBytes = File.ReadAllBytes(GetArchivePath("Tar.tar.gz"));
}
[Benchmark(Description = "Tar: Extract all entries (Archive API)")]
public void TarExtractArchiveApi()
{
using var stream = new MemoryStream(_tarBytes);
using var archive = TarArchive.OpenArchive(stream);
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)")]
public void TarExtractReaderApi()
{
using var stream = new MemoryStream(_tarBytes);
using var reader = ReaderFactory.OpenReader(stream);
while (reader.MoveToNextEntry())
{
if (!reader.Entry.IsDirectory)
{
reader.WriteEntryTo(Stream.Null);
}
}
}
[Benchmark(Description = "Tar.GZip: Extract all entries")]
public void TarGzipExtract()
{
using var stream = new MemoryStream(_tarGzBytes);
using var archive = TarArchive.OpenArchive(stream);
foreach (var entry in archive.Entries.Where(e => !e.IsDirectory))
{
using var entryStream = entry.OpenEntryStream();
entryStream.CopyTo(Stream.Null);
}
}
[Benchmark(Description = "Tar: Create archive with small files")]
public void TarCreateSmallFiles()
{
using var outputStream = new MemoryStream();
using var writer = WriterFactory.OpenWriter(
outputStream,
ArchiveType.Tar,
new WriterOptions(CompressionType.None) { LeaveStreamOpen = true }
);
// Create 10 small files
for (int i = 0; i < 10; i++)
{
var data = new byte[1024]; // 1KB each
using var entryStream = new MemoryStream(data);
writer.Write($"file{i}.txt", entryStream);
}
}
}