Reference counted string v C++
Chtěl bych se s Vámi podělit o jednom velmi reálném měření z jedné “nejmenované” komerční aplikace. Je napsaná jak už asi tušíte v C++ hodně přes 2 miliony řádků. Pro práci se stringy tato aplikace používá vlastní implementaci na základě počítání počtu ukazatelů. Samotný string je tedy velký pouze jeden pointer. Pokud je ukazatel jen jeden, tak se chová na způsob .Netího StringBuilderu, jinak jako .Net string. Prázdný string má pak v sobě NULL. Aplikace to je více vláknová, proto musí být přičítání a odečítání počtu ukazatelů atomické. No ale taky lze tato aplikace pustit tak, že má potřebuje pouze jedno vlákno. Proto není od věci zkusit co by provedlo nahrazení atomických operací obyčejnými.
Testy proběhly na 64bit Vistách, kompilátor je MSVC 2005, procesor pak přetaktované obstarožní Core2Duo E6400. InterlockedIncrement i InterlockedDecrement jsou intrinsic (tzn. že je nativně kompilátor zná a přímo vkládá jejich kód místo volání API funkce). Samotný test je o tom načíst nějaká data a vytvořit z nich PDF (dost času se stráví kompresí, která žádné inkriminované operace neobsahuje). Vše je ve vyrovnávací paměti měřím až druhé spuštění, takže diskové operace by měly být zanedbatelné.
Takže k výsledkům:
| |
Velikost Exe |
Čas |
| 32bit Atomic |
25205 kB |
17.7 |
| 32bit Plain |
25295 kB |
16.6 |
| 64bit Atomic |
39696 kB |
14.6 |
| 64bit Plain |
39557 kB |
13.1 |
Rozdíl velikosti exe souborů je rozhodně zajímavý 32bit aplikace se “zjednodušením” zvětšila a naopak 64bit se zmenšila. 64bit aplikace se pak zrychlila o víc než 32bit verze, těžko říct proč, samotný čítač je v obou verzích 32bitový. Velký rozdíl velikosti a i zrychlení 64bit verze oproti 32bit, pak připisuji především používání C++ vyjímek, v 32bit Windows totiž try catch není zadarmo.
Pokud byste uvažovali o stejné aplikaci v .Netu, tak by to bylo rychlejší v tom, že by tam dokonce nebyl vůbec žádný čítač, pomalejší o konverze mezi stringem a StringBuilderem. Obecně se mi zdá, že pro více vláknové aplikace, výhoda GC oproti malloc/free, začíná být zajímavá.