앱 성능 계획 및 측정

사용자는 앱이 응답성을 유지하고, 자연스럽게 느껴지며, 배터리를 소모하지 않기를 기대합니다. 기술적으로 성능은 비기능적 요구 사항이지만 성능을 기능으로 처리하면 사용자의 기대치를 충족하는 데 도움이 됩니다. 목표를 지정하고 결과를 측정합니다. 이것이 핵심 요소입니다. 성능에 중요한 시나리오를 결정하고, 좋은 성능의 의미를 정의한 다음, 프로젝트의 수명 주기 동안 초기 및 자주 측정하여 목표를 달성할 수 있도록 합니다.

목표 지정

사용자 환경은 좋은 성능을 정의하는 기본적인 방법입니다. 앱의 시작 시간은 사용자의 성능 인식에 영향을 줄 수 있습니다. 사용자는 1초 미만의 앱 시작 시간이 우수하고, 5초 미만이 양호하고, 5초보다 크면 좋지 않은 것으로 간주할 수 있습니다.

다른 메트릭은 메모리와 같은 사용자 환경에 덜 명백한 영향을 미칩니다. 일시 중단되거나 비활성 상태인 동안 앱이 종료될 가능성은 활성 앱에서 사용하는 메모리 양으로 증가합니다. 높은 메모리 사용량은 시스템의 모든 앱에 대한 환경을 저하하므로 메모리 사용 목표를 갖는 것이 합리적입니다.

구체적이고 측정 가능한 초기 목표를 설정합니다. 세 가지 범주로 분류되어야 합니다.

  • 시간 - 사용자 또는 앱이 작업을 완료하는 데 걸리는 시간
  • 유동성 - 사용자 상호 작용에 대한 응답으로 앱이 자신을 다시 그리는 속도 및 연속성
  • 효율성 - 앱이 배터리 전원을 포함하여 시스템 리소스를 얼마나 절약하는지

시간

사용자가 작업을 완료하는 데 허용되는 경과 시간 범위(상호 작용 클래스)를 생각해 보세요.

상호 작용 클래스 사용자 인식 Ideal 최대 예제
빠름 거의 눈에 띄지 않는 지연 100ms 200 ms 앱 바를 표시한 다음 단추를 누릅니다(첫 번째 응답)
일반적인 빠르지만 빠르지는 않음 300ms 500ms 크기 조정; 시맨틱 확대/축소
반응형 빠르지는 않지만 반응성이 있는 느낌 500ms 1초 다른 페이지로 이동합니다. 앱 다시 시작
Launch 경쟁력 있는 환경 1초 3초 처음으로 앱 시작
지속적 응답성이 더 이상 느껴지지 않음 500ms 5초 인터넷에서 파일 다운로드
포로 Long; 사용자가 전환할 수 있음 500ms 10초 스토어에서 여러 앱 설치

앱의 성능 시나리오에 상호 작용 클래스를 할당합니다. 각 시나리오에 대해 앱의 지정 시간 참조, 사용자 환경의 일부 및 상호 작용 클래스를 할당합니다.

유동성

앱의 특정 측정 가능한 유동성 목표에는 다음이 포함될 수 있습니다.

  • 화면 다시 그리기 중지 및 시작 없음(결함)
  • FPS(초당 60프레임)로 렌더링되는 애니메이션
  • 사용자가 이동하거나 스크롤하면 앱은 초당 3~6페이지의 콘텐츠를 표시합니다.

Efficiency

앱의 특정 측정 가능한 효율성 목표에는 다음이 포함될 수 있습니다.

  • 앱의 CPU 백분율이 대상 값 이하이고 메모리 사용량(MB)은 항상 대상 이하입니다.
  • 앱이 비활성 상태이면 CPU 및 메모리 사용이 최소화됩니다.
  • 배터리 전원에서 대상 시간 동안 앱을 적극적으로 사용할 수 있습니다.

성능을 위해 앱 디자인

성능 목표를 사용하여 앱 디자인에 영향을 줍니다. 다음 측면을 고려합니다.

UI (사용자 인터페이스)

  • XAML 태그를 최적화하여 각 페이지의 구문 분석 및 로드 시간 및 메모리 효율성을 최대화합니다. 필요할 때까지 UI 및 코드 로드를 연기합니다.
  • ListViewGridView의 경우 모든 항목의 크기를 동일하게 하고 가능한 한 많은 최적화 기법을 사용하세요.
  • 코드에서 명령적으로 생성하는 대신 태그에서 UI를 선언합니다.
  • 사용자가 x:Load 특성을 사용해야 할 때까지 UI 요소 만들기를 지연합니다.
  • 스토리보드 애니메이션에 테마 전환 및 애니메이션을 사용하는 것이 좋습니다. 스토리보드 애니메이션은 화면에 대한 지속적인 업데이트가 필요하며 CPU 및 그래픽 파이프라인을 활성 상태로 유지합니다.
  • 이미지는 표시되는 화면에 맞는 크기로 로드합니다.

