Πριν από το Linq, χρησιμοποιούσαμε συνήθως την ακόλουθη μέθοδο για να προσδιορίσουμε εάν μια συλλογή δεν είναι κενή, δηλαδή μια συλλογή περιέχει στοιχεία:
Χρησιμοποιώντας το χαρακτηριστικό Μήκος ή Μέτρηση, δεν υπάρχει πρόβλημα με την παραπάνω γραφή.
Αλλά στην εποχή του Linq, η μέθοδος επέκτασης Enumerable.Count "ενοποίησε" τις ιδιότητες Length και Count, με αποτέλεσμα τον ακόλουθο τρόπο γραφής για να κριθεί η μη ακυρότητα:
Αυτή η γραφή είναι καλή και λειτουργεί καλά, αλλά μπορεί να προκαλέσει πολύ σοβαρά προβλήματα απόδοσης.
Σημειώστε ότι είναι δυνατό, όχι απαραίτητα, και εάν η παραπάνω μέθοδος περάσει ως Πίνακας<T>, Λίστα ή Συλλογή<T>, δεν θα υπάρχει πρόβλημα.
Πότε λοιπόν κάτι θα πάει στραβά; Ας δούμε τις ακόλουθες μεθόδους:
Όταν καλείται:
Η ταχύτητα εκτέλεσης θα είναι αρκετά αργή και χρειάστηκαν περίπου 70 δευτερόλεπτα για να εκτελέσει ο υπολογιστής μου την πηγή. Πλήθος() > 0。
Αν το αναλύσετε, θα διαπιστώσετε ότι η απόδοση απόδοσης i στη γραμμή 5 του κώδικα GetNums εκτελείται int. MaxValue, είναι απαραίτητο;
Στην πραγματικότητα, εφόσον επιστρέφουμε ένα στοιχείο, μπορούμε να συμπεράνουμε ότι το σύνολο δεν είναι κενό και δεν χρειάζεται να επιστρέψουμε καθόλου όλα τα στοιχεία.
Πώς να κρίνουμε λοιπόν; Μπορούμε να χρησιμοποιήσουμε το Enumerable.Οποιαδήποτε μέθοδο επέκτασης:
Τροποποιήστε τη μέθοδο SomeAction ως εξής:
Καλέστε το ξανά και θα διαπιστώσετε ότι ο χρόνος εκτέλεσης είναι αμελητέος.
Συνοψίζοντας, η Count() > 0 θα έχει αναπόφευκτα προβλήματα απόδοσης όταν συναντήσει yeild return.
|