[C#/ASP.NET MVC/.NETCORE] 인라인 미들웨어 성능 측정하기
■ 인라인 미들웨어 성능을 측정하는 방법을 보여준다. ▶ TimeHelper.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
using Microsoft.Extensions.Logging; using System; using System.Diagnostics; namespace TestProject { /// <summary> /// 시간 헬퍼 /// </summary> public sealed class TimeHelper : IDisposable { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 로그 기록기 /// </summary> private ILogger<Startup> logger; /// <summary> /// 메시지 /// </summary> private string message; /// <summary> /// 스톱워치 /// </summary> private Stopwatch stopwatch; /// <summary> /// 리소스 해제 여부 /// </summary> private bool disposed = false; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - TimeHelper(logger, message) /// <summary> /// 생성자 /// </summary> /// <param name="logger">로그 기록기</param> /// <param name="message">메시지</param> public TimeHelper(ILogger<Startup> logger, string message) { this.logger = logger; this.message = message; this.stopwatch = Stopwatch.StartNew(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 리소스 해제하기 - Dispose() /// <summary> /// 리소스 해제하기 /// </summary> public void Dispose() { if(!this.disposed) { this.logger.LogInformation($"{message } : {stopwatch.ElapsedMilliseconds}ms"); this.disposed = true; } } #endregion } } |
▶ Startup.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace TestProject { /// <summary> /// 시작 /// </summary> public class Startup { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 구성 - Configuration /// <summary> /// 구성 /// </summary> public IConfiguration Configuration { get; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - Startup(configuration) /// <summary> /// 생성자 /// </summary> /// <param name="configuration">구성</param> public Startup(IConfiguration configuration) { Configuration = configuration; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 서비스 컬렉션 구성하기 - ConfigureServices(services) /// <summary> /// 서비스 컬렉션 구성하기 /// </summary> /// <param name="services">서비스 컬렉션</param> public void ConfigureServices(IServiceCollection services) { services.AddAuthorization(); } #endregion #region 구성하기 - Configure(app, logger) /// <summary> /// 구성하기 /// </summary> /// <param name="app">애플리케이션 빌더</param> /// <param name="logger">로그 기록기</param> public void Configure(IApplicationBuilder app, ILogger<Startup> logger) { int count = 0; // 인라인 미들웨어 1 app.Use ( next => async context => { using(new TimeHelper(logger, $"TIME {++count}")) { await next(context); } } ); app.UseRouting(); // 인라인 미들웨어 2 app.Use ( next => async context => { using(new TimeHelper(logger, $"TIME {++count}")) { await next(context); } } ); app.UseAuthorization(); // 인라인 미들웨어 3 app.Use ( next => async context => { using(new TimeHelper(logger, $"TIME {++count}")) { await next(context); } } ); app.UseEndpoints ( endpoints => { endpoints.MapGet ( "/", async context => { await context.Response.WriteAsync("Timing test."); } ); } ); } #endregion } } |
TestProject.zip