Saya dapat mengurutkan daftar menggunakan Sort atau OrderBy. Mana yang lebih cepat? Apakah keduanya bekerja dengan algoritme yang sama?
List<Person> persons = new List<Person>();
persons.Add(new Person("P005", "Janson"));
persons.Add(new Person("P002", "Aravind"));
persons.Add(new Person("P007", "Kazhal"));
1.
persons.Sort((p1,p2)=>string.Compare(p1.Name,p2.Name,true));
2.
var query = persons.OrderBy(n => n.Name, new NameComparer());
class NameComparer : IComparer<string>
{
public int Compare(string x,string y)
{
return string.Compare(x, y, true);
}
}
c#
.net
performance
sorting
sql-order-by
pengguna215675
sumber
sumber
Jawaban:
Mengapa tidak mengukurnya:
Di komputer saya ketika dikompilasi dalam mode Rilis program ini mencetak:
MEMPERBARUI:
Seperti yang disarankan oleh @Stefan, berikut adalah hasil dari menyortir daftar besar lebih sedikit:
Cetakan:
Dalam skenario ini, sepertinya OrderBy berkinerja lebih baik.
UPDATE2:
Dan menggunakan nama acak:
Dimana:
Hasil:
Masih OrderBy lebih cepat
sumber
LINQ
harus menghabiskan memori tambahan dibandingkan denganList<T>.Sort
implementasi di tempat . Saya tidak yakin apakah mereka meningkatkan ini di versi .NET yang lebih baru, tetapi pada mesin saya (rilis i7 3rd gen 64-bit .NET 4.5)Sort
berkinerja lebih baikOrderBy
dalam semua kasus. Selanjutnya, dengan melihatOrderedEnumerable<T>
kode sumber, tampaknya ia membuat tiga larik tambahan (pertama aBuffer<T>
, lalu larik kunci yang diproyeksikan, lalu larik indeks) sebelum akhirnya memanggil Quicksort untuk mengurutkan larik indeks pada tempatnya.ToArray
panggilan yang membuat array yang dihasilkan. Operasi memori dan pengindeksan array adalah operasi yang sangat cepat, tetapi saya masih tidak dapat menemukan logika di balik hasil ini.Tidak, mereka bukan algoritme yang sama. Sebagai permulaan, LINQ
OrderBy
didokumentasikan sebagai stabil (yaitu jika dua item memiliki yang samaName
, mereka akan muncul dalam urutan aslinya).Itu juga tergantung pada apakah Anda menyangga kueri vs mengulanginya beberapa kali (LINQ-to-Objects, kecuali Anda menyangga hasilnya, akan mengurutkan ulang per
foreach
).Untuk
OrderBy
kueri, saya juga akan tergoda untuk menggunakan:(untuk
{yourchoice}
salah satuCurrentCulture
,Ordinal
atauInvariantCulture
).List<T>.Sort
Enumerable.OrderBy
sumber
Enumerable.OrderBy
dan menelusuri implementasi internalnya, Anda dapat melihat bahwa algoritme pengurutan OrderBy adalah varian dari QuickSort yang melakukan pengurutan stabil. (LihatSystem.Linq.EnumerableSorter<TElement>
.) Jadi,Array.Sort
danEnumerable.OrderBy
keduanya dapat diharapkan memiliki waktu eksekusi O (N log N) , di mana N adalah jumlah elemen dalam koleksi.Jawaban Darin Dimitrov menunjukkan bahwa
OrderBy
sedikit lebih cepat daripadaList.Sort
saat dihadapkan dengan input yang sudah diurutkan. Saya memodifikasi kodenya sehingga berulang kali mengurutkan data yang tidak diurutkan, danOrderBy
dalam banyak kasus sedikit lebih lambat.Selanjutnya,
OrderBy
pengujian tersebut digunakanToArray
untuk memaksa pencacahan enumerator Linq, tetapi itu jelas mengembalikan type (Person[]
) yang berbeda dari tipe input (List<Person>
). Oleh karena itu, saya menjalankan ulang pengujian menggunakanToList
daripadaToArray
dan mendapatkan perbedaan yang lebih besar:Kode:
sumber
OrderByWithToList
membutuhkan waktu yang sama sepertiOrderBy
.Saya pikir penting untuk mencatat perbedaan lain antara
Sort
danOrderBy
:Misalkan ada sebuah
Person.CalculateSalary()
metode yang membutuhkan banyak waktu; mungkin lebih dari sekadar operasi penyortiran daftar besar.Membandingkan
Opsi 2 mungkin memiliki kinerja yang unggul, karena hanya memanggil
CalculateSalary
metode sebanyak n kali, sedangkanSort
opsi tersebut dapat memanggilCalculateSalary
hingga 2 n log ( n ) kali, tergantung pada keberhasilan algoritme pengurutan.sumber
n
waktu CalculateSalary . Ini jelas tidak senyaman menggunakan OrderBy.Singkatnya:
Daftar / Array Sort ():
OrderBy / ThenBy ():
x => x.Id
. Semua kunci diekstrak terlebih dahulu sebelum diurutkan. Ini mungkin menghasilkan kinerja yang lebih baik daripada menggunakan Sortir () dan pembanding khusus.Sumber: MDSN , sumber referensi dan dotnet / coreclr repositori (GitHub).
Beberapa pernyataan yang tercantum di atas didasarkan pada implementasi framework .NET saat ini (4.7.2). Itu mungkin berubah di masa depan.
sumber
Anda harus menghitung kompleksitas algoritma yang digunakan oleh metode OrderBy dan Sort. QuickSort memiliki kompleksitas n (log n) seperti yang saya ingat, di mana n adalah panjang array.
Saya telah mencari orderby juga, tetapi saya tidak dapat menemukan informasi apapun bahkan di perpustakaan MSDN. jika Anda tidak memiliki nilai yang sama dan pengurutan yang terkait dengan hanya satu properti, saya lebih suka menggunakan metode Sort (); jika tidak, gunakan OrderBy.
sumber
Saya hanya ingin menambahkan bahwa orderby jauh lebih berguna.
Mengapa? Karena saya bisa melakukan ini:
Mengapa pembanding rumit? Cukup urutkan berdasarkan bidang. Disini saya mengurutkan berdasarkan TotalBalance.
Sangat mudah.
Saya tidak bisa melakukan itu dengan baik. Kenapa ya. Lakukan dengan baik dengan orderBy.
Adapun kecepatan selalu O (n).
sumber