This commit is contained in:
parent
ddf47ad51b
commit
d76e133f18
31 changed files with 236 additions and 2592 deletions
|
|
@ -50,7 +50,7 @@ public class ChunkSizeBenchmarks
|
|||
});
|
||||
|
||||
var logger = loggerFactory.CreateLogger<ImageCreationService>();
|
||||
var imageCreatorLogger = loggerFactory.CreateLogger<ImageCreatorGDI>();
|
||||
var imageCreatorLogger = loggerFactory.CreateLogger<ImageCreatorImageSharp>();
|
||||
|
||||
_picSettings = new PicSettings
|
||||
{
|
||||
|
|
@ -75,7 +75,7 @@ public class ChunkSizeBenchmarks
|
|||
Trasparenza = 100
|
||||
};
|
||||
|
||||
var imageCreatorService = new ImageCreatorGDI(_picSettings, imageCreatorLogger);
|
||||
var imageCreatorService = new ImageCreatorImageSharp(_picSettings, imageCreatorLogger);
|
||||
_imageCreationStuff = new ImageCreationService(logger, _picSettings, imageCreatorService);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,40 +1,32 @@
|
|||
using System;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using SixLabors.ImageSharp;
|
||||
using SixLabors.ImageSharp.Formats.Jpeg;
|
||||
using SixLabors.ImageSharp.PixelFormats;
|
||||
|
||||
namespace MaddoShared.Benchmarks.Helpers;
|
||||
|
||||
/// <summary>
|
||||
/// Helper class to generate test images for benchmarking
|
||||
/// Helper class to generate test images for benchmarking.
|
||||
/// </summary>
|
||||
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility")]
|
||||
public static class TestImageGenerator
|
||||
{
|
||||
/// <summary>
|
||||
/// Generates a set of test JPEG images in the specified directory
|
||||
/// </summary>
|
||||
/// <param name="outputDirectory">Directory where images will be created</param>
|
||||
/// <param name="imageCount">Number of images to generate</param>
|
||||
/// <param name="width">Width of each image</param>
|
||||
/// <param name="height">Height of each image</param>
|
||||
/// <param name="includeSubfolders">Whether to create images in subfolders</param>
|
||||
public static void GenerateTestImages(
|
||||
string outputDirectory,
|
||||
int imageCount,
|
||||
int width = 4000,
|
||||
string outputDirectory,
|
||||
int imageCount,
|
||||
int width = 4000,
|
||||
int height = 3000,
|
||||
bool includeSubfolders = false)
|
||||
{
|
||||
Directory.CreateDirectory(outputDirectory);
|
||||
|
||||
var random = new Random(42); // Fixed seed for reproducibility
|
||||
var random = new Random(42);
|
||||
var encoder = new JpegEncoder { Quality = 85 };
|
||||
|
||||
for (int i = 0; i < imageCount; i++)
|
||||
for (var i = 0; i < imageCount; i++)
|
||||
{
|
||||
var targetDir = outputDirectory;
|
||||
|
||||
|
||||
if (includeSubfolders && i % 10 == 0)
|
||||
{
|
||||
targetDir = Path.Combine(outputDirectory, $"Subfolder_{i / 10}");
|
||||
|
|
@ -42,48 +34,17 @@ public static class TestImageGenerator
|
|||
}
|
||||
|
||||
var filePath = Path.Combine(targetDir, $"test_image_{i:D5}.jpg");
|
||||
|
||||
// Skip if already exists
|
||||
if (File.Exists(filePath))
|
||||
continue;
|
||||
|
||||
using var bitmap = new Bitmap(width, height);
|
||||
using var graphics = Graphics.FromImage(bitmap);
|
||||
|
||||
// Fill with a random color background
|
||||
var bgColor = Color.FromArgb(random.Next(256), random.Next(256), random.Next(256));
|
||||
graphics.Clear(bgColor);
|
||||
|
||||
// Draw some random shapes to make it more realistic
|
||||
for (int j = 0; j < 20; j++)
|
||||
{
|
||||
var color = Color.FromArgb(random.Next(256), random.Next(256), random.Next(256));
|
||||
var brush = new SolidBrush(color);
|
||||
var x = random.Next(width);
|
||||
var y = random.Next(height);
|
||||
var w = random.Next(200, 800);
|
||||
var h = random.Next(200, 800);
|
||||
graphics.FillEllipse(brush, x, y, w, h);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Add some text
|
||||
using var font = new Font("Arial", 48, FontStyle.Bold);
|
||||
var text = $"Test Image {i}";
|
||||
var textBrush = new SolidBrush(Color.White);
|
||||
graphics.DrawString(text, font, textBrush, new PointF(100, 100));
|
||||
|
||||
// Save as JPEG with standard quality
|
||||
var encoder = GetEncoder(ImageFormat.Jpeg);
|
||||
var encoderParameters = new EncoderParameters(1);
|
||||
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 85L);
|
||||
|
||||
bitmap.Save(filePath, encoder, encoderParameters);
|
||||
using var image = new Image<Rgba32>(width, height, RandomColor(random));
|
||||
AddBenchmarkTexture(image, random);
|
||||
image.Save(filePath, encoder);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cleans up generated test images
|
||||
/// </summary>
|
||||
public static void CleanupTestImages(string directory)
|
||||
{
|
||||
if (Directory.Exists(directory))
|
||||
|
|
@ -92,16 +53,38 @@ public static class TestImageGenerator
|
|||
}
|
||||
}
|
||||
|
||||
private static ImageCodecInfo GetEncoder(ImageFormat format)
|
||||
private static void AddBenchmarkTexture(Image<Rgba32> image, Random random)
|
||||
{
|
||||
var codecs = ImageCodecInfo.GetImageEncoders();
|
||||
foreach (var codec in codecs)
|
||||
image.ProcessPixelRows(accessor =>
|
||||
{
|
||||
if (codec.FormatID == format.Guid)
|
||||
for (var shape = 0; shape < 20; shape++)
|
||||
{
|
||||
return codec;
|
||||
var color = RandomColor(random);
|
||||
var startX = random.Next(image.Width);
|
||||
var startY = random.Next(image.Height);
|
||||
var width = random.Next(200, Math.Min(800, image.Width) + 1);
|
||||
var height = random.Next(200, Math.Min(800, image.Height) + 1);
|
||||
var endX = Math.Min(accessor.Width, startX + width);
|
||||
var endY = Math.Min(accessor.Height, startY + height);
|
||||
|
||||
for (var y = startY; y < endY; y++)
|
||||
{
|
||||
var row = accessor.GetRowSpan(y);
|
||||
for (var x = startX; x < endX; x++)
|
||||
{
|
||||
row[x] = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
private static Rgba32 RandomColor(Random random)
|
||||
{
|
||||
return new Rgba32(
|
||||
(byte)random.Next(256),
|
||||
(byte)random.Next(256),
|
||||
(byte)random.Next(256),
|
||||
255);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ public class ImageProcessingBenchmarks
|
|||
private ImageCreationService _imageCreationStuff;
|
||||
private PicSettings _picSettings;
|
||||
private ILogger<ImageCreationService> _logger;
|
||||
private ILogger<ImageCreatorGDI> _imageCreatorLogger;
|
||||
private ILogger<ImageCreatorImageSharp> _imageCreatorLogger;
|
||||
|
||||
[Params(10, 50, 100)]
|
||||
public int ImageCount { get; set; }
|
||||
|
|
@ -55,7 +55,7 @@ public class ImageProcessingBenchmarks
|
|||
});
|
||||
|
||||
_logger = loggerFactory.CreateLogger<ImageCreationService>();
|
||||
_imageCreatorLogger = loggerFactory.CreateLogger<ImageCreatorGDI>();
|
||||
_imageCreatorLogger = loggerFactory.CreateLogger<ImageCreatorImageSharp>();
|
||||
|
||||
// Setup PicSettings with default values
|
||||
_picSettings = new PicSettings
|
||||
|
|
@ -81,7 +81,7 @@ public class ImageProcessingBenchmarks
|
|||
Trasparenza = 100
|
||||
};
|
||||
|
||||
var imageCreatorService = new ImageCreatorGDI(_picSettings, _imageCreatorLogger);
|
||||
var imageCreatorService = new ImageCreatorImageSharp(_picSettings, _imageCreatorLogger);
|
||||
_imageCreationStuff = new ImageCreationService(_logger, _picSettings, imageCreatorService);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ public class ImageSizeBenchmarks
|
|||
});
|
||||
|
||||
var logger = loggerFactory.CreateLogger<ImageCreationService>();
|
||||
var imageCreatorLogger = loggerFactory.CreateLogger<ImageCreatorGDI>();
|
||||
var imageCreatorLogger = loggerFactory.CreateLogger<ImageCreatorImageSharp>();
|
||||
|
||||
_picSettings = new PicSettings
|
||||
{
|
||||
|
|
@ -84,7 +84,7 @@ public class ImageSizeBenchmarks
|
|||
Trasparenza = 100
|
||||
};
|
||||
|
||||
var imageCreatorService = new ImageCreatorGDI(_picSettings, imageCreatorLogger);
|
||||
var imageCreatorService = new ImageCreatorImageSharp(_picSettings, imageCreatorLogger);
|
||||
_imageCreationStuff = new ImageCreationService(logger, _picSettings, imageCreatorService);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,10 +2,8 @@
|
|||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net10.0-windows</TargetFramework>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public class StressTestBenchmark
|
|||
|
||||
Console.WriteLine($"[STRESS TEST] Generating {ImageCount} test images...");
|
||||
Console.WriteLine("This may take several minutes depending on your hardware.");
|
||||
|
||||
|
||||
// Use smaller images for stress test to save space and time
|
||||
TestImageGenerator.GenerateTestImages(_sourceDirectory, ImageCount, width: 1920, height: 1080);
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ public class StressTestBenchmark
|
|||
});
|
||||
|
||||
var logger = loggerFactory.CreateLogger<ImageCreationService>();
|
||||
var imageCreatorLogger = loggerFactory.CreateLogger<ImageCreatorGDI>();
|
||||
var imageCreatorLogger = loggerFactory.CreateLogger<ImageCreatorImageSharp>();
|
||||
|
||||
_picSettings = new PicSettings
|
||||
{
|
||||
|
|
@ -75,7 +75,7 @@ public class StressTestBenchmark
|
|||
Trasparenza = 100
|
||||
};
|
||||
|
||||
var imageCreatorService = new ImageCreatorGDI(_picSettings, imageCreatorLogger);
|
||||
var imageCreatorService = new ImageCreatorImageSharp(_picSettings, imageCreatorLogger);
|
||||
_imageCreationStuff = new ImageCreationService(logger, _picSettings, imageCreatorService);
|
||||
|
||||
Console.WriteLine($"[STRESS TEST] Setup complete. Ready to process {ImageCount} images.");
|
||||
|
|
@ -130,12 +130,12 @@ public class StressTestBenchmark
|
|||
|
||||
var results = new ConcurrentBag<string>();
|
||||
var startTime = DateTime.Now;
|
||||
|
||||
|
||||
await _imageCreationStuff.ProcessImagesParallel(options, results, null, CancellationToken.None);
|
||||
|
||||
|
||||
var duration = DateTime.Now - startTime;
|
||||
var throughput = ImageCount / duration.TotalSeconds;
|
||||
|
||||
|
||||
Console.WriteLine($"[STRESS TEST] Processed {results.Count}/{ImageCount} images in {duration.TotalSeconds:F2}s");
|
||||
Console.WriteLine($"[STRESS TEST] Throughput: {throughput:F2} images/second");
|
||||
}
|
||||
|
|
@ -160,12 +160,12 @@ public class StressTestBenchmark
|
|||
|
||||
var results = new ConcurrentBag<string>();
|
||||
var startTime = DateTime.Now;
|
||||
|
||||
|
||||
await _imageCreationStuff.ProcessImagesParallel(options, results, null, CancellationToken.None);
|
||||
|
||||
|
||||
var duration = DateTime.Now - startTime;
|
||||
var throughput = ImageCount / duration.TotalSeconds;
|
||||
|
||||
|
||||
Console.WriteLine($"[STRESS TEST] Processed {results.Count}/{ImageCount} images in {duration.TotalSeconds:F2}s");
|
||||
Console.WriteLine($"[STRESS TEST] Throughput: {throughput:F2} images/second");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue