내용으로 건너뛰기
Optimizing XamDataGrid Performance Using External Data Operations

Optimizing XamDataGrid Performance Using External Data Operations

많은 LOB(기간 업무) 애플리케이션에서 풍부한 기능 세트, 높은 사용자 지정 가능성 및 성능을 위해 XamDataGrid를 사용합니다.

7min read

모든 산업에서 XamDataGrid의 사용이 지속적으로 발전해 왔다면 바로 XamDataGrid에 표시되는 데이터의 양이 증가하고 있다는 것입니다. 일반적으로 그리드 컨트롤은 UI 스레드에서 자체적으로 정렬, 필터링 및 그룹화와 같은 데이터 작업을 수행합니다. 그러나 데이터 로드가 증가함에 따라 개발자는 별도의 스레드 또는 완전히 다른 컴퓨터에서 이러한 작업을 수행할 수 있는 방법을 찾고 있습니다. 이것이 개발자들이 XamDataGrid가 이러한 작업의 인수를 전달하고 이 작업을 수행하지 않고 처리된 결과를 표시하도록 요청한 이유입니다. 12.1 릴리스에 이 기능이 추가되었으며, 이를 통해 대규모 데이터 세트가 XamDataGrid에 바인딩될 때 성능을 크게 개선할 수 있었습니다. 이 블로그 게시물에서는 이 기능을 활용하는 방법을 설명하고 메모리 공간 및 작업을 수행하는 데 걸리는 시간 측면에서 성능에 미치는 영향을 설명합니다.

데이터 조작의 오프그리드 처리를 활성화하는 방법을 보여주고, 내부 및 외부 작업이 사용되는 두 사례에서 동일한 데이터 세트에 바인딩된 XamDataGrid의 성능을 비교하는 샘플 프로젝트를 다운로드하세요. 이 프로젝트는 Visual Studio 2010 및 .NET Framework 4를 사용하여 빌드됩니다. 12.1 WPF 제품의 평가판을 사용하므로 추가 다운로드 없이 빌드하고 실행할 수 있습니다. XamDataGrid가 포함된 NetAdvantage for WPF 제품의 모든 기능을 사용할 수 있는 30일 무료 평가판을​ ​사용할 수 있습니다. 다음은 샘플 프로젝트의 스크린샷입니다.

샘플에 포함된 내용

샘플 응용 프로그램에는 두 개의 XamDataGrid가 나란히 있으며, 왼쪽은 내부 작업을 사용하고 오른쪽은 CollectionView 개체를 통해 이러한 작업을 수행합니다. 두 그리드 모두 100,000개의 레코드가 포함된 데이터 세트에 바인딩됩니다. 내부 또는 외부 작업으로 인한 성능 차이를 설명하기 위해 정렬 및 그룹화의 성능을 비교합니다. 그러나 정확히 동일한 결과가 필터링 및 요약 계산에도 적용됩니다.

내부 정렬/그룹 사용의 성능 영향

기본적으로 XamDataGrid는 데이터 세트의 모든 레코드와 달리 현재 표시되는 데이터 항목을 나타내는 레코드 개체만 만듭니다. 그러나 XamDataGrid에서 내부적으로 정렬/그룹화 작업을 수행하는 경우 정렬/그룹화할 수 있도록 데이터 세트의 모든 항목을 나타내는 레코드 개체를 만들어야 합니다. XamDataGrid UI 가상화 논리로 인해 이러한 모든 레코드에 대해 UI 요소가 생성되지 않더라도 레코드 개체는 특히 XamDataGrid에 바인딩된 데이터 세트가 큰 경우 애플리케이션의 메모리 공간에 상당한 영향을 미칠 수 있습니다(아래 성능 비교에서 볼 수 있음). 그렇다면 이것이 성능에 어떤 영향을 미칠까요? 사용자가 그리드를 처음 정렬/그룹화할 때 XamDataGrid가 모든 데이터 항목에 대한 레코드 개체를 만든 다음 사용자가 요청한 작업을 수행하는 동안 지연이 있습니다. 이렇게 하면 XamDataGrid에서 관리하는 레코드 개체 측면에서 전체 데이터 세트가 메모리에 배치됩니다. 이렇게 하면 메모리 사용량이 증가하고 이러한 작업이 처음 실행될 때 지연이 발생하지만 전체 데이터 세트가 이미 메모리에 있기 때문에 후속 정렬/그룹화 작업은 매우 빠릅니다.

이것이 성능에 어떤 영향을 미치는지 살펴보겠습니다. 샘플을 실행하고 XamDataGrid를 정렬하거나 그룹화하십시오 – 왼쪽에서 시간 및 메모리 공간 변경(델타)이 보고된 것을 볼 수 있습니다. 내 컴퓨터에서 내부 작업 그리드를 처음 정렬하면 작업에 4.3초가 걸리고 메모리 사용량이 40MB 증가합니다. 후속 정렬에는 약 1초가 걸리고 메모리 사용량은 동일하게 유지됩니다(이미 최대값이므로 모든 데이터 항목이 레코드 개체로 표시됨). 데이터 세트가 이미 완전히 로드되면 그룹화하는 데 약 2.8초가 걸리고 그룹을 해제하는 데 1.2초가 걸립니다.

외부 정렬/그룹 사용의 성능 영향

