WinForms ListView에 수천 (예 : 53,709) 항목을 추가하고 있습니다.
시도 1 :13,870 ms
foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
listView.Items.Add(item);
}
이것은 매우 나쁘게 실행됩니다. 분명한 첫 번째 해결 방법은 BeginUpdate/EndUpdate
.
시도 2 :3,106 ms
listView.BeginUpdate();
foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
listView.Items.Add(item);
}
listView.EndUpdate();
이것은 더 좋지만 여전히 너무 느립니다. ListViewItems 생성과 ListViewItem 추가를 분리하여 실제 원인을 찾아 보겠습니다.
시도 3 :2,631 ms
var items = new List<ListViewItem>();
foreach (Object o in list)
{
ListViewItem item = new ListViewItem();
RefreshListViewItem(item, o);
items.Add(item);
}
stopwatch.Start();
listView.BeginUpdate();
foreach (ListViewItem item in items)
listView.Items.Add(item));
listView.EndUpdate();
stopwatch.Stop()
실제 병목 현상은 항목을 추가하는 것입니다. AddRange
대신 a 로 변환 해 봅시다 .foreach
시도 4 : 2,182 ms
listView.BeginUpdate();
listView.Items.AddRange(items.ToArray());
listView.EndUpdate();
조금 더 나은. 병목 현상이 없는지 확인합시다.ToArray()
시도 5 : 2,132 ms
ListViewItem[] arr = items.ToArray();
stopwatch.Start();
listView.BeginUpdate();
listView.Items.AddRange(arr);
listView.EndUpdate();
stopwatch.Stop();
제한은 목록보기에 항목을 추가하는 것 같습니다. 의 다른 오버로드 AddRange
일 수 있습니다. 여기서 ListView.ListViewItemCollection
배열 이 아닌를 추가합니다.
시도 6 : 2,141 ms
listView.BeginUpdate();
ListView.ListViewItemCollection lvic = new ListView.ListViewItemCollection(listView);
lvic.AddRange(arr);
listView.EndUpdate();
글쎄요.
이제 스트레칭 할 시간입니다.
1 단계 - "자동 너비"로 설정된 열이 없는지 확인합니다 .
검사
2 단계 -ListView가 항목을 추가 할 때마다 항목을 정렬하지 않는지 확인합니다.
검사
3 단계 -stackoverflow에 질문 :
검사
참고 : 분명히이 ListView는 가상 모드가 아닙니다. 가상 목록보기에 항목을 "추가"할 수 없거나 할 수 없기 때문입니다 (를 설정 VirtualListSize
). 다행히도 내 질문은 가상 모드의 목록보기에 관한 것이 아닙니다.
목록보기에 항목을 추가하는 것이 너무 느려서 누락 된 것이 있습니까?
보너스 채터
Windows ListView 클래스가 더 잘할 수 있다는 것을 알고 있습니다.에서 코드를 작성할 수 있기 때문입니다 394 ms
.
ListView1.Items.BeginUpdate;
for i := 1 to 53709 do
ListView1.Items.Add();
ListView1.Items.EndUpdate;
동등한 C # 코드와 비교할 때 1,349 ms
:
listView.BeginUpdate();
for (int i = 1; i <= 53709; i++)
listView.Items.Add(new ListViewItem());
listView.EndUpdate();
훨씬 더 빠릅니다.
WinForms ListView 래퍼의 어떤 속성이 누락 되었습니까?