2015-01-16 9 views
2

У меня есть CListCtrl с 10000 записями, которые заполняются при запуске программы и время этой операции составляет ~ 1,3 сек. Но если пользователь обновляет список, он заполняется через ~ 2,5-3 с.Разное время выполнения CListCtrl :: InsertItem на том же количестве записей

В обоих случаях работает один и тот же кусок кода:

SetRedraw(FALSE); 
SetItemCount(nCount); 

// insert 

SetRedraw(TRUE); 

Переменная nCount равно 0, когда запускается программа и 10000, когда пользователь обновляет список.

Почему время заполнения списка настолько отличается?

UPD: минимальный код

void CTestList::Init() 
{ 
    InsertColumn(0, _T("Number"), 0, 50); 
    InsertColumn(1, _T("Obj name"), 0, 150); 
    InsertColumn(2, _T("Creator"), 0, 100); 
    InsertColumn(3, _T("Editor"), 0, 100); 
} 

void CTestList::Reset() 
{ 
    LVITEM item; 

    item.iItem = 0; 
    for (int i = 0; i < 10000; i++) 
    { 
     InsertRow(item, i); 
     item.iItem++; 
    } 
} 

void CTestList::InsertRow(LVITEM& item, int num) 
{ 
    CString strNum; 

    // 
    item.iSubItem = 0; 
    item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; 
    item.lParam = NULL; 
    item.iImage = 0; 

    strNum.Format(_T("%d"), num); 
    item.pszText = (LPTSTR)(LPCTSTR)strNum; 
    InsertItem(&item); 

    // 
    item.mask = LVIF_TEXT; 
    item.iSubItem = 1; 
    item.pszText = _T("Test object"); 
    SetItem(&item); 

    // 
    item.mask = LVIF_TEXT; 
    item.iSubItem = 2; 
    item.pszText = _T("Any one"); 
    SetItem(&item); 

    // 
    item.iSubItem = 3; 
    item.pszText = _T("Another one"); 
    SetItem(&item); 
} 

void CApp::FillList() 
{ 
    CWaitCursor wait; 

    m_list.DeleteAllItems(); 

    clock_t begin = clock(); 
    m_list.SetRedraw(FALSE);  
    m_list.SetItemCount(nCount); 
    m_list.Reset(); 
    m_list.SetRedraw(TRUE); 
    clock_t end = clock(); 

    double dif = static_cast<double>(end - begin)/CLOCKS_PER_SEC; 

    CString str; 

    str.Format(_T("Insertion time: %f"), dif); 
    AfxMessageBox(str); 
} 
+1

Было бы очень полезно, если бы вы могли предоставить * минимальный *, воспроизводимый образец кода. – csl

+1

В зависимости от типа элемента, который должен иметься в списке, может потребоваться сначала уничтожить все элементы, прежде чем нажимать новые. – RedX

+0

@csl подождать, я сделаю это – brightside90

ответ

2

Я проверил ваш код на моей машине. Я могу воспроизвести различные тайминги только в том случае, если я запускаю программу в отладчике (используя F5), но нет, если я запустил ее без отладчика (используя Ctrl + F5). Таким образом, это, похоже, не напрямую связано с вашим кодом или Windows API, а с отладчиком.

+0

Я запустил этот код в отладчике и в выпуске, а также заметил, что режим выпуска намного быстрее, чем отладчик. Но это не решение. В обоих случаях разница в времени выполнения между первым заполнением списка и последующим значительна. – brightside90

+0

@ brightside90: Я не говорил о debug/release, только о подладчике и без отладчика. На моей машине не было другого времени, когда вы не запускали программу без отладчика. Возможно, есть еще какое-то другое ограничение или какой-то другой соответствующий код, который вы не опубликовали в своем вопросе !? –

+0

Вы правы. Это было мое упущение :(Я пытался запустить программу только в режиме отладки/выпуска, и такая мысль, как «Как насчет запуска программы без использования каких-либо режимов?» Никогда не была в моей голове :(Спасибо, @ Werner Henze Теперь я получаю приблизительно равные тайминги каждый раз, когда запускаю программу и обновляю список. – brightside90