Ya, perbedaan kinerja sangat signifikan. Lihat artikel KB " Cara meningkatkan kinerja penggabungan string dalam Visual C # ".
Saya selalu mencoba kode untuk kejelasan terlebih dahulu, dan kemudian mengoptimalkan kinerja nanti. Itu jauh lebih mudah daripada melakukannya sebaliknya! Namun, setelah melihat perbedaan kinerja yang sangat besar dalam aplikasi saya antara keduanya, saya sekarang memikirkannya sedikit lebih hati-hati.
Untungnya, relatif mudah untuk menjalankan analisis kinerja pada kode Anda untuk melihat di mana Anda menghabiskan waktu, dan kemudian memodifikasinya untuk digunakan di StringBuilder
mana diperlukan.
Untuk memperjelas apa yang dikatakan Gillian tentang 4 string, jika Anda memiliki sesuatu seperti ini:
maka akan lebih cepat menggunakan string dan operator plus. Ini karena (seperti Java, seperti yang ditunjukkan Eric), secara internal menggunakan StringBuilder secara otomatis (Sebenarnya, ia menggunakan primitif yang juga digunakan StringBuilder)
Namun, jika apa yang Anda lakukan lebih dekat dengan:
Maka Anda perlu secara eksplisit menggunakan StringBuilder. .Net tidak secara otomatis membuat StringBuilder di sini, karena tidak ada gunanya Di akhir setiap baris, "a" harus berupa string (tidak dapat diubah), sehingga harus membuat dan membuang StringBuilder di setiap baris. Untuk kecepatan, Anda harus menggunakan StringBuilder yang sama sampai Anda selesai membangun:
sumber
a
merupakan variabel lokal, dan objek yang dirujuknya belum ditugaskan ke beberapa variabel lain (yang mungkin dapat diakses oleh utas lainnya), pengoptimal yang baik dapat menentukan bahwaa
tidak diakses oleh kode lain selama urutan ini. garis; hanya nilai akhir daria
masalah. Jadi itu bisa memperlakukan ketiga baris kode itu seolah-olah ditulisa = b + c + d;
.StringBuilder lebih disukai JIKA Anda melakukan banyak loop, atau fork dalam pass kode Anda ... namun, untuk kinerja PURE, jika Anda bisa lolos dengan deklarasi string TUNGGAL , maka itu jauh lebih performant.
Sebagai contoh:
lebih berkinerja daripada
Dalam hal ini, StringBuild dapat dianggap lebih dapat dipertahankan, tetapi tidak lebih berkinerja daripada deklarasi string tunggal.
9 kali dari 10 ... gunakan pembuat string.
Di samping catatan: string + var juga lebih performant daripada pendekatan string.Format (umumnya) yang menggunakan StringBuilder secara internal (jika ragu ... periksa reflektor!)
sumber
Contoh sederhana untuk menunjukkan perbedaan kecepatan saat menggunakan
String
gabungan vsStringBuilder
:Hasil:
Hasil:
Akibatnya, iterasi pertama mengambil 15423 ms sedangkan iterasi kedua menggunakan
StringBuilder
10 ms.Menurut saya, menggunakan
StringBuilder
lebih cepat, jauh lebih cepat.sumber
Penghitungan ini menunjukkan bahwa rangkaian reguler lebih cepat saat menggabungkan 3 string atau lebih sedikit.
http://www.chinhdo.com/20070224/stringbuilder-is-not-always-faster/
StringBuilder dapat membuat peningkatan yang sangat signifikan dalam penggunaan memori, terutama dalam kasus Anda menambahkan 500 string bersama.
Perhatikan contoh berikut:
Apa yang terjadi dalam memori? String berikut ini dibuat:
Dengan menambahkan kelima angka itu di akhir string, kami membuat 13 objek string! Dan 12 dari mereka tidak berguna! Wow!
StringBuilder memperbaiki masalah ini. Ini bukan "string yang bisa berubah-ubah" seperti yang sering kita dengar ( semua string dalam. NET tidak dapat diubah ). Ia bekerja dengan menjaga buffer internal, array char. Memanggil Tambah () atau AppendLine () menambahkan string ke ruang kosong di akhir array char; jika array terlalu kecil, itu menciptakan array baru yang lebih besar, dan menyalin buffer di sana. Jadi dalam contoh di atas, StringBuilder mungkin hanya perlu satu array untuk memuat semua 5 tambahan ke string - tergantung pada ukuran buffer-nya. Anda bisa memberi tahu StringBuilder seberapa besar buffernya seharusnya ada di konstruktor.
sumber
i.ToString()
. Jadi dengan StringBuilder, Anda masih harus membuat string 6 +1; itu berkurang membuat 13 string menjadi 7 string. Tapi itu masih cara yang salah untuk melihatnya; penciptaan enam angka tidak relevan. Intinya: Anda seharusnya tidak menyebutkan keenam string yang dibuat olehi.ToString()
; mereka bukan bagian dari perbandingan efisiensi.Ya,
StringBuilder
memberikan kinerja yang lebih baik saat melakukan operasi berulang melalui string. Itu karena semua perubahan dibuat untuk satu instance sehingga dapat menghemat banyak waktu alih-alih membuat instance baru sepertiString
.String Vs Stringbuilder
String
System
namespaceStringBuilder
(string yang bisa berubah-ubah)System.Text
namespacesumber
String Vs String Builder:
Hal pertama yang harus Anda ketahui bahwa Di mana perakitan kedua kelas ini hidup?
Begitu,
string hadir di
System
namespace.dan
StringBuilder hadir di
System.Text
namespace.Untuk deklarasi string :
Anda harus memasukkan
System
namespace. sesuatu seperti ini.Using System;
dan
Untuk deklarasi StringBuilder :
Anda harus memasukkan
System.text
namespace. sesuatu seperti ini.Using System.text;
Sekarang Hadir Pertanyaan yang sebenarnya.
Apa perbedaan antara string & StringBuilder ?
Perbedaan utama antara keduanya adalah:
string tidak dapat diubah.
dan
StringBuilder bisa berubah.
Jadi Sekarang mari kita bahas perbedaan antara tidak berubah dan bisa berubah
Dapat berubah:: berarti Dapat diubah.
Abadi:: berarti Tidak Berubah.
Sebagai contoh:
Jadi dalam hal ini kita akan mengubah objek yang sama sebanyak 5 kali.
Jadi pertanyaan yang jelas adalah itu! Apa yang sebenarnya terjadi di bawah tenda, ketika kita mengganti string yang sama 5 kali.
Ini Yang Terjadi ketika kita mengganti string yang sama 5 kali.
mari lihat gambar.
Penjelasan:
Ketika kami pertama kali menginisialisasi variabel ini "nama" menjadi "Rehan" yaitu
string name = "Rehan"
variabel ini dibuat pada tumpukan "nama" dan menunjuk ke nilai "Rehan" itu. setelah baris ini dieksekusi: "name = name +" Shah ". variabel referensi tidak lagi menunjuk ke objek itu" Rehan "sekarang menunjuk ke" Shah "dan seterusnya.Begitu
string
juga makna abadi bahwa begitu kita membuat objek dalam memori kita tidak bisa mengubahnya.Jadi ketika kita menggabungkan
name
variabel objek sebelumnya tetap ada di memori dan objek string baru dibuat ...Jadi dari gambar di atas kita memiliki lima objek, empat objek dibuang mereka tidak digunakan sama sekali. Mereka masih tinggal di memori dan mereka menghitung jumlah memori. "Pengumpul Sampah" bertanggung jawab untuk itu begitu bersih sumber daya dari memori.
Jadi dalam kasus string kapan saja ketika kita memanipulasi string berulang-ulang kita memiliki beberapa objek yang dibuat dan tinggal di sana di dalam memori.
Jadi ini adalah kisah string Variable.
Sekarang mari kita lihat ke arah objek StringBuilder. Sebagai contoh:
Jadi dalam hal ini kita akan mengubah objek yang sama sebanyak 5 kali.
Jadi pertanyaan yang jelas adalah itu! Apa yang sebenarnya terjadi di bawah tenda, ketika kita mengubah StringBuilder yang sama sebanyak 5 kali.
Ini Yang Terjadi ketika kita mengubah StringBuilder yang sama sebanyak 5 kali.
mari lihat gambar.
Penjelasan: Dalam kasus objek StringBuilder. Anda tidak akan mendapatkan objek baru. Objek yang sama akan berubah dalam memori jadi bahkan jika Anda mengubah objek dan mengatakan 10.000 kali kita masih akan memiliki hanya satu objek stringBuilder.
Anda tidak memiliki banyak objek sampah atau objek stringBuilder non_referensi karena itu dapat diubah. Apakah bisa berubah artinya berubah seiring waktu?
Perbedaan:
sumber
StringBuilder mengurangi jumlah alokasi dan penugasan, dengan biaya memori tambahan yang digunakan. Digunakan dengan benar, itu benar-benar dapat menghapus kebutuhan untuk kompiler untuk mengalokasikan string yang lebih besar dan lebih besar sampai hasilnya ditemukan.
vs.
sumber
Sumber: MSDN
sumber
StringBuilder
lebih baik untuk membangun string dari banyak nilai yang tidak konstan.Jika Anda membangun string dari banyak nilai konstan, seperti beberapa baris nilai dalam dokumen HTML atau XML atau potongan teks lainnya, Anda bisa lolos dengan hanya menambahkan ke string yang sama, karena hampir semua kompiler melakukan "konstanta lipat", proses mengurangi pohon parse ketika Anda memiliki banyak manipulasi konstan (itu juga digunakan ketika Anda menulis sesuatu seperti
int minutesPerYear = 24 * 365 * 60
). Dan untuk kasus-kasus sederhana dengan nilai-nilai tidak konstan yang ditambahkan satu sama lain, kompiler .NET akan mengurangi kode Anda menjadi sesuatu yang mirip dengan apa yangStringBuilder
dilakukannya.Tetapi ketika append Anda tidak dapat direduksi menjadi sesuatu yang lebih sederhana oleh kompiler, Anda akan menginginkannya
StringBuilder
. Seperti yang ditunjukkan fizch, itu lebih mungkin terjadi di dalam satu lingkaran.sumber
Saya percaya StringBuilder lebih cepat jika Anda memiliki lebih dari 4 string yang perlu Anda tambahkan bersama. Plus itu dapat melakukan beberapa hal keren seperti AppendLine.
sumber
Di .NET, StringBuilder masih lebih cepat daripada menambahkan string. Saya cukup yakin bahwa di Jawa, mereka hanya membuat StringBuffer di bawah tenda ketika Anda menambahkan string, jadi sebenarnya tidak ada perbedaan. Saya tidak yakin mengapa mereka belum melakukan ini di. NET.
sumber
Pertimbangkan ' Tragedi Sedih Teater Mikro-Optimalisasi '.
sumber
Menggunakan string untuk rangkaian dapat menyebabkan kompleksitas runtime pada urutan
O(n^2)
.Jika Anda menggunakan
StringBuilder
, ada banyak penyalinan memori yang harus dilakukan. DenganStringBuilder(int capacity)
Anda dapat meningkatkan kinerja jika Anda dapat memperkirakan seberapa besar finalString
akan menjadi. Bahkan jika Anda tidak tepat, Anda mungkin hanya perlu meningkatkan kapasitasStringBuilder
beberapa kali yang dapat membantu kinerja juga.sumber
Saya telah melihat keuntungan kinerja yang signifikan dari menggunakan
EnsureCapacity(int capacity)
pemanggilan metode pada contohStringBuilder
sebelum menggunakannya untuk penyimpanan string. Saya biasanya menyebutnya pada baris kode setelah instantiation. Ini memiliki efek yang sama seperti jika Anda instantiateStringBuilder
seperti ini:Panggilan ini mengalokasikan memori yang diperlukan sebelumnya, yang menyebabkan alokasi memori lebih sedikit selama beberapa
Append()
operasi. Anda harus membuat perkiraan berpendidikan tentang berapa banyak memori yang Anda butuhkan, tetapi untuk sebagian besar aplikasi ini seharusnya tidak terlalu sulit. Saya biasanya berbuat salah di sisi memori terlalu banyak (kita berbicara 1k atau lebih).sumber
EnsureCapacity
setelahStringBuilder
instantiasi. Cukup instantiateStringBuilder
seperti ini:var sb = new StringBuilder(int capacity)
.Lebih jauh dari jawaban sebelumnya, hal pertama yang selalu saya lakukan ketika memikirkan masalah seperti ini adalah membuat aplikasi tes kecil. Di dalam aplikasi ini, lakukan beberapa tes waktu untuk kedua skenario dan lihat sendiri mana yang lebih cepat.
IMHO, menambahkan 500+ entri string harus menggunakan StringBuilder.
sumber
String dan StringBuilder sebenarnya tidak berubah, StringBuilder telah dibangun di buffer yang memungkinkan ukurannya dikelola lebih efisien. Ketika StringBuilder perlu mengubah ukuran adalah ketika dialokasikan kembali di heap. Secara default ukurannya adalah 16 karakter, Anda dapat mengatur ini di konstruktor.
misalnya.
StringBuilder sb = new StringBuilder (50);
sumber
Rangkaian string akan dikenakan biaya lebih banyak. Di Jawa, Anda dapat menggunakan StringBuffer atau StringBuilder berdasarkan kebutuhan Anda. Jika Anda ingin implementasi yang disinkronkan, dan utas aman, buka StringBuffer. Ini akan lebih cepat daripada penggabungan String.
Jika Anda tidak membutuhkan implementasi yang disinkronkan atau aman, buka StringBuilder. Ini akan lebih cepat daripada penggabungan String dan juga lebih cepat dari StringBuffer karena tidak ada overhead sinkronisasi.
sumber
StringBuilder mungkin lebih disukai. Alasannya adalah bahwa ia mengalokasikan lebih banyak ruang daripada yang dibutuhkan saat ini (Anda mengatur jumlah karakter) untuk memberikan ruang bagi penambahan di masa mendatang. Kemudian mereka menambahkan masa depan yang sesuai dengan buffer saat ini tidak memerlukan alokasi memori atau pengumpulan sampah, yang bisa mahal. Secara umum, saya menggunakan StringBuilder untuk concatentation string yang kompleks atau banyak format, kemudian dikonversi ke String normal ketika data selesai, dan saya ingin objek yang tidak dapat diubah lagi.
sumber
Jika Anda melakukan banyak penggabungan string, gunakan StringBuilder. Ketika Anda menggabungkan dengan String, Anda membuat String baru setiap kali, menggunakan lebih banyak memori.
Alex
sumber
Sebagai aturan umum, jika saya harus menetapkan nilai string lebih dari satu kali, atau jika ada tambahan pada string, maka itu harus menjadi pembangun string. Saya telah melihat aplikasi yang telah saya tulis di masa lalu sebelum belajar tentang pembangun tali yang memiliki cetakan kaki memori besar yang sepertinya terus tumbuh dan berkembang. Mengubah program-program ini untuk menggunakan pembangun string mengurangi penggunaan memori secara signifikan. Sekarang saya bersumpah dengan pembuat string.
sumber
Pendekatan saya selalu menggunakan StringBuilder ketika menggabungkan 4 atau lebih string ATAU Ketika saya tidak tahu bagaimana mungkin rangkaian akan terjadi.
Artikel terkait kinerja bagus di sini
sumber
StringBuilder
secara signifikan lebih efisien tetapi Anda tidak akan melihat kinerja kecuali Anda melakukan banyak modifikasi string.Di bawah ini adalah potongan kode cepat untuk memberikan contoh kinerja. Seperti yang Anda lihat, Anda benar-benar hanya mulai melihat peningkatan kinerja besar ketika Anda masuk ke iterasi besar.
Seperti yang Anda lihat, 200.000 iterasi membutuhkan waktu 22 detik, sedangkan 1 juta iterasinya
StringBuilder
hampir instan.Hasil dari kode di atas:
sumber
StringBuilder akan berkinerja lebih baik, dari sudut pandang memori. Sedangkan untuk pemrosesan, perbedaan waktu eksekusi dapat diabaikan.
sumber