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!

Tagged , , ,