Enne Linqi kasutasime tavaliselt järgmist meetodit, et määrata, kas kogu on mitte-tühi, st kogum sisaldab elemente:
Kasutades omadust Pikkus või Loendus, pole ülaltoodud kirjutamisega mingit probleemi.
Kuid Linqi ajastul "ühendas" Enumerable.Count laiendusmeetod Pikkuse ja Loenduse omadused, mille tulemusena on järgmine kirjutamisviis mitte-nullsuse hindamiseks:
See kirjutis on okei ja toimib hästi, kuid võib põhjustada väga tõsiseid jõudlusprobleeme.
Pane tähele, et see on võimalik, mitte tingimata, ja kui ülaltoodud meetod edastatakse <T>massiivi, loendi või <T>kogumikana, siis probleemi ei tekki.
Millal siis midagi valesti läheb? Vaatame järgmisi meetodeid:
Kui kutsutakse:
Täitmise kiirus on üsna aeglane ja minu arvutil kulus umbes 70 sekundit, et lähtekoodi käivitada. Count() > 0。
Kui seda analüüsida, leiad, et GetNums koodi 5. reas olev yield return i täitub int. MaxValue, kas see on vajalik?
Tegelikult, kui tagastame ühe elemendi, võime järeldada, et hulk on mitte-tühi ja pole vaja kõiki elemente tagastada.
Kuidas siis hinnata? Võime kasutada Enumerable.Mis tahes laiendusmeetodit:
Muuda SomeAction meetodit järgmiselt:
Kutsu see uuesti ja näed, et hukkamisaeg on tühine.
Kokkuvõttes esineb Count() > 0 paratamatult jõudlusprobleeme, kui ta kohtab tagasitulekut.
|