NHibernate: przyśpieszanie ładowania
Ayende pisze ostatnio na swoim blogu o przykładowej apllikacji w WPF używającej NHibernate o nazwie Effectus. Kod całej aplikacji można znaleźć na githubie.
Moją uwagę zwrócił kod Bootstrappera, który zawiera ciekawy trick, a mianowicie serializowanie obiektu Configuration do pliku:
private static void SaveConfigurationToFile(Configuration configuration)
{
using(var file = File.Open(SerializedConfiguration, FileMode.Create))
{
var bf = new BinaryFormatter();
bf.Serialize(file, configuration);
}
}
A następnie zamiast wywoływać:
Configuration = new Configuration().Configure(ConfigFile);
Co odpowiada użyciu gołego NH, ale równie dobrze może to być Fluently.Configure z FluentNHibernate.
Ładowana jest konfiguracja z pliku:
private static Configuration LoadConfigurationFromFile()
{
if (IsConfigurationFileValid == false)
return null;
try
{
using(var file = File.Open(SerializedConfiguration, FileMode.Open))
{
var bf = new BinaryFormatter();
return bf.Deserialize(file) as Configuration;
}
}
catch (Exception)
{
return null;
}
}
Zysk czasowy jest bardzo duży – w przypadku sporej liczby mapowanych klas wywołanie Configure trwa nawet 5,5 sekundy, a deserializacja z pliku około 600 ms. Co ciekawe taki zserializowany obiekt Configuration zajmuje w moim przypadku 1,7MB na dysku.
Taki zapis jest wykonywany przy pierwszym starcie, więc oszczędza się dopiero przy następnych uruchomieniach. Zapisywanie obiektu na etapie deploymentu chyba nie byłoby dobrym pomysłem – z powodu różnic x86 i x64. Ma to też sens dla aplikacji desktopowych bardziej niż webowych.
Smacznego!