.Net kollektsioonide jõudlus ja boxing II
19.02.2008 | Gunnar
Tegin kunagi avaldatud lühikest kannet .Net kollektsioonide jõudlus ja boxing ja seal viidatud artiklit lugedes ühe pisikese katse. Nimelt viisin enda masina peal huvi pärast eelviidatud artiklis toodule sarnased mõõtmised.
Täpsemat lugemist boxing ja unboxing teema kohta pakub näiteks väljavõte raamatust Effective C#: 50 Specific Ways to Improve Your C#, peatükk Item 17: Minimize Boxing and Unboxing.
Katse eesmärgiks oli mõõta seda, kui palju aeglasemaks muudavad boxing ja unboxing listide kasutamise. Katsed tegin nii listidest lugemise kui sinna kirjutamisega. Väärtuste tüübiks oli Int32. Boxing efektide katsetamiseks kasutasin sellist listi nagu ArrayList. Boxing operatsioonide vältimiseks oli kasutusel List<Int32>. Listide elementide arvuks oli miljon täisarvu. Tulemused olid järgmised.
ArrayList‘ist lugemine võttis aega 7.26 ms. List<Int32> korral võttis kõikide elementide lugemine listist aega 6.08 ms. Seega on lugemise korral List<Int32> orienteeruvalt 1.2 korda kiirem ehk siis võitsime kiirust viiendiku jagu juurde, mis on ka oluline võit.
Hoopis suurem võit kiiruses tekkis listidesse kirjutamisel. ArrayList‘i miljoni elemendi kirjutamisel sain keskmiseks ajakuluks 83.95 ms. List<Int32> andis seevastu tulemuseks 10.68 ms. Seega 7.86 kordne vahe, mis on juba märkimisväärselt suur saavutus.
| List | Lugemine | Kirjutamine |
|---|---|---|
| ArrayList | 7.26 | 83.95 |
| List<Int32> | 6.08 | 10.68 |
| Erinevus | 1.19 | 7.86 |
Boxing ja unboxing efekte, nagu mu katse näitas, tasub seega igati vältida. Saavutused jõudluses võivad olla märkimisväärsed.
Kui .Net Framework 1.0 ja 1.1 peal tähendas see päris määravas mahus tegemist spetsiaalsete kollektsioonide koodimise näol (ärme unusta, et ka structure on value type), siis .Net 2.0 peal tulevad meile appi generic kollektsioonid, milledele saame ise tüübid ette öelda.
