Katakanlah kita memiliki string berikut
string data= "/temp string";
Jika kita ingin menghapus karakter pertama yang /
bisa kita lakukan dengan banyak cara seperti:
data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);
Tapi, sungguh saya tidak tahu mana yang memiliki algoritma terbaik dan melakukan itu lebih cepat ..
Apakah ada yang terbaik atau semuanya sama?
/
?TrimStart
tidak akan menghapus karakter pertama, itu akan menghapusn
karakter dari awal.Substring
adalah yang tercepat.TrimStart()
sama sekali tidak ada pertanyaan.Jawaban:
Opsi kedua benar-benar tidak sama dengan yang lain - jika string "/// foo" itu akan menjadi "foo", bukan "// foo".
Opsi pertama perlu sedikit lebih banyak pekerjaan untuk dipahami daripada yang ketiga - Saya akan melihat
Substring
opsi sebagai yang paling umum dan dapat dibaca.(Tentunya masing-masing sebagai pernyataan individu tidak akan melakukan apa pun yang berguna - Anda harus menetapkan hasilnya ke variabel, mungkin
data
itu sendiri.)Saya tidak akan mempertimbangkan kinerja di sini kecuali jika itu benar-benar menjadi masalah bagi Anda - dalam hal ini satu-satunya cara Anda akan tahu untuk memiliki kasus uji, dan kemudian mudah untuk menjalankan kasus uji tersebut untuk setiap opsi dan bandingkan hasilnya. Saya berharap
Substring
mungkin menjadi yang tercepat di sini, hanya karenaSubstring
selalu berakhir dengan membuat string dari satu potong input asli, sedangkanRemove
setidaknya harus berpotensi menyatukan potongan awal dan bagian akhir.sumber
Saya tahu ini adalah hiper-optimasi tanah, tetapi sepertinya alasan yang bagus untuk menendang roda
BenchmarkDotNet
. Hasil tes ini (pada .NET Core) adalah yangSubstring
sedikit lebih cepat daripadaRemove
, dalam tes sampel ini: 19.37ns vs 22.52ns untukRemove
. Jadi beberapa ~ 16% lebih cepat.Hasil:
sumber
Saya kira itu
Remove
danSubstring
akan mengikat untuk tempat pertama, karena mereka berdua menyeruput bagian ukuran tetap dari string, sedangkanTrimStart
melakukan scan dari kiri dengan tes pada setiap karakter dan kemudian harus melakukan pekerjaan yang persis sama dengan dua metode lainnya. Serius, meskipun, ini adalah rambut yang membelah.sumber
Substring
lebih cepat daripadaRemove
, karenaRemove
panggilanSubstring
.Substring
danRemove
mengandalkan metode pribadiFillSubstring
,.string Remove(this string source, int from, int to) { return source.SubString(0, from) + source.SubString(to); }
System.PInvoke.EE.AllocateString
untuk mengalokasikan objek string tujuan dan kemudian panggilanFillSubstring
untuk menyalin karakter. Apakah saya melihat hal yang salah?Substring
>Remove
). Saya tidak akan berkomentar lebih jauh karena pembahasannya cukup lama.Anda dapat membuatnya, jika Anda benar-benar peduli. Tulis satu lingkaran banyak iterasi dan lihat apa yang terjadi. Namun, ada kemungkinan bahwa ini bukan hambatan dalam aplikasi Anda, dan TrimStart tampaknya yang paling benar secara semantik. Berusaha untuk menulis kode dengan mudah sebelum mengoptimalkan.
sumber
TrimStart
adalah yang paling benar, karena tidak"//temp string".TrimStart('/')
akan hanya menghapus yang pertama .'/'