From b45e2a1c1f4ceb7ef37794e611cc897190229aed Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 3 Nov 2016 10:59:22 +1100 Subject: [PATCH] Separate Decoder/Encoder benchmarks --- src/ImageSharp/Formats/Jpg/JpegDecoderCore.cs | 5 +- tests/ImageSharp.Benchmarks/Image/Decode.cs | 131 ---------------- .../ImageSharp.Benchmarks/Image/DecodeBmp.cs | 51 +++++++ .../ImageSharp.Benchmarks/Image/DecodeGif.cs | 51 +++++++ .../ImageSharp.Benchmarks/Image/DecodeJpeg.cs | 51 +++++++ .../ImageSharp.Benchmarks/Image/DecodePng.cs | 51 +++++++ tests/ImageSharp.Benchmarks/Image/Encode.cs | 141 ------------------ .../ImageSharp.Benchmarks/Image/EncodeBmp.cs | 52 +++++++ .../ImageSharp.Benchmarks/Image/EncodeGif.cs | 52 +++++++ .../ImageSharp.Benchmarks/Image/EncodeJpeg.cs | 52 +++++++ .../ImageSharp.Benchmarks/Image/EncodePng.cs | 52 +++++++ 11 files changed, 415 insertions(+), 274 deletions(-) delete mode 100644 tests/ImageSharp.Benchmarks/Image/Decode.cs create mode 100644 tests/ImageSharp.Benchmarks/Image/DecodeBmp.cs create mode 100644 tests/ImageSharp.Benchmarks/Image/DecodeGif.cs create mode 100644 tests/ImageSharp.Benchmarks/Image/DecodeJpeg.cs create mode 100644 tests/ImageSharp.Benchmarks/Image/DecodePng.cs delete mode 100644 tests/ImageSharp.Benchmarks/Image/Encode.cs create mode 100644 tests/ImageSharp.Benchmarks/Image/EncodeBmp.cs create mode 100644 tests/ImageSharp.Benchmarks/Image/EncodeGif.cs create mode 100644 tests/ImageSharp.Benchmarks/Image/EncodeJpeg.cs create mode 100644 tests/ImageSharp.Benchmarks/Image/EncodePng.cs diff --git a/src/ImageSharp/Formats/Jpg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpg/JpegDecoderCore.cs index ede58a5f4c..0d9e152c50 100644 --- a/src/ImageSharp/Formats/Jpg/JpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpg/JpegDecoderCore.cs @@ -194,6 +194,7 @@ namespace ImageSharp.Formats this.bits = new Bits(); this.bytes = new Bytes(); + // TODO: This looks like it could be static. for (int i = 0; i < MaxTc + 1; i++) { for (int j = 0; j < MaxTh + 1; j++) @@ -362,7 +363,7 @@ namespace ImageSharp.Formats this.ProcessApp14Marker(remaining); break; default: - if (JpegConstants.Markers.APP0 <= marker && marker <= JpegConstants.Markers.APP15 || marker == JpegConstants.Markers.COM) + if ((JpegConstants.Markers.APP0 <= marker && marker <= JpegConstants.Markers.APP15) || marker == JpegConstants.Markers.COM) { this.Skip(remaining); } @@ -1385,7 +1386,7 @@ namespace ImageSharp.Formats // Implicit casting FTW Color color = new YCbCr(yy, cb, cr); TColor packed = default(TColor); - packed.PackFromBytes(color.R, color.G, color.B, color.A); + packed.PackFromBytes(color.R, color.G, color.B, 255); pixels[x, y] = packed; } }); diff --git a/tests/ImageSharp.Benchmarks/Image/Decode.cs b/tests/ImageSharp.Benchmarks/Image/Decode.cs deleted file mode 100644 index f7216d851c..0000000000 --- a/tests/ImageSharp.Benchmarks/Image/Decode.cs +++ /dev/null @@ -1,131 +0,0 @@ -// -// Copyright (c) James Jackson-South and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace ImageSharp.Benchmarks.Image -{ - using System.Drawing; - using System.IO; - - using BenchmarkDotNet.Attributes; - using CoreSize = ImageSharp.Size; - using CoreImage = ImageSharp.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("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp"); - } - if (gifBytes == null) - { - gifBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Gif/rings.gif"); - } - if (jpegBytes == null) - { - jpegBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Jpg/Calliphora.jpg"); - } - if (pngBytes == null) - { - pngBytes = File.ReadAllBytes("../ImageSharp.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 = "ImageSharp 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 = "ImageSharp 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 = "ImageSharp 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 = "ImageSharp 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/ImageSharp.Benchmarks/Image/DecodeBmp.cs b/tests/ImageSharp.Benchmarks/Image/DecodeBmp.cs new file mode 100644 index 0000000000..263e66462e --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/DecodeBmp.cs @@ -0,0 +1,51 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.Drawing; + using System.IO; + + using BenchmarkDotNet.Attributes; + + using CoreImage = ImageSharp.Image; + using CoreSize = ImageSharp.Size; + + public class DecodeBmp + { + private byte[] bmpBytes; + + [Setup] + public void ReadImages() + { + if (this.bmpBytes == null) + { + this.bmpBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp"); + } + } + + [Benchmark(Baseline = true, Description = "System.Drawing Bmp")] + public Size BmpSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream(this.bmpBytes)) + { + using (Image image = Image.FromStream(memoryStream)) + { + return image.Size; + } + } + } + + [Benchmark(Description = "ImageSharp Bmp")] + public CoreSize BmpCore() + { + using (MemoryStream memoryStream = new MemoryStream(this.bmpBytes)) + { + CoreImage image = new CoreImage(memoryStream); + return new CoreSize(image.Width, image.Height); + } + } + } +} diff --git a/tests/ImageSharp.Benchmarks/Image/DecodeGif.cs b/tests/ImageSharp.Benchmarks/Image/DecodeGif.cs new file mode 100644 index 0000000000..e8599b357c --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/DecodeGif.cs @@ -0,0 +1,51 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.Drawing; + using System.IO; + + using BenchmarkDotNet.Attributes; + + using CoreImage = ImageSharp.Image; + using CoreSize = ImageSharp.Size; + + public class DecodeGif + { + private byte[] gifBytes; + + [Setup] + public void ReadImages() + { + if (this.gifBytes == null) + { + this.gifBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Gif/rings.gif"); + } + } + + [Benchmark(Baseline = true, Description = "System.Drawing Gif")] + public Size GifSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream(this.gifBytes)) + { + using (Image image = Image.FromStream(memoryStream)) + { + return image.Size; + } + } + } + + [Benchmark(Description = "ImageSharp Gif")] + public CoreSize GifCore() + { + using (MemoryStream memoryStream = new MemoryStream(this.gifBytes)) + { + CoreImage image = new CoreImage(memoryStream); + return new CoreSize(image.Width, image.Height); + } + } + } +} diff --git a/tests/ImageSharp.Benchmarks/Image/DecodeJpeg.cs b/tests/ImageSharp.Benchmarks/Image/DecodeJpeg.cs new file mode 100644 index 0000000000..6f2bd5e60c --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/DecodeJpeg.cs @@ -0,0 +1,51 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.Drawing; + using System.IO; + + using BenchmarkDotNet.Attributes; + + using CoreImage = ImageSharp.Image; + using CoreSize = ImageSharp.Size; + + public class DecodeJpeg + { + private byte[] jpegBytes; + + [Setup] + public void ReadImages() + { + if (this.jpegBytes == null) + { + this.jpegBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Jpg/Calliphora.jpg"); + } + } + + [Benchmark(Baseline = true, Description = "System.Drawing Jpeg")] + public Size JpegSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream(this.jpegBytes)) + { + using (Image image = Image.FromStream(memoryStream)) + { + return image.Size; + } + } + } + + [Benchmark(Description = "ImageSharp Jpeg")] + public CoreSize JpegCore() + { + using (MemoryStream memoryStream = new MemoryStream(this.jpegBytes)) + { + CoreImage image = new CoreImage(memoryStream); + return new CoreSize(image.Width, image.Height); + } + } + } +} diff --git a/tests/ImageSharp.Benchmarks/Image/DecodePng.cs b/tests/ImageSharp.Benchmarks/Image/DecodePng.cs new file mode 100644 index 0000000000..ffc02b6ba1 --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/DecodePng.cs @@ -0,0 +1,51 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.Drawing; + using System.IO; + + using BenchmarkDotNet.Attributes; + + using CoreImage = ImageSharp.Image; + using CoreSize = ImageSharp.Size; + + public class DecodePng + { + private byte[] pngBytes; + + [Setup] + public void ReadImages() + { + if (this.pngBytes == null) + { + this.pngBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/splash.png"); + } + } + + [Benchmark(Baseline = true, Description = "System.Drawing Png")] + public Size PngSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream(this.pngBytes)) + { + using (Image image = Image.FromStream(memoryStream)) + { + return image.Size; + } + } + } + + [Benchmark(Description = "ImageSharp Png")] + public CoreSize PngCore() + { + using (MemoryStream memoryStream = new MemoryStream(this.pngBytes)) + { + CoreImage image = new CoreImage(memoryStream); + return new CoreSize(image.Width, image.Height); + } + } + } +} diff --git a/tests/ImageSharp.Benchmarks/Image/Encode.cs b/tests/ImageSharp.Benchmarks/Image/Encode.cs deleted file mode 100644 index 24e97aa4f7..0000000000 --- a/tests/ImageSharp.Benchmarks/Image/Encode.cs +++ /dev/null @@ -1,141 +0,0 @@ -// -// Copyright (c) James Jackson-South and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace ImageSharp.Benchmarks.Image -{ - using System.Drawing; - using System.Drawing.Imaging; - using System.IO; - - using BenchmarkDotNet.Attributes; - using CoreImage = ImageSharp.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("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp"); - bmpCore = new CoreImage(bmpStream); - bmpStream.Position = 0; - bmpDrawing = Image.FromStream(bmpStream); - } - - if (gifStream == null) - { - gifStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Gif/rings.gif"); - gifCore = new CoreImage(gifStream); - gifStream.Position = 0; - gifDrawing = Image.FromStream(gifStream); - } - - if (jpegStream == null) - { - jpegStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Jpg/Calliphora.jpg"); - jpegCore = new CoreImage(jpegStream); - jpegStream.Position = 0; - jpegDrawing = Image.FromStream(jpegStream); - } - - if (pngStream == null) - { - pngStream = File.OpenRead("../ImageSharp.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 = "ImageSharp 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 = "ImageSharp 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 = "ImageSharp 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 = "ImageSharp Png")] - public void PngCore() - { - using (MemoryStream memoryStream = new MemoryStream()) - { - bmpCore.SaveAsPng(memoryStream); - } - } - } -} diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeBmp.cs b/tests/ImageSharp.Benchmarks/Image/EncodeBmp.cs new file mode 100644 index 0000000000..7e2060ce9d --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/EncodeBmp.cs @@ -0,0 +1,52 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.Drawing; + using System.Drawing.Imaging; + using System.IO; + + using BenchmarkDotNet.Attributes; + using CoreImage = ImageSharp.Image; + + public class EncodeBmp + { + // System.Drawing needs this. + private Stream bmpStream; + private Image bmpDrawing; + private CoreImage bmpCore; + + [Setup] + public void ReadImages() + { + if (this.bmpStream == null) + { + this.bmpStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp"); + this.bmpCore = new CoreImage(this.bmpStream); + this.bmpStream.Position = 0; + this.bmpDrawing = Image.FromStream(this.bmpStream); + } + } + + [Benchmark(Baseline = true, Description = "System.Drawing Bmp")] + public void JpegSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + this.bmpDrawing.Save(memoryStream, ImageFormat.Bmp); + } + } + + [Benchmark(Description = "ImageSharp Bmp")] + public void JpegCore() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + this.bmpCore.SaveAsBmp(memoryStream); + } + } + } +} diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeGif.cs b/tests/ImageSharp.Benchmarks/Image/EncodeGif.cs new file mode 100644 index 0000000000..7128089f92 --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/EncodeGif.cs @@ -0,0 +1,52 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.Drawing; + using System.Drawing.Imaging; + using System.IO; + + using BenchmarkDotNet.Attributes; + using CoreImage = ImageSharp.Image; + + public class EncodeGif + { + // System.Drawing needs this. + private Stream bmpStream; + private Image bmpDrawing; + private CoreImage bmpCore; + + [Setup] + public void ReadImages() + { + if (this.bmpStream == null) + { + this.bmpStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp"); + this.bmpCore = new CoreImage(this.bmpStream); + this.bmpStream.Position = 0; + this.bmpDrawing = Image.FromStream(this.bmpStream); + } + } + + [Benchmark(Baseline = true, Description = "System.Drawing Gif")] + public void JpegSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + this.bmpDrawing.Save(memoryStream, ImageFormat.Gif); + } + } + + [Benchmark(Description = "ImageSharp Gif")] + public void JpegCore() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + this.bmpCore.SaveAsGif(memoryStream); + } + } + } +} diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeJpeg.cs b/tests/ImageSharp.Benchmarks/Image/EncodeJpeg.cs new file mode 100644 index 0000000000..8bed1a56f4 --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/EncodeJpeg.cs @@ -0,0 +1,52 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.Drawing; + using System.Drawing.Imaging; + using System.IO; + + using BenchmarkDotNet.Attributes; + using CoreImage = ImageSharp.Image; + + public class EncodeJpeg + { + // System.Drawing needs this. + private Stream bmpStream; + private Image bmpDrawing; + private CoreImage bmpCore; + + [Setup] + public void ReadImages() + { + if (this.bmpStream == null) + { + this.bmpStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp"); + this.bmpCore = new CoreImage(this.bmpStream); + this.bmpStream.Position = 0; + this.bmpDrawing = Image.FromStream(this.bmpStream); + } + } + + [Benchmark(Baseline = true, Description = "System.Drawing Jpeg")] + public void JpegSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + this.bmpDrawing.Save(memoryStream, ImageFormat.Jpeg); + } + } + + [Benchmark(Description = "ImageSharp Jpeg")] + public void JpegCore() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + this.bmpCore.SaveAsJpeg(memoryStream); + } + } + } +} diff --git a/tests/ImageSharp.Benchmarks/Image/EncodePng.cs b/tests/ImageSharp.Benchmarks/Image/EncodePng.cs new file mode 100644 index 0000000000..d9a83f5564 --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/EncodePng.cs @@ -0,0 +1,52 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.Drawing; + using System.Drawing.Imaging; + using System.IO; + + using BenchmarkDotNet.Attributes; + using CoreImage = ImageSharp.Image; + + public class EncodePng + { + // System.Drawing needs this. + private Stream bmpStream; + private Image bmpDrawing; + private CoreImage bmpCore; + + [Setup] + public void ReadImages() + { + if (this.bmpStream == null) + { + this.bmpStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp"); + this.bmpCore = new CoreImage(this.bmpStream); + this.bmpStream.Position = 0; + this.bmpDrawing = Image.FromStream(this.bmpStream); + } + } + + [Benchmark(Baseline = true, Description = "System.Drawing Png")] + public void JpegSystemDrawing() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + this.bmpDrawing.Save(memoryStream, ImageFormat.Png); + } + } + + [Benchmark(Description = "ImageSharp Png")] + public void JpegCore() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + this.bmpCore.SaveAsPng(memoryStream); + } + } + } +}