CPU, 메모리 및 전원

  • 우선순위가 낮은 작업은 우선순위가 낮은 스레드에 예약하세요. 비동기 프로그래밍DispatcherQueue 클래스를 참조하세요.
  • 필요하지 않은 경우 고가의 리소스(예: 미디어)를 해제하여 앱의 메모리 공간을 최소화합니다.
  • 가능하면 이벤트 처리기를 등록 취소하고 UI 요소를 역참조하여 메모리 누수 방지
  • 배터리 효율성을 위해 데이터를 폴링하거나, 센서를 쿼리하거나, 유휴 상태일 때 CPU에서 작업을 예약하는 빈도에 대해 보수적이어야 합니다.

데이터 액세스

  • 가능하면 콘텐츠를 프리페치합니다.
  • 액세스 비용이 많이 드는 콘텐츠를 캐시합니다.
  • 캐시 누락의 경우 앱이 여전히 콘텐츠를 로드하고 있음을 나타내는 자리 표시자 UI를 가능한 한 빨리 표시합니다.

성능을 위한 계측

코딩할 때 앱이 실행되는 동안 특정 지점에서 메시지와 이벤트를 기록하는 코드를 추가합니다. 나중에 Windows 성능 레코더 및 Windows 성능 분석기(둘 다 Windows Performance Toolkit 포함)와 같은 프로파일링 도구를 사용하여 앱의 성능에 대한 보고서를 만들고 봅니다.

Windows 풍부한 이벤트 로깅 및 추적 솔루션을 제공하는 ETW(event Tracing for Windows)에서 지원되는 로깅 API를 제공합니다. Windows.Foundation.Diagnostics 네임스페이스의 API에는 FileLoggingSession, LoggingActivity, LoggingChannel, LoggingSession 클래스가 포함됩니다.

// using Windows.Foundation.Diagnostics;

LoggingChannel myLoggingChannel = new LoggingChannel("MyLoggingChannel");
myLoggingChannel.LogMessage("Here's my logged message.", LoggingLevel.Information);

일정 기간 동안 시작 및 중지 이벤트를 기록하려면 다음을 수행합니다.

LoggingChannel myLoggingChannel = new LoggingChannel("MyLoggingChannel");
LoggingActivity myLoggingActivity;

using (myLoggingActivity = new LoggingActivity("MyLoggingActivity", myLoggingChannel))
{
    // A start event is logged when the activity begins.
    // Add code here to do something of interest.
}
// An end event is logged when the activity ends.

성능 목표에 대한 테스트 및 측정

다음 기법과 도구를 사용하여 앱이 성능 목표를 얼마나 충족하는지 테스트하세요:

  • 데스크톱, 노트북, 울트라북 및 태블릿을 비롯한 다양한 하드웨어 구성에 대해 테스트합니다.
  • 다양한 화면 크기에 대해 테스트합니다. 더 넓은 화면은 성능에 부정적인 영향을 줄 수 있는 더 많은 콘텐츠를 표시합니다.
  • 가능한 한 많은 테스트 변수를 제거합니다.
    • 테스트 디바이스에서 백그라운드 앱을 끕니다.
    • 테스트 디바이스에 배포하기 전에 릴리스 구성에서 앱을 빌드합니다.
    • 임의 테스트 변수를 제거하고 일관된 측정을 보장하기 위해 앱을 여러 번 실행합니다.
  • 전원 가용성을 줄이는지 테스트합니다. 사용자의 디바이스는 개발 머신보다 훨씬 적은 전력을 가질 수 있습니다.
  • Visual Studio 진단 도구 및 Windows 성능 분석기 같은 도구를 조합하여 앱 성능을 측정합니다.

성능 테스트 결과에 응답

성능 테스트 결과를 분석한 후 변경이 필요한지 확인합니다.

  • 앱 디자인 결정을 변경하거나 코드를 최적화해야 하나요?
  • 코드에서 계측을 추가, 제거 또는 변경해야 하나요?
  • 성능 목표를 수정해야 하나요?

변경이 필요한 경우 변경 내용을 확인하고 계측 또는 테스트로 돌아갑니다.

Optimize

앱에서 성능에 중요한 코드 경로(가장 많은 시간이 소요되는 경로)만 최적화합니다. 프로파일링은 이러한 영역을 알려줍니다. 종종 가장 높은 최적화에서 수행되는 좋은 디자인 사례와 코드 간에 장차가 있습니다. 성능이 문제가 되지 않는 영역에서 개발자 생산성과 우수한 소프트웨어 디자인의 우선 순위를 지정합니다.