SortEvaluationMode, GroupByEvaluationMode, FilterEvaluationModeSummaryEvaluationMode 속성을 사용하여 정렬, 그룹화, 필터링 및 요약 계산을 수행하는 방법을 제어할 수 있습니다. 내부 정렬, 그룹화, 필터링 및 요약 계산을 비활성화하고 수동으로 또는 CollectionView 개체를 통해 수행할 수 있는 기능을 제공합니다. 즉, 그리드는 전체 데이터 세트를 나타내기 위해 레코드 개체를 초기화할 필요가 없으며, 대신 백엔드에 의존하여 데이터 세트를 재정렬합니다. 컬렉션 뷰를 사용하는 경우(위의 속성을 "UseCollectionView"로 설정하여) 추가 논리를 구현할 필요가 없습니다. 그러나 계산/순서 변경이 수행되는 백엔드 서버가 있는 경우 위의 속성에 대해 수동 설정을 사용할 수 있습니다. 이렇게 하면 XamDataGrid가 Sorting / Grouping / RecordFilterChanging 이벤트를 발생시켜 계산이 수행되는 백엔드에 전달할 수 있습니다. XamDataGrid는 백 엔드에서 처리되면 재정렬된 데이터 세트를 표시합니다.

정렬/그룹화에 UseCollectionView 및 Manual 설정을 사용하면 XamDataGrid에서 전체 데이터 세트에 대한 레코드 개체를 인스턴스화할 필요가 없으므로 메모리 사용량이 지속적으로 낮게 유지됩니다. 성능의 시간 구성 요소는 이러한 작업을 처리하는 데 사용하는 백 엔드에 달려 있습니다. 이 샘플의 오른쪽 XamDataGrid에서 내부 논리 대신 CollectionView 개체를 사용하여 이러한 작업을 처리합니다.

이 경우 성능은 어떻습니까? 샘플을 실행하고 XamDataGrid를 정렬하거나 그룹화하십시오 – 시간 및 메모리 공간 변경 사항이 바로 위에 보고됩니다. 정렬 및 그룹화가 collectionView에 의해 수행되는 경우(SortEvaluationMode 및 GroupByEvaluationMode 속성의 UseCollectionView 값 사용) 메모리 공간은 동일하게 유지되며 소요 시간은 정렬 2.5초, 그룹화 4.9초, 그룹 해제 2.5초와 같습니다. 여기서 언급해야 할 세 가지 사항이 있습니다.

1. 정렬/그룹화로 인해 추가 레코드 개체가 인스턴스화되지 않기 때문에 메모리 사용량이 일정하게 유지됩니다.

2. 정렬 / 그룹화에 걸리는 시간은 일정합니다, 즉 첫 번째 정렬 / 그룹을 수행 할 때 큰 지연이 없습니다 (레코드 객체 초기화로 인해 내부 작업이 사용되는 경우와 같이)

3. 내부 작업을 사용하는 경우 정렬/그룹화하는 데 걸리는 시간이 동일한 작업을 수행하는 데 걸리는 시간보다 큽니다. 그러나 성능의 시간 측면은 전적으로 이러한 작업에 사용하려는 백 엔드에 달려 있습니다. 그럼에도 불구하고 collectionView 객체를 사용하면 메모리 사용량이 적고 최초 정렬/그룹 성능이 좋으며(내부 작업의 경우 작업을 처음 수행할 때 추가 지연이 있음) 경우에 따라 유용할 수 있습니다.

Summary Calculations

기본 내부 요약 계산에서는 그리드가 전체 데이터 세트를 나타내기 위해 레코드 개체를 초기화해야 합니다. SummaryEvaluationMode 속성을 사용하면 Linq를 사용하거나 수동으로 요약 계산을 수행할 수도 있습니다. Linq를 사용하려면 추가 구현이 필요하지 않지만 수동 계산 모드를 사용하려면 자체 평가 논리를 수행하고 요약 결과에 대한 값을 제공할 수 있는 QuerySummaryResult 이벤트를 처리해야 합니다. 수동 모드를 사용하면 메모리 사용량을 낮게 유지할 수 있으며 백엔드를 최적화하여 계산 시간을 최대한 개선할 수 있습니다.

요약

이번 블로그 포스트에서는 XamDataGrid를 설정하여 외부에서 정렬/그룹화/필터링/요약 계산을 수행하는 방법을 소개했습니다. 이 용도로 사용할 API에 대해 설명하고 외부 작업을 사용할 경우 성능에 미치는 영향을 살펴보았습니다. 샘플 프로젝트를 사용하면 두 시나리오 간의 차이점을 쉽게 보여 줄 수 있으며, 사용자 고유의 데이터를 바인딩할 때 볼 수 있는 성능 향상을 확인할 수 있도록 쉽게 변경할 수 있습니다. 수동 모드를 사용하면 애플리케이션을 실행하는 클라이언트 컴퓨터의 하드웨어에 의해 지금까지 부과된 정렬/그룹화/필터링/요약에 대한 제한을 근본적으로 제거할 수 있습니다 - 강력한 계산 백엔드 컴퓨터를 사용하는 것이 빠르고 반응이 빠른 UI를 제공하면서 대규모 데이터 세트를 효율적으로 처리하는 가장 좋은 방법입니다. 먼저 응용 프로그램 사용자와 대화하고 결정을 내리는 데 도움이 되는 더 많은 양의 데이터가 표시되는 이점을 볼 수 있는 뷰에 대해 알아볼 수 있습니다. 이러한 문제에 대해 알게 되면 XamDataGrid는 더 많은 데이터를 표시하려는 사용자의 갈망을 충족시키는 동시에 탁월한 사용자 경험을 제공하는 데 도움이 될 것입니다.

데모 요청