From 7f5411a68293bd0d125776e09d709946b95facdb Mon Sep 17 00:00:00 2001 From: dirk Date: Sat, 22 Oct 2016 12:39:41 +0200 Subject: [PATCH] Added benchmarks for encoding and decoding. Former-commit-id: a60cfc5679620a3b838aa5286fe6d94b1a1f7973 Former-commit-id: 9b66ac00a9a154a1315b441d10f3c9654a495492 Former-commit-id: bb68aeba5ba81ffad3fa93000875ad2a4eb5d30a --- .../Image/Decode.cs | 131 ++++++++++++++++ .../Image/Encode.cs | 141 ++++++++++++++++++ 2 files changed, 272 insertions(+) create mode 100644 tests/ImageProcessorCore.Benchmarks/Image/Decode.cs create mode 100644 tests/ImageProcessorCore.Benchmarks/Image/Encode.cs diff --git a/tests/ImageProcessorCore.Benchmarks/Image/Decode.cs b/tests/ImageProcessorCore.Benchmarks/Image/Decode.cs new file mode 100644 index 0000000000..d6d1d2fb14 --- /dev/null +++ b/tests/ImageProcessorCore.Benchmarks/Image/Decode.cs @@ -0,0 +1,131 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageProcessorCore.Benchmarks.Image +{ + using System.Drawing; + using System.IO; + + using BenchmarkDotNet.Attributes; + using CoreSize = ImageProcessorCore.Size; + using CoreImage = ImageProcessorCore.Image; + + public class Decode + { + private byte[] bmpBytes; + private byte[] gifBytes; + private byte[] jpegBytes; + private byte[] pngBytes; + + [Setup] + public void ReadImages() + { + if (bmpBytes == null) + { + bmpBytes = File.ReadAllBytes("../ImageProcessorCore.Tests/TestImages/Formats/Bmp/Car.bmp"); + } + if (gifBytes == null) + { + gifBytes = File.ReadAllBytes("../ImageProcessorCore.Tests/TestImages/Formats/Gif/giphy.gif"); + } + if (jpegBytes == null) + { + jpegBytes = File.ReadAllBytes("../ImageProcessorCore.Tests/TestImages/Formats/Jpg/Calliphora.jpg"); + } + if (pngBytes == null) + { + pngBytes = File.ReadAllBytes("../ImageProcessorCore.Tests/TestImages/Formats/Png/splash.png"); + } + } + + [Benchmark(Description = "System.Drawing Bmp")] + public Size BmpSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream(bmpBytes)) + { + using (Image image = Image.FromStream(memoryStream)) + { + return image.Size; + } + } + } + + [Benchmark(Description = "ImageProcessorCore Bmp")] + public CoreSize BmpCore() + { + using (MemoryStream memoryStream = new MemoryStream(bmpBytes)) + { + CoreImage image = new CoreImage(memoryStream); + return new CoreSize(image.Width, image.Height); + } + } + + [Benchmark(Description = "System.Drawing Gif")] + public Size GifSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream(gifBytes)) + { + using (Image image = Image.FromStream(memoryStream)) + { + return image.Size; + } + } + } + + [Benchmark(Description = "ImageProcessorCore Gif")] + public CoreSize GifCore() + { + using (MemoryStream memoryStream = new MemoryStream(gifBytes)) + { + CoreImage image = new CoreImage(memoryStream); + return new CoreSize(image.Width, image.Height); + } + } + + [Benchmark(Description = "System.Drawing Jpeg")] + public Size JpegSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream(jpegBytes)) + { + using (Image image = Image.FromStream(memoryStream)) + { + return image.Size; + } + } + } + + [Benchmark(Description = "ImageProcessorCore Jpeg")] + public CoreSize JpegCore() + { + using (MemoryStream memoryStream = new MemoryStream(jpegBytes)) + { + CoreImage image = new CoreImage(memoryStream); + return new CoreSize(image.Width, image.Height); + } + } + + [Benchmark(Description = "System.Drawing Png")] + public Size PngSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream(pngBytes)) + { + using (Image image = Image.FromStream(memoryStream)) + { + return image.Size; + } + } + } + + [Benchmark(Description = "ImageProcessorCore Png")] + public CoreSize PngCore() + { + using (MemoryStream memoryStream = new MemoryStream(pngBytes)) + { + CoreImage image = new CoreImage(memoryStream); + return new CoreSize(image.Width, image.Height); + } + } + } +} diff --git a/tests/ImageProcessorCore.Benchmarks/Image/Encode.cs b/tests/ImageProcessorCore.Benchmarks/Image/Encode.cs new file mode 100644 index 0000000000..51bc3767c2 --- /dev/null +++ b/tests/ImageProcessorCore.Benchmarks/Image/Encode.cs @@ -0,0 +1,141 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageProcessorCore.Benchmarks.Image +{ + using System.Drawing; + using System.Drawing.Imaging; + using System.IO; + + using BenchmarkDotNet.Attributes; + using CoreImage = ImageProcessorCore.Image; + + public class Encode + { + // System.Drawing needs this. + private Stream bmpStream; + private Stream gifStream; + private Stream jpegStream; + private Stream pngStream; + + private Image bmpDrawing; + private Image gifDrawing; + private Image jpegDrawing; + private Image pngDrawing; + + private CoreImage bmpCore; + private CoreImage gifCore; + private CoreImage jpegCore; + private CoreImage pngCore; + + [Setup] + public void ReadImages() + { + if (bmpStream == null) + { + bmpStream = File.OpenRead("../ImageProcessorCore.Tests/TestImages/Formats/Bmp/Car.bmp"); + bmpCore = new CoreImage(bmpStream); + bmpStream.Position = 0; + bmpDrawing = Image.FromStream(bmpStream); + } + + if (gifStream == null) + { + gifStream = File.OpenRead("../ImageProcessorCore.Tests/TestImages/Formats/Gif/giphy.gif"); + gifCore = new CoreImage(gifStream); + gifStream.Position = 0; + gifDrawing = Image.FromStream(gifStream); + } + + if (jpegStream == null) + { + jpegStream = File.OpenRead("../ImageProcessorCore.Tests/TestImages/Formats/Jpg/Calliphora.jpg"); + jpegCore = new CoreImage(jpegStream); + jpegStream.Position = 0; + jpegDrawing = Image.FromStream(jpegStream); + } + + if (pngStream == null) + { + pngStream = File.OpenRead("../ImageProcessorCore.Tests/TestImages/Formats/Png/splash.png"); + pngCore = new CoreImage(pngStream); + pngStream.Position = 0; + pngDrawing = Image.FromStream(pngStream); + } + } + + [Benchmark(Description = "System.Drawing Bmp")] + public void BmpSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmpDrawing.Save(memoryStream, ImageFormat.Bmp); + } + } + + [Benchmark(Description = "ImageProcessorCore Bmp")] + public void BmpCore() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmpCore.SaveAsBmp(memoryStream); + } + } + + [Benchmark(Description = "System.Drawing Gif")] + public void GifSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmpDrawing.Save(memoryStream, ImageFormat.Gif); + } + } + + [Benchmark(Description = "ImageProcessorCore Gif")] + public void GifCore() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmpCore.SaveAsGif(memoryStream); + } + } + + [Benchmark(Description = "System.Drawing Jpeg")] + public void JpegSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmpDrawing.Save(memoryStream, ImageFormat.Jpeg); + } + } + + [Benchmark(Description = "ImageProcessorCore Jpeg")] + public void JpegCore() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmpCore.SaveAsJpeg(memoryStream); + } + } + + [Benchmark(Description = "System.Drawing Png")] + public void PngSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmpDrawing.Save(memoryStream, ImageFormat.Png); + } + } + + [Benchmark(Description = "ImageProcessorCore Png")] + public void PngCore() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + bmpCore.SaveAsPng(memoryStream); + } + } + } +}