Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

February 3, 2009 / by Zsolt Soczó

.NET teljesítményhangolási tapasztalatok 2.

Regexek használata esetén lehetőség van a regex előfordítására, amely során a konkrét regex kifejezésre generálnak egy kiértékelő assemblyt, ami aztán gyorsabban képes a regexet lefuttatni egy adott bemeneti szövegen, mint a nem előfordított megfelelője. Az előfordítás költsége igen magas, amely csakis akkor éri meg, ha utána nagyon sokszor kell a regexet különböző szövegekre lefuttatni. Ha csak egyszer használjuk fel a regexet és csak rövid bemenetekre, akkor sokkal de sokkal többet veszítünk az előfordítással, mint nyerünk.

Az egyik third-party vezérlőben volt az alábbi kód:

Regex regex = new Regex(@”\w+|[^A-Za-z0-9_]”, RegexOptions.Compiled |
RegexOptions.IgnoreCase);

A RegexOptions.Compiled ebben a felhasználásban (egysoros textbox) nagyon sok időt elvitt, indokolatlanul.

Az előfordítás további problémás jellemzője, hogy sokféle regex esetén minden egyes regexhez létrejön és betöltődik egy dinamikus assembly a memóriába, amely csak az appdoman unload esetén (Windows appnál ez a legtöbb esetben csak az app leállításakor, kevesen használnak saját appdomaineket) esik ki belőle. Sok regex esetén ez memóriaszivárgásként észlelhető, amely során a private memory fogy (mivel a generált majd jittelt kód nem osztható meg).

Mindezek ellenére senkit nem akarok lebeszélni az előfordításról, mert tetemes gyorsulás érhető el vele, ha kevés fajta regexet kell lefuttatni hosszú bemenetre.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.