Dengan banyaknya koleksi objek, apakah ada perbedaan performa antara berikut ini?
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
c#
linq
performance
benchmarking
SDReyes
sumber
sumber
Jawaban:
Contains()
adalah metode instance, dan kinerjanya sangat bergantung pada koleksi itu sendiri. Misalnya,Contains()
pada aList
adalah O (n), sedangkanContains()
pada aHashSet
adalah O (1).Any()
adalah metode ekstensi, dan hanya akan melalui koleksi, menerapkan delegasi pada setiap objek. Oleh karena itu, ia memiliki kompleksitas O (n).Any()
lebih fleksibel namun karena Anda dapat mengoper delegasi.Contains()
hanya dapat menerima suatu objek.sumber
Contains
juga merupakan metode ekstensi terhadapIEnumerable<T>
(meskipun beberapa koleksi memilikiContains
metode contoh sendiri juga). Seperti yang Anda katakan,Any
lebih fleksibel daripadaContains
karena Anda bisa meneruskan predikat khusus, tetapiContains
mungkin sedikit lebih cepat karena tidak perlu melakukan pemanggilan delegasi untuk setiap elemen.All()
beroperasi dengan cara yang sama.Itu tergantung pada koleksinya. Jika Anda memiliki koleksi yang dipesan, maka
Contains
mungkin melakukan pencarian cerdas (biner, hash, b-tree, dll.), Sedangkan dengan `Any () Anda pada dasarnya terjebak dengan enumerasi sampai Anda menemukannya (dengan asumsi LINQ-to-Objects) .Perhatikan juga bahwa dalam contoh Anda,
Any()
menggunakan==
operator yang akan memeriksa persamaan referensial, sementaraContains
akan menggunakanIEquatable<T>
atauEquals()
metode, yang mungkin ditimpa.sumber
Saya kira itu akan tergantung pada jenis
myCollection
is yang menentukan bagaimanaContains()
diimplementasikan. Jika pohon biner diurutkan misalnya, itu bisa mencari lebih pintar. Juga dapat memperhitungkan hash elemen.Any()
di sisi lain akan melakukan pencacahan melalui koleksi sampai elemen pertama yang memenuhi kondisi ditemukan. Tidak ada pengoptimalan jika objek memiliki metode pencarian yang lebih cerdas.sumber
Contains () juga merupakan metode ekstensi yang dapat bekerja cepat jika Anda menggunakannya dengan cara yang benar. Misalnya:
var result = context.Projects.Where(x => lstBizIds.Contains(x.businessId)).Select(x => x.projectId).ToList();
Ini akan memberikan kueri
SELECT Id FROM Projects INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item
sedangkan Any () di sisi lain selalu melakukan iterasi melalui O (n).
Semoga ini berhasil ....
sumber