2016-04-13 12 views
-4

Ben bölünmüş kaldırıldı ve benim denetleyicisi bunu yapıldığı takdirde daha hızlı olur buDaha hızlı ne var - denetleyicimde veya tıraş makinemde(). ASP.Net MVC

@if(spaceEvent.RegisteredStudentIds.Split(',').Contains(@Model.MeStudentId)) { 
    // show some specific HTML 
} 

benziyor benim ustura bir kod hattı var? Denetleyicideki .contains() işlevini bile yapabilirim! Veya bu durumda önemli mi?

+1

Profil. Ayrıca farklı işlevlere sahiptirler. Ayrılma, 'Rob, ert' ile eşleşmeyecek, bölünmeyecek. – Rob

+2

Bak: [performans rant] (https://ericlippert.com/2012/12/17/performance-rant/). Bir büyük dizenin en az bir kez daha küçük bir dize içerip içermediğini kontrol etmek isterseniz, [IndexOf] 'un (https://msdn.microsoft.com/library/k8b1470s.aspx) sıfır veya daha yüksek olup olmadığını kontrol edebilirsiniz. (Sıfırdan az demektir: bulunamadı). – Corak

+2

Gösterilebilir bir performans probleminiz olmadıkça daha da önemsizdir. Bu söylenecek olursa, programlamada * mantık * kontrolörde görülmeli ve görünümde olmamalıdır. –

cevap

0

evet ve hayır! Hayır, çünkü Split ek yüküne sahiptir. Tam bir dize yinelemeli, karakterleri cadı kibritleriyle eşleştirmeli, bölünmeli ve sonuç dizisini yapmalı ve döndürmelidir.

ve evet, çünkü büyük bir dizede (örneğin 100MB) String.Contains tam 100M karakterleri yinelemeli, her giriş ve sonraki karaktere göre karşılaştırır ... ancak 200K kelimelerde 100M'yi böldüğünüzde, IEnumerable.Contains ilk kelimeyi girişle karşılaştırır, eğer ilk char eşleşmezse diğer karakterleri atlar ve bir sonraki kelimeye gider ve 5 karakter daha sonra gider. Bu senaryo döngüsünde 200K tekrarlanır (girişlere bağlıdır) örneğin cadı 100M'den azdır!
Sadece büyük bir dizeniz varsa ve Contains yöntemini birkaç kez kullanmak istiyorsanız, Böl'ü bölün ve sonucu bir dizide tutun, ardından array.Contains yöntemini kullanın.