Několikrát denně si programátor musí položit otázku:"Rychle napsaný nebo rychlý kód?" Ta to otázka trápí skoro všechny, ale je tragické, když lenost vyhraje i tam, kde programátor pomalu ani prstem hnout nemusí… Jedním z příkladů je volání metod BeginUpdate a EndUpdate u komponent jako ListBox, ListView,… I když se jedná o pouhé dva řádky na víc, tak často v cizích tak i mých zdrojových kódech chybí.

Přidání prvku do kolekce Items metodou Add způsobí překreslení celé komponenty a tím zpomalení aplikace a vzniku nežádoucího grafického efektu.

Zabránit tomu můžeme několika způsoby:

  1. Před plněním kolekce Items metodou Add zavolat BeginEdit a po skončení EndEdit. Volání metod způsobí, že se komponenta při přidávání prvků nebude překreslovat.
  2. Inicializovat kolekci Items před zobrazením na formuláři. Například po vykonání InitializeComponent v konstruktoru formuláře.
  3. Použít metodu AddRange kolekce Items, kdy dojde k překreslení až po přidání všech prvků.

Poslední dva způsoby, když budu pesimista, se běžně používají v 75 procentech případů, takže žádný problém ani nevznikne. První způsob, kdy je komponenta zobrazena na formuláři a nové prvky se přidávají metodou Add,může způsobit nechtěný efekt při vynechání volání (Begin/End)Edit. Než teoretizovat nad nutností volání těchto metod bude lepší, když si ukážeme konkrétní čísla.

Do testu jsme zařadili komponenty ListBox a ListView, kde se měřil čas potřebný pro vyčištění a následovné přidání daného množství prvků do kolekce Items. Pro každé množství se test opakoval stokrát, aby čísla byla co nejpřesnější. U ListView byla vlastnost View nastavena na LargeIcon.

1. Naměřené hodnoty ListBox

2. Naměřené hodnoty ListView

Zajímavější budou procentuelní zisk (Begin/End)Edit.

3. Procentuelní rozdíl ListBox

4. Procentuelní rozdíl ListView

Výsledky dopadly podle očekávání. Zajímavostí je 22 procentní ztráta (0,02 ms) u ListBoxu při vložení jednoho prvku při použití (Begin/End)Edit, která je pravděpodobně způsobený režii těchto metod, ale rozdíl v milisekundách je tak zanedbatelný, že když ze zvyku použijeme (Begin/End)Edit, tak se nic nestane. U ListBoxu nepřekročil rozdíl času na vkládání 60 ms ani u 1024 prvků a to nepředstavuje žádnou závratnou ztrátu. Výsledky u ListView jsou daleko zásadnější, protože procentuelní zisk není pro větší množství prvků konstantní jako u ListBoxu, ale stále stoupá a už u 128 prvků je rozdíl 70 ms (63 % zisk) a to nemluvě o 1024 prvcích, kde je rozdíl skoro 900 ms a nárůst výkonu je 74 procent. Samozřejmě že 512 a 1024 prvků je dost nadsazené množství, které se v běžné aplikaci jen tak neobjeví.

Z výsledků jasně vyplývá, že použití (Begin/End)Edit, přináší podstatný výkonnostní zisk, který stojí za to vyžít.

Doufám, že začátečníci již budou vědět, k čemu slouží metody (Begin/End)Edit a ostatní si uvědomí, jak velký výkonnostní rozdíl přináší použití těchto metod.

// Měřeno na průměrném PC s P4 2,4 GHz a 1 GB RAM. Testovací aplikace byla zkompilována jako Release a časy byly měřeny pomocí Stopwatch.

Linkuj.cz!