Saya sedang menulis manajer Mesh Rendering dan berpikir itu akan menjadi ide yang baik untuk mengelompokkan semua mesh yang menggunakan shader yang sama dan kemudian membuat ini saat saya dalam shader pass.
Saat ini saya menggunakan foreach
loop, tetapi bertanya-tanya apakah menggunakan LINQ dapat meningkatkan kinerja saya?
c#
performance
linq
foreach
Neil Knight
sumber
sumber
Jawaban:
Mengapa LINQ harus lebih cepat? Ini juga menggunakan loop secara internal.
Seringkali, LINQ akan menjadi sedikit lebih lambat karena menyebabkan overhead. Jangan gunakan LINQ jika Anda sangat peduli dengan performa. Gunakan LINQ karena Anda ingin kode yang lebih pendek dapat dibaca dan dipelihara dengan lebih baik.
sumber
LINQ-to-Objects umumnya akan menambahkan beberapa overhead marginal (beberapa iterator, dll). Ia masih harus melakukan loop, dan memiliki pemanggilan delegasi, dan umumnya harus melakukan beberapa dereferensi tambahan untuk mendapatkan variabel yang ditangkap, dll. Dalam kebanyakan kode ini hampir tidak dapat dideteksi, dan lebih dari yang diberikan oleh kode yang lebih sederhana untuk dipahami.
Dengan penyedia LINQ lain seperti LINQ-to-SQL, maka sejak query dapat menyaring di server itu harus jauh lebih baik daripada flat
foreach
, tapi kemungkinan besar Anda tidak akan dilakukan selimut"select * from foo"
pula , sehingga tidak selalu adil perbandingan.Re PLINQ; paralelisme dapat mengurangi waktu yang telah berlalu , tetapi total waktu CPU biasanya akan meningkat sedikit karena overhead manajemen utas, dll.
sumber
List<Foo>
; sebagai gantinya, saya harus menggunakanforeach
blok pada koleksi ini. Rekomendasi untuk digunakanforeach
dalam konteks ini memang masuk akal. Kekhawatiran saya: haruskah saya mengganti kueri LINQ denganforeach
jika saya mendeteksi masalah kinerja? Ke depan, saya akan mempertimbangkan yangforeach
pertama.Saya pikir LINQ lebih baik digunakan melalui
foreach
loop, karena LINQ memberi Anda kode yang lebih bersih dan mudah dipahami. Tapi LINQ lebih lambat dariforeach
. Untuk mendapatkan lebih banyak, baca artikel LINQ vs FOREACH vs FOR Loop Performance .sumber
LINQ lebih lambat sekarang, tetapi mungkin menjadi lebih cepat di beberapa titik. Hal yang baik tentang LINQ adalah Anda tidak perlu peduli tentang cara kerjanya. Jika metode baru dipikirkan dengan sangat cepat, orang-orang di Microsoft dapat menerapkannya bahkan tanpa memberi tahu Anda dan kode Anda akan jauh lebih cepat.
Lebih penting lagi, LINQ jauh lebih mudah dibaca. Itu seharusnya menjadi alasan yang cukup.
sumber
Mungkin harus dicatat bahwa
for
loop lebih cepat daripadaforeach
. Jadi untuk postingan asli, jika Anda khawatir tentang performa pada komponen penting seperti perender, gunakanfor
loop.Referensi: Dalam .NET, loop mana yang berjalan lebih cepat, 'for' atau 'foreach'?
sumber
Anda mungkin mendapatkan peningkatan kinerja jika Anda menggunakan LINQ paralel untuk multi core. Lihat Parallel LINQ (PLINQ) (MSDN).
sumber
Saya tertarik dengan pertanyaan ini, jadi saya melakukan tes sekarang. Menggunakan .NET Framework 4.5.2 pada Intel (R) Core (TM) i3-2328M CPU @ 2.20GHz, 2200 Mhz, 2 Core (s) dengan ram 8GB yang menjalankan Microsoft Windows 7 Ultimate.
Sepertinya LINQ mungkin lebih cepat daripada untuk setiap loop. Inilah hasil yang saya dapatkan:
Akan menarik jika beberapa dari Anda dapat menyalin & menempel kode ini di aplikasi konsol dan mengujinya juga. Sebelum menguji dengan objek (Karyawan) saya mencoba tes yang sama dengan bilangan bulat. LINQ juga lebih cepat di sana.
sumber
Exists=True Time=184 Exists=True Time=135
di laptop Apache Gaming (Win 10, C # 7.3). Dikompilasi dan dijalankan dalam mode debug. Jika saya membalik tes yang saya dapatkanExists=True Time=158 Exists=True Time=194
. Sepertinya Linq lebih dioptimalkan saya kira.Ini sebenarnya pertanyaan yang cukup kompleks. Linq membuat hal-hal tertentu sangat mudah dilakukan, bahwa jika Anda menerapkannya sendiri, Anda mungkin tersandung (misalnya linq .Except ()). Ini terutama berlaku untuk PLinq, dan terutama untuk agregasi paralel seperti yang diterapkan oleh PLinq.
Secara umum, untuk kode identik, linq akan lebih lambat, karena overhead pemanggilan delegasi.
Namun, jika Anda memproses data dalam jumlah besar, dan menerapkan penghitungan yang relatif sederhana ke elemen, Anda akan mendapatkan peningkatan performa yang sangat besar jika:
Anda menggunakan perulangan for untuk mengakses setiap elemen (sebagai lawan foreach atau linq).
sumber