Misalkan saya memiliki stringbuilder di C # yang melakukan ini:
StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();
apakah itu seefisien atau lebih efisien daripada memiliki:
string cat = "cat";
string s = String.Format("The {0} in the hat", cat);
Jika demikian, mengapa?
EDIT
Setelah beberapa jawaban yang menarik, saya menyadari bahwa saya mungkin seharusnya sedikit lebih jelas dalam apa yang saya tanyakan. Saya tidak begitu banyak meminta yang lebih cepat menggabungkan string, tetapi yang lebih cepat dalam menyuntikkan satu string ke yang lain.
Dalam kedua kasus di atas saya ingin menyuntikkan satu atau lebih string ke tengah-tengah string template yang telah ditentukan.
Maaf bila membingungkan
string s = "The "+cat+" in the hat";
mungkin yang tercepat kecuali jika digunakan dalam satu lingkaran, dalam hal ini tercepat akan denganStringBuilder
inisialisasi di luar loop.Jawaban:
CATATAN: Jawaban ini ditulis ketika .NET 2.0 adalah versi saat ini. Ini mungkin tidak lagi berlaku untuk versi yang lebih baru.
String.Format
menggunakanStringBuilder
internal:Kode di atas adalah potongan dari mscorlib, jadi pertanyaannya menjadi "
StringBuilder.Append()
lebih cepat dariStringBuilder.AppendFormat()
"?Tanpa benchmarking saya mungkin akan mengatakan bahwa contoh kode di atas akan berjalan lebih cepat menggunakan
.Append()
. Tapi ini dugaan, cobalah membuat tolok ukur dan / atau membuat profil keduanya untuk mendapatkan perbandingan yang tepat.Orang ini, Jerry Dixon, melakukan pembandingan:
Diperbarui:
Sayangnya tautan di atas telah mati. Namun masih ada salinan di Way Back Machine:
Pada akhirnya, itu tergantung apakah pemformatan string Anda akan dipanggil berulang-ulang, yaitu Anda melakukan beberapa pemrosesan teks serius lebih dari 100 megabita teks, atau apakah itu dipanggil ketika pengguna mengklik tombol sekarang dan lagi. Kecuali jika Anda melakukan pekerjaan pemrosesan batch besar saya tetap menggunakan String.Format, ini membantu keterbacaan kode. Jika Anda mencurigai bott perfek maka tempel profiler pada kode Anda dan lihat di mana itu sebenarnya.
sumber
.ToString()
padaStringBuilder
objek. Lebih dari banyak iterasi, waktu itu membuat perbedaan besar, dan berarti dia tidak cukup membandingkan apel dengan apel. Itulah alasan dia menunjukkan kinerja yang luar biasaStringBuilder
dan mungkin mengejutkannya. Saya hanya mengulangi tolok ukur yang memperbaiki kesalahan itu dan mendapatkan hasil yang diharapkan:String
+
operator itu tercepat, diikuti olehStringBuilder
, denganString.Format
mengangkat bagian belakang.Dari dokumentasi MSDN :
sumber
Saya menjalankan beberapa tolok ukur kinerja cepat, dan untuk 100.000 operasi rata-rata lebih dari 10 kali berjalan, metode pertama (String Builder) mengambil hampir separuh waktu yang kedua (String Format).
Jadi, jika ini jarang terjadi, itu tidak masalah. Tetapi jika ini adalah operasi yang umum, maka Anda mungkin ingin menggunakan metode pertama.
sumber
Saya harapkan String.Format lebih lambat - itu harus mengurai string dan kemudian menyatukannya.
Beberapa catatan:
sumber
Saya pikir dalam banyak kasus seperti kejelasan ini, dan bukan efisiensi, harus menjadi perhatian terbesar Anda. Kecuali jika Anda menyatukan banyak string, atau membuat sesuatu untuk perangkat seluler berdaya rendah, ini mungkin tidak akan banyak mengurangi kecepatan lari Anda.
Saya telah menemukan bahwa, dalam kasus-kasus di mana saya membangun string dengan cara yang cukup linier, baik melakukan penggabungan lurus atau menggunakan StringBuilder adalah pilihan terbaik Anda. Saya menyarankan ini dalam kasus di mana sebagian besar string yang Anda buat adalah dinamis. Karena sangat sedikit teks yang statis, yang paling penting adalah jelas di mana setiap bagian teks dinamis dimasukkan jika perlu diperbarui di masa depan.
Di sisi lain, jika Anda berbicara tentang sebagian besar teks statis dengan dua atau tiga variabel di dalamnya, bahkan jika itu sedikit kurang efisien, saya pikir kejelasan yang Anda peroleh dari string. Saya menggunakan ini awal minggu ini ketika harus menempatkan satu bit teks dinamis di tengah dokumen 4 halaman. Akan lebih mudah untuk memperbarui potongan besar teks itu jika dalam satu bagian daripada harus memperbarui tiga bagian yang Anda gabungkan bersama.
sumber
Jika hanya karena string. Kebiasaan tidak persis melakukan apa yang Anda pikirkan, berikut ini adalah ulangan dari tes 6 tahun kemudian di Net45.
Concat masih tercepat tetapi sebenarnya perbedaannya kurang dari 30%. StringBuilder dan Format berbeda hampir 5-10%. Saya mendapat variasi 20% menjalankan tes beberapa kali.
Milidetik, sejuta iterasi:
Pelajaran yang saya ambil adalah bahwa perbedaan kinerja itu sepele dan karena itu seharusnya tidak menghentikan Anda menulis kode yang paling mudah dibaca yang Anda bisa. Yang untuk uang saya sering tetapi tidak selalu
a + b + c
.sumber
String.Format menggunakan
StringBuilder
internal ... jadi secara logis yang mengarah pada gagasan bahwa itu akan menjadi sedikit kurang berkinerja karena lebih banyak overhead. Namun, penggabungan string sederhana adalah metode tercepat untuk menyuntikkan satu string antara dua string lainnya ... dengan tingkat yang signifikan. Bukti ini ditunjukkan oleh Rico Mariani dalam Kuis Kinerja pertamanya, tahun lalu. Fakta sederhananya adalah penggabungan ... ketika jumlah bagian string diketahui (tanpa batasan ... Anda dapat menggabungkan seribu bagian ... selama Anda tahu selalu 1000 bagian) ... selalu lebih cepat daripadaStringBuilder
atau String. Format. Mereka dapat dilakukan dengan alokasi memori tunggal dan serangkaian salinan memori. Ini buktinyaDan di sini adalah kode aktual untuk beberapa metode String.Compat, yang pada akhirnya memanggil FillStringChecked yang menggunakan pointer untuk menyalin memori (diekstraksi melalui Reflektor):
Sehingga kemudian:
Nikmati!
sumber
Oh juga, yang tercepat adalah:
sumber
StringBuilder
yang dibuat untuk mengoptimalkan jenis pengkodean ini di tempat pertama.Itu sangat tergantung. Untuk string kecil dengan beberapa rangkaian, itu sebenarnya lebih cepat hanya untuk menambahkan string.
Tetapi untuk string yang lebih besar (string yang sangat sangat besar), maka lebih efisien untuk menggunakan StringBuilder.
sumber
Dalam hal ini, saya akan menyarankan String.Format adalah yang tercepat karena dirancang untuk tujuan yang tepat.
sumber
Itu sangat tergantung pada pola penggunaan Anda.
Patokan terperinci antara
string.Join
,string,Concat
danstring.Format
dapat ditemukan di sini: String.Format Tidak Cocok untuk Pencatatan Intensifsumber
Saya tidak menyarankan, karena String.Format tidak dirancang untuk digabungkan, itu dirancang untuk memformat output dari berbagai input seperti tanggal.
sumber