diff --git a/SimpleCDN.Benchmarks/Benchmarks.cs b/SimpleCDN.Benchmarks/Benchmarks.cs index dcf2854..80ae6bb 100644 --- a/SimpleCDN.Benchmarks/Benchmarks.cs +++ b/SimpleCDN.Benchmarks/Benchmarks.cs @@ -1,17 +1,11 @@ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace SimpleCDN.Benchmarks { - [MemoryDiagnoser(false)] //[SimpleJob(RuntimeMoniker.NativeAot90)] [SimpleJob(RuntimeMoniker.Net90)] + [MemoryDiagnoser(false)] public class Benchmarks { public static IEnumerable Paths => @@ -25,14 +19,19 @@ public class Benchmarks [Benchmark(OperationsPerInvoke = NormalizationBenchmarkIterationsPerInvoke)] [ArgumentsSource(nameof(Paths))] - public void Normalize(char[] path) + public long Normalize(char[] path) { + long res = 0; + for (var i = 0; i < NormalizationBenchmarkIterationsPerInvoke; i++) { var copy = path.ToArray(); var span = copy.AsSpan(); Helpers.Extensions.Normalize(ref span); + res += span.BinarySearch('/'); } + + return res; } } } diff --git a/SimpleCDN.Tests.Integration/EndpointTests.cs b/SimpleCDN.Tests.Integration/EndpointTests.cs index c2fd9b5..90a2d45 100644 --- a/SimpleCDN.Tests.Integration/EndpointTests.cs +++ b/SimpleCDN.Tests.Integration/EndpointTests.cs @@ -1,6 +1,4 @@ -using Microsoft.AspNetCore.Mvc.Testing; - -namespace SimpleCDN.Tests.Integration +namespace SimpleCDN.Tests.Integration { public class EndpointTests : IClassFixture { diff --git a/SimpleCDN.Tests/CacheManagerTests.cs b/SimpleCDN.Tests/CacheManagerTests.cs index 3b7b51a..3df5c0a 100644 --- a/SimpleCDN.Tests/CacheManagerTests.cs +++ b/SimpleCDN.Tests/CacheManagerTests.cs @@ -1,11 +1,7 @@ using SimpleCDN.Cache; using SimpleCDN.Services; using SimpleCDN.Tests.Mocks; -using System; -using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace SimpleCDN.Tests { diff --git a/SimpleCDN.Tests/Mocks/DistributedCacheMock.cs b/SimpleCDN.Tests/Mocks/DistributedCacheMock.cs index 666f251..950ab0d 100644 --- a/SimpleCDN.Tests/Mocks/DistributedCacheMock.cs +++ b/SimpleCDN.Tests/Mocks/DistributedCacheMock.cs @@ -1,9 +1,4 @@ using Microsoft.Extensions.Caching.Distributed; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace SimpleCDN.Tests.Mocks { diff --git a/SimpleCDN.Tests/NormalizeTests.cs b/SimpleCDN.Tests/NormalizeTests.cs index b2f2116..6e6258d 100644 --- a/SimpleCDN.Tests/NormalizeTests.cs +++ b/SimpleCDN.Tests/NormalizeTests.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SimpleCDN.Tests +namespace SimpleCDN.Tests { [TestFixture] public class NormalizeTests diff --git a/SimpleCDN.sln b/SimpleCDN.sln index 8b1f9e5..cf02e12 100644 --- a/SimpleCDN.sln +++ b/SimpleCDN.sln @@ -2,15 +2,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.13.35507.96 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCDN", "SimpleCDN\SimpleCDN.csproj", "{E15F4BC2-E820-48D6-857B-E2DC9E35D370}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCDN.Tests", "SimpleCDN.Tests\SimpleCDN.Tests.csproj", "{6D8833B9-7EC8-4212-83DD-ABCCD677309E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCDN", "SimpleCDN\SimpleCDN.csproj", "{9C7F11BA-ECF0-8CD1-D1F5-DB31D692724E}" EndProject Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{81DDED9D-158B-E303-5F62-77A2896D2A5A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCDN.Tests.Integration", "SimpleCDN.Tests.Integration\SimpleCDN.Tests.Integration.csproj", "{F79E71E8-89D8-46F7-802C-CFDF3A77447D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCDN.Tests", "SimpleCDN.Tests\SimpleCDN.Tests.csproj", "{9F41AC4B-73A5-AED7-2FAD-13532040B2E1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCDN.Benchmarks", "SimpleCDN.Benchmarks\SimpleCDN.Benchmarks.csproj", "{01B35836-CD1D-0631-A280-04996E3E2058}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCDN.Benchmarks", "SimpleCDN.Benchmarks\SimpleCDN.Benchmarks.csproj", "{73BC9966-46FF-40D8-89F4-C990B15370A2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleCDN.Tests.Integration", "SimpleCDN.Tests.Integration\SimpleCDN.Tests.Integration.csproj", "{748DF05A-61E9-3214-6751-2FB8D9C75A1C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -18,30 +18,28 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E15F4BC2-E820-48D6-857B-E2DC9E35D370}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E15F4BC2-E820-48D6-857B-E2DC9E35D370}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E15F4BC2-E820-48D6-857B-E2DC9E35D370}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E15F4BC2-E820-48D6-857B-E2DC9E35D370}.Release|Any CPU.Build.0 = Release|Any CPU - {6D8833B9-7EC8-4212-83DD-ABCCD677309E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6D8833B9-7EC8-4212-83DD-ABCCD677309E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6D8833B9-7EC8-4212-83DD-ABCCD677309E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6D8833B9-7EC8-4212-83DD-ABCCD677309E}.Release|Any CPU.Build.0 = Release|Any CPU + {9C7F11BA-ECF0-8CD1-D1F5-DB31D692724E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C7F11BA-ECF0-8CD1-D1F5-DB31D692724E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C7F11BA-ECF0-8CD1-D1F5-DB31D692724E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C7F11BA-ECF0-8CD1-D1F5-DB31D692724E}.Release|Any CPU.Build.0 = Release|Any CPU {81DDED9D-158B-E303-5F62-77A2896D2A5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {81DDED9D-158B-E303-5F62-77A2896D2A5A}.Debug|Any CPU.Build.0 = Debug|Any CPU {81DDED9D-158B-E303-5F62-77A2896D2A5A}.Release|Any CPU.ActiveCfg = Release|Any CPU {81DDED9D-158B-E303-5F62-77A2896D2A5A}.Release|Any CPU.Build.0 = Release|Any CPU - {F79E71E8-89D8-46F7-802C-CFDF3A77447D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F79E71E8-89D8-46F7-802C-CFDF3A77447D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F79E71E8-89D8-46F7-802C-CFDF3A77447D}.Release|Any CPU.Build.0 = Release|Any CPU - {73BC9966-46FF-40D8-89F4-C990B15370A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {73BC9966-46FF-40D8-89F4-C990B15370A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {73BC9966-46FF-40D8-89F4-C990B15370A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {73BC9966-46FF-40D8-89F4-C990B15370A2}.Release|Any CPU.Build.0 = Release|Any CPU + {9F41AC4B-73A5-AED7-2FAD-13532040B2E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F41AC4B-73A5-AED7-2FAD-13532040B2E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F41AC4B-73A5-AED7-2FAD-13532040B2E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F41AC4B-73A5-AED7-2FAD-13532040B2E1}.Release|Any CPU.Build.0 = Release|Any CPU + {01B35836-CD1D-0631-A280-04996E3E2058}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01B35836-CD1D-0631-A280-04996E3E2058}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01B35836-CD1D-0631-A280-04996E3E2058}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01B35836-CD1D-0631-A280-04996E3E2058}.Release|Any CPU.Build.0 = Release|Any CPU + {748DF05A-61E9-3214-6751-2FB8D9C75A1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {748DF05A-61E9-3214-6751-2FB8D9C75A1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {748DF05A-61E9-3214-6751-2FB8D9C75A1C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {748DF05A-61E9-3214-6751-2FB8D9C75A1C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D252A113-93EA-49FE-9080-E3A41CD60F25} - EndGlobalSection EndGlobal diff --git a/SimpleCDN/Endpoints/CDN.cs b/SimpleCDN/Endpoints/CDN.cs index 9bd43f8..242d8c1 100644 --- a/SimpleCDN/Endpoints/CDN.cs +++ b/SimpleCDN/Endpoints/CDN.cs @@ -13,7 +13,6 @@ public static IEndpointRouteBuilder RegisterCDNEndpoints(this IEndpointRouteBuil { try { - if (loader.GetFile(route) is CDNFile file) { var typedAccept = ctx.Request.GetTypedHeaders().Accept; @@ -57,6 +56,7 @@ public static IEndpointRouteBuilder RegisterCDNEndpoints(this IEndpointRouteBuil }).CacheOutput(policy => { // cache the response for 1 minute to reduce load on the server + // this is another layer of caching, on top of the CDNLoader cache. policy.Cache() .Expire(TimeSpan.FromMinutes(1)) .SetVaryByRouteValue("route") diff --git a/SimpleCDN/Program.cs b/SimpleCDN/Program.cs index 51e6ffd..77f8b6f 100644 --- a/SimpleCDN/Program.cs +++ b/SimpleCDN/Program.cs @@ -20,6 +20,15 @@ private static void Main(string[] args) .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: true) .AddCommandLine(args); + builder.Services.AddOutputCache(options => + { + var configuration = options.ApplicationServices.GetRequiredService(); + + // output cache is 1/10th of memory cache + // in bytes in kilobytes + options.MaximumBodySize = configuration.MaxMemoryCacheSize * 100; + }); + builder.Services.MapConfiguration(); // for now, we use a simple size-limited in-memory cache. @@ -35,6 +44,7 @@ private static void Main(string[] args) var app = builder.Build(); app.RegisterCDNEndpoints(); + app.UseOutputCache(); app.Run(); }