📷 A modern, cross-platform, 2D Graphics library for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

106 lines
3.4 KiB

// <copyright file="DecodeJpegMultiple.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageSharp.Benchmarks.Image
{
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using BenchmarkDotNet.Attributes;
using Image = ImageSharp.Image;
using ImageSharpSize = ImageSharp.Size;
public class DecodeJpegMultiple
{
private const string Folder = "../ImageSharp.Tests/TestImages/Formats/Jpg/";
private Dictionary<string, byte[]> fileNamesToBytes;
public enum JpegTestingMode
{
All,
SmallImagesOnly,
LargeImagesOnly,
CalliphoraOnly,
}
[Params(JpegTestingMode.All, JpegTestingMode.SmallImagesOnly, JpegTestingMode.LargeImagesOnly,
JpegTestingMode.CalliphoraOnly)]
public JpegTestingMode Mode { get; set; }
private IEnumerable<KeyValuePair<string, byte[]>> RequestedImages
{
get
{
int thresholdInBytes = 100000;
switch (this.Mode)
{
case JpegTestingMode.All:
return this.fileNamesToBytes;
case JpegTestingMode.SmallImagesOnly:
return this.fileNamesToBytes.Where(kv => kv.Value.Length < thresholdInBytes);
case JpegTestingMode.LargeImagesOnly:
return this.fileNamesToBytes.Where(kv => kv.Value.Length >= thresholdInBytes);
case JpegTestingMode.CalliphoraOnly:
return new[] { this.fileNamesToBytes.First(kv => kv.Key.ToLower().Contains("calliphora")) };
default:
throw new ArgumentOutOfRangeException();
}
}
}
[Benchmark(Description = "DecodeJpegMultiple - ImageSharp")]
public ImageSharpSize JpegImageSharp()
{
ImageSharpSize lastSize = new ImageSharpSize();
foreach (var kv in this.RequestedImages)
{
using (MemoryStream memoryStream = new MemoryStream(kv.Value))
{
Image image = new Image(memoryStream);
lastSize = new ImageSharpSize(image.Width, image.Height);
}
}
return lastSize;
}
[Benchmark(Baseline = true, Description = "DecodeJpegMultiple - System.Drawing")]
public Size JpegSystemDrawing()
{
Size lastSize = new Size();
foreach (var kv in this.RequestedImages)
{
using (MemoryStream memoryStream = new MemoryStream(kv.Value))
{
using (System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream))
{
lastSize = image.Size;
}
}
}
return lastSize;
}
[Setup]
public void ReadImages()
{
if (this.fileNamesToBytes != null) return;
var allFiles = Directory.EnumerateFiles(Folder, "*.jpg", SearchOption.AllDirectories).ToArray();
this.fileNamesToBytes = allFiles.ToDictionary(fn => fn, File.ReadAllBytes);
}
}
}