본문으로 건너뛰기
로그인 둘러보기
개발·코딩·데이터베이스 · 윈도우즈 유틸

Sundial

0

Sundial은 JaCraig가 개발한 .NET용 코드 프로파일링 라이브러리입니다. 이 도구는 코드의 속도와 메모리 사용량을 측정하고 결과를 HTML 형식으로 출력하여 성능 분석을 지원합니다.

.NET 라이브러리Canister 통합HTML 리포트NuGet 패키지성능 분석성능 측정코드 프로파일링

소개

Sundial은 JaCraig가 개발한 .NET용 코드 프로파일링 라이브러리입니다. 이 도구는 코드의 속도와 메모리 사용량을 측정하고 결과를 HTML 형식으로 출력하여 성능 분석을 지원합니다. Canister 라이브러리와 통합되어 IoC 컨테이너를 통해 초기화되며, NuGet 패키지 'Sundial.Core'로 제공됩니다. 현재 이 프로젝트는 아카이브 상태이며, BenchmarkDotNet 사용을 권장하고 있습니다.

상세정보

코드 프로파일링

Sundial은 두 가지 방식으로 코드 프로파일링을 지원합니다. 첫 번째 방법은 Profiler.StartProfiling()을 호출하여 프로파일링을 시작하고, TestObject.Profile("Description")을 사용하여 특정 코드 블록을 측정하는 것입니다. 각 블록은 IDisposable를 반환하며, 블록이 종료될 때 해당 섹션의 프로파일링이 중지됩니다. Profiler.StopProfiling(false)를 호출하면 모든 프로파일링 결과를 포함한 IProfilerResult 객체를 반환받습니다.

코드 비교 기능

두 번째 방법은 TimedTaskRunner을 사용하여 ITimedTask 인터페이스를 구현한 클래스들을 자동으로 찾아 실행하고 비교하는 것입니다. 이 방식은 시리즈 단위로 작업을 그룹화하여 반복 횟수와 내보내기 형식(콘솔, HTML 등)을 지정할 수 있게 합니다. 예를 들어, [Series("Deserialization", 1000, "Console", "HTML")] 특성을 붙인 클래스는 1000번 실행되어 콘솔과 HTML 파일로 결과를 내보냅니다.

분석기 및 내보내기 확장

사용자는 IAnalyzer 인터페이스를 상속받아 커스텀 분석기를 만들 수 있으며, 예를 들어 median 시간과 95th 퍼센타일 시간을 비교하는 MaxSpeedAnalysis와 같은 분석기를 추가할 수 있습니다. 마찬가지로 IExporter를 상속받아 콘솔, 파일 등 다양한 형식으로 결과를 내보내는 내보내기 모듈을 만들 수 있습니다. 이러한 분석기와 내보내기 모듈은 Canister.Builder.CreateContainer()에 어셈블리를 추가하고 RegisterSundial()를 호출하여 시스템에 등록해야 합니다.

다운로드·설치 방법

Sundial은 NuGet을 통해 Sundial.Core 패키지명으로 배포됩니다. 패키지 관리자 콘솔에서 다음 명령을 실행하여 설치할 수 있습니다:

Install-Package Sundial.Core

설치 후, 애플리케이션 시작 시 Canister 컨테이너를 설정하고 Sundial을 등록해야 합니다. 필수 초기화 코드는 다음과 같습니다:

Canister.Builder.CreateContainer(new List<ServiceDescriptor>())n .RegisterSundial()n .Build();

이후 프로파일링을 시작하거나 TimedTaskRunner을 사용하여 작업을 실행할 수 있습니다.

기본 사용법/명령어

개별 코드 블록 프로파일링 예시는 다음과 같습니다:

using (var TestObject = Profiler.StartProfiling())
{
    using (var MyChildProfiler = TestObject.Profile("Description of code block"))
    {
        using (var AnotherProfiler = TestObject.Profile("Description of sub code block"))
        {
            // 프로파일링 대상 코드
        }
    }
    using (var MyChildProfiler2 = TestObject.Profile("Description of second code block"))
    {
        // 두 번째 코드 블록 프로파일링
    }
}
var Result = Profiler.StopProfiling(false);

작업 비교를 위한 예시는 다음과 같습니다. 먼저 ITimedTask 인터페이스를 구현한 클래스를 정의합니다:

[Series("Deserialization", 1000, "Console", "HTML")]
public class JsonNetDeserialization : ITimedTask
{
    private const string Data = @"{ "BoolReference" : true, ... }";

    public bool Baseline => true;
    public string Name => "Json.Net";

    public void Dispose() { }

    public void Run()
    {
        JsonConvert.DeserializeObject(Data, typeof(TestObject), new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat });
    }
}

그리고 메인 함수에서 다음과 같이 실행합니다:

Canister.Builder.CreateContainer(new List<ServiceDescriptor>())
        .AddAssembly(typeof(Program).GetTypeInfo().Assembly)
        .RegisterSundial()
        .Build();
var Runner = Canister.Builder.Bootstrapper.Resolve<TimedTaskRunner>();
Runner.Run();
Console.ReadKey();

이 코드는 정의된 작업을 1000번 실행하고 결과를 콘솔과 HTML 파일로 내보냅니다.

지원 환경·시스템 요구사항

이 라이브러리를 빌드하려면 Visual Studio 2017이 필요합니다. 소스를 클론한 후 솔루션을 로드하여 빌드할 수 있습니다. 실행 환경은 .NET 프레임워크를 지원하는 Windows 시스템이며, Canister 라이브러리에 의존하므로 함께 설치되어야 합니다.

최신 버전·업데이트

현재 버전은 0.1.0이며, 추가적인 업데이트 내역은 제공되지 않습니다. GitHub 저장소의 master 브랜치가 최신 상태를 반영합니다.

제한 사항·확인 사항

이 프로젝트는 현재 아카이브 상태이며, 개발자는 더 이상 활발히 유지보수하지 않고 있습니다. README에 명시적으로 “이 프로젝트는 아카이브 중입니다. 이 시점에서 BenchmarkDotNet 사용을 권장합니다.”라고 밝히고 있습니다. 따라서 새로운 기능 추가나 버그 수정이 기대되지 않으며, 현대적인 .NET 성능 프로파일링 도구로의 전환을 고려하는 것이 좋습니다.

시스템 요구사항

별도의 시스템 요구사항이 등록되지 않았습니다.