optimalizálása alkalmazások

Sok fajta gyűjtemények, jól ismert a számítógépet, de nem tartoznak bele a .NET-keretrendszer. Némelyik nagyon elterjedtek voltak, és az alkalmazások lehet, hogy bizonyos előnyei azok használatát. Ezen kívül, legtöbbjük lehet megvalósítani egy viszonylag rövid idő alatt. Annak ellenére, hogy nem tűztük ki magunk elé a kutatás célja, hogy különböző típusú gyűjtemények azonban két példát a gyűjtemények, amelyek jelentősen eltérnek gyűjteményekből .NET, és felajánlotta, hogy fontolja meg a helyzetet, amikor is a saját gyűjtemény hasznos lehet.

diszjunkt-halmaz

Rendszer diszjunkt (diszjunkt-set) - gyűjteménye elemek, amelyek formájában tárolt diszjunkt. Ez eltér a .NET gyűjtemények, amelyeket nem lehet menteni azt elemekkel. Ehelyett, a képződött domént elemeket, ahol minden egyes elem alkotja egy egyedi, és határozza meg a műveletek sorrendjét, hogy összekapcsolják a nagyobb készlet. Ez az adat szerkezete egy nagy teljesítményű két művelet:

kombinálásával két részhalmaza azzal a céllal, hogy megkapja a közös részhalmazát;

keresés az alcsoport meghatározás tartozik elem (annak meghatározására, hogy a két említett egy részhalmaza elem).

Jellemzően a műveleteket a készlet elemeinek reprezentatív - az egyetlen képviselője mindegyik. és összekapcsolja keresési művelet fogadja és visszaút képviselői, hanem a teljes készlet.

A naiv rendszer kiépítéséig a diszjunkt használatával jár a gyűjtemény képviseli mindegyik, és egyesíti a gyűjtemény, ha szükséges. Például, ha egy kapcsolat listát tárolására mindegyik, míg összeolvad egyenesen arányos a készletek és a keresési művelet eltarthat egy állandó időpontban, ha minden elem egy mutatót a reprezentatív.

Alkalmazása az algoritmus-Fisher Haller (Galler-Fischer) sokkal nagyobb komplexitás. A készletek tárolása egy „fa” (a készlet fák); minden csomópont minden fa tárolja egy pointert a szülő csomópont, és a gyökér a fa egy reprezentatív. Annak érdekében, hogy az egyensúlyt a kapott fák, a torkolatánál fák kevesebb fa mindig csatlakozik a tetején egy nagy fa (ez megköveteli, hogy figyelemmel kíséri a mélység a fa). Ezenkívül a keresési művelet tömöríti az utat a kívánt elem képviselője. Az alábbiakban vázlatos végrehajtását az algoritmus:

optimalizálása alkalmazások

Pontos teljesítményének mérését az adatok szerkezete nagyon nehéz. A legegyszerűbb esetben a felső határt amortizált idejű működése az erdőben n elemek jelentése O (log * n), ahol log * n (iteratív logaritmusának) - száma logaritmusának számítási funkció használ, hogy készítsen eredményeként kevesebb, mint egy, azaz a minimális előfordulások számát «log „a napló log log egyenlőtlenség. log n. amelyek egyszerűen tárolja rendezett tömböt. Egy tipikus megközelítés ezen probléma megoldásához az randomizálást lista hierarchia (lásd alább), amely lehetővé teszi, hogy a várható logaritmikus idő beszúrni, törölni, és keressen elemek:

Az is előfordulhat, hogy találja magát egy különleges helyzetben, amikor a probléma megoldása csak akkor lesz lehetséges a használata saját gyűjteménye. Nevezzük őket gyűjtemények eldobható (one-shot gyűjtemények). mert azok új találmány alkalmas egy adott feladatot. Idővel, akkor előfordulhat, hogy néhány eldobható gyűjtemény elég lehet újra felhasználható. Ebben a részben megnézzük egy ilyen gyűjtemény.

Képzeld el ezt a helyzetet: ha már létrehoztunk egy tőzsdei információk rendszerszolgáltatókra ellátó csokoládét információkat a különböző bárokban árakon. A fő adatok táblázat van tárolva a memóriában, és tartalmaz egy sor minden típusú tartalmazó szeletben az aktív áram ár bar. Az alábbi táblázat egy példát mutat ebben a táblázatban az adatok egy időben:

Példa egy táblázatot az adatok információs rendszer rudak eladók

Eladók rudak vannak csatlakoztatva a rendszer TCP socket, és rendszeresen kéri a legfrissebb információkat egy adott típusú rúd. Egy tipikus kérésére az Eladó: „Mi az ára Twix». Egy tipikus válasz: "$ 0.93". Minden második tízezer kérések jönnek.

A gyártók rudak csatlakoznak a rendszerbe egy UDP socket, és rendszeresen meg egy új árat a bárokban. Kéri a gyártóktól vannak osztva két altípusa:

„Állítsa be az ár a Mars egyenlő $ 0.91.” Válaszul egy ilyen kérelem nem szükséges. Minden második, több ezer ilyen kérelmet lépett be.

