Metodika vývoje testovacích programů
Testování sedmi databází vyžadovalo napsání stejného množství jednoduchých testovacích programů. Bylo by také možné napsat jen jeden program a do něj zahrnout drivery pro jednotlivé databáze. Já jsem se rozhodl pro první variantu, protože je jednodušší.
Tyto testovací programy jsou z větší části stejné, liší se jen ve způsobu komunikace s vlastní databází. Je tedy možné vzít program s rozhraním NDBM a ten pak ručně doupravit pro příslušnou databázi. Tomuto způsobu programování se říká Copy and Paste. Problém nastane, pokud budeme chtít upravit něco ve společné části kódu. Bude nutné tyto změny provést v sedmi programech ručně, což je náročné na čas programátora. Lepší je použít nějaký version control systém.
U klasických version control systémů, jako je CVS nebo Subversion, je nejlepší nahrát do vcs jen základní program a úpravy pro jednotlivé databáze provádět jen v pracovních kopiích. Změny ve společné části pak stačí zakomitovat a pracovní kopie aktualizovat, což obě verze sloučí. V těchto systémech nedoporučuji si moc hrát s vytvářením a slučováním větví. Přináší to víc starostí než užitku.
Já jsem se rozhodl pro použití version control systému GNU Arch, který podobně jako BitKeeper nebo Darcs umožňuje velice pohodlné slučování změn (a to i obousměrné) mezi jednotlivými větvemi.
Test č. 1
Začneme čím jiným než vytvořením databáze. Budeme vkládat 70 tisíc záznamů o délce klíče 4 bajty a délce záznamu 40 bajtů, celem 3080000 bajtů dat. Kromě rychlosti budeme měřit i overhead způsobený řídícími záznamy databáze. Test byl prováděn 3×, vzal jsem nejlepší výsledek, což zmenší chybu měření.
Většina databází umožňuje při vytváření databáze použít uživatelem definovanou velikost stránky místo defaultní, která je obvykle jen 512 bajtů. Některé databáze umožňují také vypnout zamykání. Pokud jsou tyto volby možné, najdete databázi ve výsledcích dvakrát. Jednou s defaultním nastavením a podruhé s 4KB stránkou a bez zámků. Pod označením ndbm se skrývá db1 s tuningem, jenž se použije při přístupu pomocí ndbm api, které tuning db enginu standardně neumožňuje.
databáze | čas sec. | velikost souboru B | overhead velikosti databáze |
---|---|---|---|
ndbm | 16.841 | 7008256 | 2.27 |
db1 | 16.736 | 5005312 | 1.62 |
db1 def | 40.999 | 4997120 | 1.62 |
db4 def | 84.96 | 5160960 | 1.67 |
db4 | — | deadlock | — |
gdbm | 28.149 | 7024640 | 2.28 |
gdbm def | 36.480 | 6865776 | 2.22 |
qdbm | 16.271 | 5058460 | 1.64 |
qdbm def | 14.922 | 5072812 | 1.65 |
tdb | 7.263 | 5070848 | 1.65 |
tdbm def | 50.300 | 5054464 | 1.64 |
cdb | 0.652 | 4762048 | 1.55 |
puredb | 1.469 | 4201032 | 1.36 |
Databáze DB4.1 nebyla schopna test s 4K blokem dokončit, neboť skončila deadlockem sama se sebou. Podobné výkony vidíme i v operačních systémech Win 95/8, kde není neobvyklým jevem zařízení, které je v konfliktu samo se sebou.
Výsledky testu
Nejrychleji umějí vytvářet databázi tzv. konstatní databáze. V našem testu jsou zastoupeny cdb a puredb. U tdb databáze s vypnutým zamykáním můžeme hezky vidět, jak použití mmapu zefektivní výsledný program. QDBM byla jediná databáze s tak dobře nastavenými defaulty, že dosáhla s 4K stránkou horšího výsledku. Za zmínku stojí i fakt, že pokud k db1 přistupujete přes db1 native api, jsou db1 defaulty nastaveny velmi špatně. Komerční vývojáře jistě potěší fakt, že nejrychlejší databáze jsou jim licenčně nakloněny. Tdb s mmapem je mimo hru, neb OS WinDos stejně není mmapem podporován. Dále vidíme, že data po vložení do databáze nabobtnají zhruba v poměru 1.6; u SQL databázových serverů je tento poměr trošku vyšší – zhruba 2.1.
Test č. 2
V dalším testu budeme všecha uložená data přepisovat, a to hned třikrát. Poprvé přepíšeme data jinými o stejné délce. V ideálním případě bychom neměli pozorovat žádný nárůst velikosti db a tato operace by měla být z přepisových operací nejrychlejší.
databáze | čas | velikost souboru | změna velikosti |
---|---|---|---|
ndbm | 23.477 | 7008256 | 0 |
db1 | 16.031 | 5005312 | 0 |
db1 default | 38.720 | 4997120 | 0 |
db4 default | 72.59 | 5160960 | 0 |
gdbm | 33.356 | 7024640 | 0 |
gdbm default | 39.504 | 6865776 | 0 |
qdbm | 18.131 | 5058460 | 0 |
qdbm default | 16.459 | 5072812 | 0 |
tdb | 3.219 | 5070848 | 0 |
tdb default | 22.582 | 5054464 | 0 |
cdb | 0.652 | 4762048 | 0 |
puredb | 1.469 | 4201032 | 0 |
Přepis všech původních dat daty o poloviční délce. Tato operace by měla být pro databázi náročnější, neboť je potřeba přidat uvolněné místo do free listu. Zdaleka ne všechny databáze to však dělají, některé na to kašlou, a tak, pokud přepíšete záznam záznamem o kratší délce, zbylé volné místo zůstane již dále nevyužito. Také by se mohl celkový soubor zmenšit – to však nedělá žádná mně známá databáze.
databáze | čas | velikost souboru | změna velikosti |
---|---|---|---|
ndbm | 23.752 | 7008256 | 0 |
db1 | 15.569 | 5005312 | 0 |
db1 default | 37.056 | 4997120 | 0 |
db4 default | 72.37 | 5160960 | 0 |
gdbm | 36.635 | 7024640 | 0 |
gdbm default | 42.667 | 7708668 | 0 |
qdbm | 17.802 | 5058460 | 0 |
qdbm default | 16.805 | 5072812 | 0 |
tdb | 3.771 | 5070848 | 0 |
tdb default | 22.950 | 5054464 | 0 |
cdb | 0.482 | 3362048 | –29 % |
puredb | 1.102 | 2801032 | –33 % |
Výsledky tohoto testu ukázaly, že přepis kratšími daty databázi znatelněji nezatěžuje. Výsledná velikost souboru se snížila jen u konstatních databází. Tyto databáze neumějí soubor s daty aktualizovat – místo aktualizace ho znovu vytvoří, tuto operaci zvládají mnohem rychleji než klasické databáze.
Přepis všech záznamů daty o dvojnásobné velikosti. Zde bych za nejzajímavější údaj označil změnu výsledné velikosti souboru.
databáze | čas | velikost souboru | nárůst velikosti v % |
---|---|---|---|
ndbm | 30.979 | 8908800 | 27 |
db1 | 36.584 | 10358784 | 106 |
db1 default | 74.94 | 10108928 | 102 |
db4 default | 2:55.35 | 10502144 | 103 |
gdbm | 43.174 | 13082708 | 86 |
gdbm default | 51.077 | 13197392 | 71 |
qdbm | 25.690 | 12898460 | 154 |
qdbm default | 24.411 | 12912812 | 154 |
tdb | 17.939 | 8986624 | 77 |
tdb default | 2:24.62 | 8970240 | 77 |
cdb | 1.126 | 7562048 | 58 |
puredb | 2.183 | 7001032 | 66 |
V závěrečném dílu se podíváme na rychlost čtení a na práci s poškozenými datovými soubory.