niedziela, 1 marca 2015

Jak przyspieszyć inicjalizacje obiektów aby szybciej można było utworzyć listy, słownik danych

Jeśli potrzebujecie przechować jakieś dane np. w cache to najpierw je trzeba pobrać i gdzieś umieścić. Przedstawię mały trick. Większość programistów c# (dane wzięte z kosmosu, ale się domyślam, że tak jest) przechwycone dane zapisuje jako klasę by następnie przechowywać je w jakiejś strukturze danych (lista, słownik, tablica). To w większości przypadków jest OK, lecz wyobraźmy sobie, że mamy do zainicjowania kolekcję złożoną z baaaaaaardzo wielu elementów a zależy nam bardzo na szybkości inicjalizacji. Więc zamiast robić:

Enumerable.Range(0, 10000000).ToDictionary(k => k, v => new X(123));

gdzie X jest klasą

wystarczy utworzyć strukturę
        struct Y
        {
            public int Val;
            public Y(int val) {
                Val = val;
            }
        }


 Enumerable.Range(0, 10000000).ToDictionary(k => k, v => new Y(123));

U mnie wzrost wydajnościowy jest niemal 3-4 krotny.

ps oczywiście tytuł jest trochę mylący bowiem struktura (Struct) nie jest obiektem!

Brak komentarzy: