From b943f80ca9aa902f17a1724b978de4e56325f262 Mon Sep 17 00:00:00 2001 From: Dmitry Pentin Date: Sun, 1 May 2022 01:23:56 +0300 Subject: [PATCH] Restored Program.cs --- .../Program.cs | 266 ++---------------- 1 file changed, 19 insertions(+), 247 deletions(-) diff --git a/tests/ImageSharp.Tests.ProfilingSandbox/Program.cs b/tests/ImageSharp.Tests.ProfilingSandbox/Program.cs index 6063bd8a0..bc0b40bad 100644 --- a/tests/ImageSharp.Tests.ProfilingSandbox/Program.cs +++ b/tests/ImageSharp.Tests.ProfilingSandbox/Program.cs @@ -2,16 +2,10 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Diagnostics; -using System.IO; using System.Reflection; using System.Threading; -using PhotoSauce.MagicScaler; -using PhotoSauce.MagicScaler.Interpolators; -using SixLabors.ImageSharp.Formats.Jpeg; -using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Processing; -using SixLabors.ImageSharp.Processing.Processors.Transforms; +using SixLabors.ImageSharp.Memory.Internals; +using SixLabors.ImageSharp.Tests.Formats.Jpg; using SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations; using SixLabors.ImageSharp.Tests.ProfilingBenchmarks; using Xunit.Abstractions; @@ -31,253 +25,31 @@ namespace SixLabors.ImageSharp.Tests.ProfilingSandbox public void WriteLine(string format, params object[] args) => Console.WriteLine(format, args); } - const string pathTemplate = ...""; - - // Second pass - must be 5% smaller than appropriate IDCT scaled size - const float scale = 0.75f; - readonly IResampler resampler = KnownResamplers.Box; - + /// + /// The main entry point. Useful for executing benchmarks and performance unit tests manually, + /// when the IDE test runners lack some of the functionality. Eg.: it's not possible to run JetBrains memory profiler for unit tests. + /// + /// + /// The arguments to pass to the program. + /// public static void Main(string[] args) { - //ReEncodeImage("jpeg444"); - - //Size targetSize = new Size(808, 1200); - - // 808 x 1200 - // 404 x 600 - // 202 x 300 - // 101 x 150 - string imageName = "Calliphora_aligned_size"; - - // Exact matches for 8/4/2/1 scaling - //Size exactSizeX8 = new Size(808, 1200); - //Size exactSizeX4 = new Size(404, 600); - //Size exactSizeX2 = new Size(202, 300); - //Size exactSizeX1 = new Size(101, 150); - //ReencodeImageResize__experimental(imageName, exactSizeX8); - //ReencodeImageResize__experimental(imageName, exactSizeX4); - //ReencodeImageResize__experimental(imageName, exactSizeX2); - //ReencodeImageResize__experimental(imageName, exactSizeX1); - - Size secondPassSizeX8 = new Size((int)(808 * scale), (int)(1200 * scale)); - Size secondPassSizeX4 = new Size((int)(404 * scale), (int)(600 * scale)); - Size secondPassSizeX2 = new Size((int)(202 * scale), (int)(300 * scale)); - Size secondPassSizeX1 = new Size((int)(101 * scale), (int)(150 * scale)); - ReencodeImageResize__experimental(imageName, secondPassSizeX8); - ReencodeImageResize__experimental(imageName, secondPassSizeX4); - ReencodeImageResize__experimental(imageName, secondPassSizeX2); - ReencodeImageResize__experimental(imageName, secondPassSizeX1); - ReencodeImageResize__explicit(imageName, secondPassSizeX8, resampler); - ReencodeImageResize__explicit(imageName, secondPassSizeX4, resampler); - ReencodeImageResize__explicit(imageName, secondPassSizeX2, resampler); - ReencodeImageResize__explicit(imageName, secondPassSizeX1, resampler); - - // 'native' resizing - only jpeg dct downscaling - //ReencodeImageResize_Comparison("Calliphora_ratio1", targetSize, 100); - - // 'native' + software resizing - jpeg dct downscaling + postprocessing - //ReencodeImageResize_Comparison("Calliphora_aligned_size", new Size(269, 400), 99); - - //var benchmarkSize = new Size(404, 600); - //BenchmarkResizingLoop__explicit("jpeg_quality_100", benchmarkSize, 300); - //BenchmarkResizingLoop__experimental("jpeg_quality_100", benchmarkSize, 300); - - Console.WriteLine("Done."); - } - - private static void BenchmarkEncoder(string fileName, int iterations, int quality, JpegColorType color) - { - string loadPath = String.Format(pathTemplate, fileName); - - using var inputStream = new FileStream(loadPath, FileMode.Open); - using var saveStream = new MemoryStream(); - - var decoder = new JpegDecoder { IgnoreMetadata = true }; - using Image img = decoder.Decode(Configuration.Default, inputStream, CancellationToken.None); - - var encoder = new JpegEncoder() - { - Quality = quality, - ColorType = color - }; - - Stopwatch sw = new Stopwatch(); - sw.Start(); - for (int i = 0; i < iterations; i++) + try { - img.SaveAsJpeg(saveStream, encoder); - saveStream.Position = 0; + LoadResizeSaveParallelMemoryStress.Run(args); } - sw.Stop(); - - Console.WriteLine($"// Encoding q={quality} | color={color}\n" + - $"// Elapsed: {sw.ElapsedMilliseconds}ms across {iterations} iterations\n" + - $"// Average: {(double)sw.ElapsedMilliseconds / iterations}ms"); - } - - private static void BenchmarkDecoder(string fileName, int iterations) - { - string loadPath = String.Format(pathTemplate, fileName); - - using var fileStream = new FileStream(loadPath, FileMode.Open); - using var inputStream = new MemoryStream(); - fileStream.CopyTo(inputStream); - - var decoder = new JpegDecoder { IgnoreMetadata = true }; - - var sw = new Stopwatch(); - sw.Start(); - for (int i = 0; i < iterations; i++) - { - inputStream.Position = 0; - using Image img = decoder.Decode(Configuration.Default, inputStream, CancellationToken.None); - } - sw.Stop(); - - Console.WriteLine($"// Decoding\n" + - $"// Elapsed: {sw.ElapsedMilliseconds}ms across {iterations} iterations\n" + - $"// Average: {(double)sw.ElapsedMilliseconds / iterations}ms"); - } - - private static void BenchmarkResizingLoop__experimental(string fileName, Size targetSize, int iterations) - { - string loadPath = String.Format(pathTemplate, fileName); - - using var fileStream = new FileStream(loadPath, FileMode.Open); - using var saveStream = new MemoryStream(); - using var inputStream = new MemoryStream(); - fileStream.CopyTo(inputStream); - - var decoder = new JpegDecoder { IgnoreMetadata = true }; - var encoder = new JpegEncoder { ColorType = JpegColorType.YCbCrRatio444 }; - - var sw = new Stopwatch(); - sw.Start(); - for (int i = 0; i < iterations; i++) + catch (Exception ex) { - inputStream.Position = 0; - using Image img = decoder.Experimental__DecodeInto(Configuration.Default, inputStream, targetSize, CancellationToken.None); - img.SaveAsJpeg(saveStream, encoder); + Console.WriteLine(ex); } - sw.Stop(); - - Console.WriteLine($"// Decode-Resize-Encode w/ downscaling decoder\n" + - $"// Elapsed: {sw.ElapsedMilliseconds}ms across {iterations} iterations\n" + - $"// Average: {(double)sw.ElapsedMilliseconds / iterations}ms"); - } - private static void BenchmarkResizingLoop__explicit(string fileName, Size targetSize, int iterations) - { - string loadPath = String.Format(pathTemplate, fileName); + // RunJpegEncoderProfilingTests(); + // RunJpegColorProfilingTests(); + // RunDecodeJpegProfilingTests(); + // RunToVector4ProfilingTest(); + // RunResizeProfilingTest(); - using var fileStream = new FileStream(loadPath, FileMode.Open); - using var saveStream = new MemoryStream(); - using var inputStream = new MemoryStream(); - fileStream.CopyTo(inputStream); - - var decoder = new JpegDecoder { IgnoreMetadata = true }; - var encoder = new JpegEncoder { ColorType = JpegColorType.YCbCrRatio444 }; - - var sw = new Stopwatch(); - sw.Start(); - for (int i = 0; i < iterations; i++) - { - inputStream.Position = 0; - using Image img = decoder.Decode(Configuration.Default, inputStream, CancellationToken.None); - img.Mutate(ctx => ctx.Resize(targetSize, KnownResamplers.Box, false)); - img.SaveAsJpeg(saveStream, encoder); - } - sw.Stop(); - - Console.WriteLine($"// Decode-Resize-Encode w/ Mutate()\n" + - $"// Elapsed: {sw.ElapsedMilliseconds}ms across {iterations} iterations\n" + - $"// Average: {(double)sw.ElapsedMilliseconds / iterations}ms"); - } - - private static void ReEncodeImage(string fileName, int? quality = null) - { - string loadPath = String.Format(pathTemplate, fileName); - using Image img = Image.Load(loadPath); - - string savePath = String.Format(pathTemplate, $"q{quality}_test_{fileName}"); - var encoder = new JpegEncoder() - { - Quality = quality, - ColorType = JpegColorType.YCbCrRatio444 - }; - img.SaveAsJpeg(savePath, encoder); - } - - private static void ReencodeImageResize__explicit(string fileName, Size targetSize, IResampler sampler, int? quality = null) - { - string loadPath = String.Format(pathTemplate, fileName); - string savePath = String.Format(pathTemplate, $"is_res_{sampler.GetType().Name}[{targetSize.Width}x{targetSize.Height}]_{fileName}"); - - var decoder = new JpegDecoder(); - var encoder = new JpegEncoder() - { - Quality = quality, - ColorType = JpegColorType.YCbCrRatio444 - }; - - using Image img = decoder.Decode(Configuration.Default, File.OpenRead(loadPath), CancellationToken.None); - img.Mutate(ctx => ctx.Resize(targetSize, sampler, compand: false)); - img.SaveAsJpeg(savePath, encoder); - } - - private static void ReencodeImageResize__experimental(string fileName, Size targetSize, int? quality = null) - { - string loadPath = String.Format(pathTemplate, fileName); - string savePath = String.Format(pathTemplate, $"is_res_jpeg[{targetSize.Width}x{targetSize.Height}]_{fileName}"); - - var decoder = new JpegDecoder { IgnoreMetadata = true }; - using Image img = decoder.Experimental__DecodeInto(Configuration.Default, File.OpenRead(loadPath), targetSize, CancellationToken.None); - - var encoder = new JpegEncoder() - { - Quality = quality, - ColorType = JpegColorType.YCbCrRatio444 - }; - img.SaveAsJpeg(savePath, encoder); - } - - private static void ReencodeImageResize__Netvips(string fileName, Size targetSize, int? quality) - { - string loadPath = String.Format(pathTemplate, fileName); - string savePath = String.Format(pathTemplate, $"netvips_resize_{fileName}"); - - using var thumb = NetVips.Image.Thumbnail(loadPath, targetSize.Width, targetSize.Height); - - // Save the results - thumb.Jpegsave(savePath, q: quality, strip: true, subsampleMode: NetVips.Enums.ForeignSubsample.Off); - } - - private static void ReencodeImageResize__MagicScaler(string fileName, Size targetSize, int quality) - { - string loadPath = String.Format(pathTemplate, fileName); - string savePath = String.Format(pathTemplate, $"magicscaler_resize_{fileName}"); - - var settings = new ProcessImageSettings() - { - Width = targetSize.Width, - Height = targetSize.Height, - SaveFormat = FileFormat.Jpeg, - JpegQuality = quality, - JpegSubsampleMode = ChromaSubsampleMode.Subsample444, - Sharpen = false, - ColorProfileMode = ColorProfileMode.Ignore, - HybridMode = HybridScaleMode.Turbo, - }; - - using var output = new FileStream(savePath, FileMode.Create); - MagicImageProcessor.ProcessImage(loadPath, output, settings); - } - - private static void ReencodeImageResize_Comparison(string fileName, Size targetSize, int quality) - { - ReencodeImageResize__experimental(fileName, targetSize, quality); - ReencodeImageResize__Netvips(fileName, targetSize, quality); - ReencodeImageResize__MagicScaler(fileName, targetSize, quality); + // Console.ReadLine(); } private static Version GetNetCoreVersion()