Zrychlete svůj model z Entity Frameworku.
reklama
Entity Framework, ORM nástroj z dílny Microsoftu, nabízí vývojářům jednoduchou možnost pracovat s daty v databázi (a nejen tam) jednoduše jako s objekty, včetně možnosti používat, tolik oblíbený, LINQ.
Pokud se odprostíme od přesných detailů, můžeme říci, že vnitřní fungování celého modelování a mapování je založeno na pohledech (pozor nejedná se o pohledy známé z např. SQL databází!). Mapování je kompilováno do dvousměrných pohledů. Tyto pohledy vyjadřují entity ve formě tabulek (první směr – tzv. query views) resp. tabulky ve formě entit (druhý směr – tzv. update views). Mj. pro tyto pohledy platí entity = query_view(update_view(entity)). Jak jistě sami domyslíte, vytvoření těchto pohledů není triviální. Mnohem důležitější však je, že tyto pohledy jsou generovány až za běhu aplikace (během přípravy na první dotaz). Máte-li proto velký model s mnoha asociacemi a entitami, může toto generování zabírat markantní množství času např. při startu aplikace. Pro můj testovací, trochu přerostlý, model s 400+ entitami a 300+ asociacemi zabralo generování celých 20 sekund.
Naštěstí existuje řešení. Tyto pohledy je možné předgenerovat pomocí nástroje EdmGen případně EdmGen2 (nebo vlastním). Pro náš případ zvolíme EdmGen2, neboť umožňuje pracovat o něco komfortněji a to přímo s EDMX souborem.
Vytvořte si tedy nejprve model vaší oblíbené databáze. Nyní využijeme pre-build akcí ve Visual Studiu a přidáme:
cd "$(ProjectDir)"
"$(SolutionDir)EdmGen2.exe" /ViewGen cs "$(ProjectDir)BigModel.edmx"
První řádek nám zajistí nastavení pracovního adresáře na adresář s aktuálním projektem, protože EdmGen2 neumožňuje specifikovat výstupní soubor (nicméně můžete si, díky dostupnosti zdrojových textů, tuto schopnost přidat). Následně pouze zavoláme EdmGen2 s parametrem /ViewGen a specifikujeme jazyk, v jakém má být soubor vytvořen (zde C#) a cestu k EDMX souboru. Po první kompilaci se nám vytvořil soubor <název modelu>.GeneratedViews.<jazyk>. Nyní stačí tento soubor přidat do projektu a znovu zkompilovat.
Pokud aplikaci spustíte, mělo by vás čekat milé překvapení – zrychlení. S mým, výše uvedeným, modelem se čas zkrátil na 2 sekundy. Dosáhli jsme tedy 10x zrychlení (samozřejmě s jiným modelem budou výsledky odlišné). A vlastně bez práce, stačilo přidat jen triviální šikovné volání nástroje. Zajímá-li vás náročnost jednotlivých procesů v Entity Frameworku a nemáte-li čas testovat sami, doporučuji prostudovat [1] a [2], případně [3].
[1] http://blogs.msdn.com/adonet/archive/2008/02/04/exploring-the-performance-of-the-ado-net-entity-framework-part-1.aspx
[2] http://blogs.msdn.com/adonet/archive/2008/02/11/exploring-the-performance-of-the-ado-net-entity-framework-part-2.aspx
[3] http://blogs.msdn.com/adonet/archive/2008/03/27/ado-net-entity-framework-performance-comparison.aspx