„Új bar hópelyhek a kikiáltási ára $ 0.49.” Válaszul egy ilyen kérelem nem szükséges. Az ilyen kérés érkezik, több mint néhány tucat naponta.

Azt is tudjuk, hogy a 99,9% -a vagy ár frissítési műveleteket végzett a típusú bárok, hogy létezett idején a kereskedés megkezdése, és csak 0,1% -a tranzakciók esik az újonnan hozzáadott bárokban.

Fegyveres ezt az információt, úgy dönt, hogy megtervezzük a szerkezet az adatok - gyűjtése - adatok tárolására táblázatok a memóriában. Ez a szerkezet támogatnia kell a képességét, hogy használja a többszálú környezetben, mert több száz szálak egyszerre próbálja elérni. Nem kell aggódnia az adatokat menti tartósan tárolni - megvizsgáljuk a teljesítmény jellemzők csak abban az esetben találni egy gyűjtemény a memóriában.

adatok és a lekérdezés típusát alkotják diktálják, hogy szükség van egy hash táblát. Szinkronizálása hozzáférést egy hash tábla egy összetett feladat, hogy jobban át kell ConcurrentDictionary. Reading egy párhuzamos szókincs lehet végezni anélkül, hogy a szinkronizálás, de a tranzakció árváltozások és a mellett egy új típusú rudak szükség magasan irányított szinkronizálás. Míg egy ilyen döntés lehet egészen elfogadható, de mi lesz emelni a lécet: szeretnénk biztosítani, hogy az olvasási és módosíthatja az árak nélkül szinkronizáció 99,9% operációk meglévő típusú rúd.

Az egyik lehetséges megoldás szolgálhat biztonságos-nem biztonságos cache (safe-nem biztonságos cache). Ez a gyűjtemény egy sor két hash asztalok, biztonságos (safe táblázat) és a nem biztonságos asztal (nem biztonságos a táblázatot). Biztonságos az asztal tele információk a típusú bárok, hogy létezett abban az időben az árverés; Nem biztonságos tábla kezdetben üres. A műveleteket a biztonságos asztal blokkolása nélkül, mert nem változik; új típusú rudak adunk a biztonságos asztalra. Az alábbiakban képviseli esetleges végrehajtását az adatstruktúra felhasználásával Dictiornary és ConcurrentDictionary:

A következő lépés a fejlesztés adatstruktúrát lehet időszakos felfüggesztése szakszervezet és biztonságos és nem biztonságos asztalra. Ez tovább csökkenti annak szükségességét, hogy szinkronizálja az adatokhoz való hozzáférést.

Végrehajtása IEnumerable és más felületek

Szinte minden gyűjtemény végül megvalósítja az IEnumerable interfész és esetleg más interfészek kapcsolatos gyűjtemények. Ezek megvalósítása interfészek nyújt rengeteg előnye van, például verziótól .NET 3.5, LINQ támogatás. A végén minden osztályt, amely megvalósítja az interfészt IEnumerable, automatikusan látva különböző kiegészítő módszereket System.Linq és fel lehet használni a C # 3.0 LINQ kifejezések, valamint beágyazott gyűjtemények.

Sajnos, egy egyszerű végrehajtását IEnumerable Interface a gyűjtemény kényszeríti a hívó fizetni a teljesítmény kihívások a felület módszereket. Vessen egy pillantást a következő részletben feltérképezni List Collection:

Minden iterációban ami két felület módszer ebben a példában, amely maga után vonja többletterhelés, hogy megpróbálja megkerülni a listát, és kiszámítja a termék elemében. Beágyazása interfész módszerek nem könnyű feladat, és ha a JIT-fordító nem tudja megoldani, a hívások költségét, hogy nagyon magas.

Számos megoldás, amely segít elkerülni a szükségtelen fölött hívás esetén módszerekkel. Amikor a felület módszereket alkalmaznak közvetlenül a változó érték típusú, nevezik őket közvetlenül. Azaz, ha a számlálóra változó a fenti példában volt értéke típusú (nem IEnumerator) Az ára a hívás interfész módszerek sokkal alacsonyabb lenne. Ha a gyűjtemény végrehajtotta GetEnumerator () módszer, amely visszaadja egy példánya egy értéket írja közvetlenül, a hívó lenne képes használni a módszerei helyett a felület módszerek.

Ebben a példában az osztály listája kifejezetten végrehajtja IEnumerable módszerrel.GetEnumerator (), amely visszaadja IEnumerator, és más nyilvános GetEnumerator () metódus, ami visszaadja a lista. Enumerator - belső például egy érték típusa:

Ez lehetővé teszi, hogy írjon kódot, mint ez:

váltva a hívás interfész módszereket.

Egy másik megoldás az, hogy hozzon létre egy bejáró referencia típus, de ugyanazt a trükköt egy külön interfész megvalósítása - módszer MoveNext () és az ingatlan a jelenlegi. Azt is lehetővé teszi a hívó fél használni a módszert és a tulajdon az osztály közvetlenül, elkerülve a felső hívások interfész módszereket.

Kapcsolódó cikkek