Penjelasan Anda mengapa tidak efisien itu akurat, setidaknya dalam bahasa yang saya kenal (C, Java, C #), meskipun saya tidak setuju bahwa secara umum lazim untuk melakukan penggabungan string dalam jumlah besar. Dalam C # kode saya bekerja, ada penggunaan berlebihan StringBuilder
, String.Format
, dll yang semuanya menyimpan techiniques untuk menghindari over-realokasi memori.
Jadi untuk mendapatkan jawaban atas pertanyaan Anda, kami harus mengajukan pertanyaan lain: jika tidak pernah benar-benar masalah untuk merangkai string, mengapa kelas suka StringBuilder
dan StringBuffer
ada ? Mengapa penggunaan kelas semacam itu termasuk dalam buku dan kelas pemrograman semi-pemula? Mengapa saran pengoptimalan yang tampaknya pra-matang begitu menonjol?
Jika sebagian besar pengembang penggabung string mendasarkan jawaban mereka semata-mata pada pengalaman, sebagian besar akan mengatakan itu tidak akan membuat perbedaan dan akan menghindari penggunaan alat-alat seperti itu demi "lebih mudah dibaca" for (int i=0; i<1000; i++) { strA += strB; }
. Tetapi mereka tidak pernah mengukurnya.
Jawaban sebenarnya untuk pertanyaan ini dapat ditemukan dalam jawaban SO ini , yang mengungkapkan bahwa dalam satu contoh, ketika menggabungkan 50.000 string (yang tergantung pada aplikasi Anda, mungkin merupakan kejadian umum), bahkan yang kecil, menghasilkan hit performa 1000x .
Jika kinerja secara harfiah tidak berarti apa-apa, tentu saja disatukan. Tetapi saya akan tidak setuju bahwa menggunakan alternatif (StringBuilder) sulit atau kurang dapat dibaca , dan oleh karena itu akan menjadi praktik pemrograman yang masuk akal yang seharusnya tidak meminta pertahanan "optimasi prematur".
MEMPERBARUI:
Saya pikir apa yang terjadi, mengetahui platform Anda dan mengikuti praktik terbaiknya, yang sayangnya tidak universal . Dua contoh dari dua "bahasa modern" yang berbeda:
- Dalam jawaban SO yang lain , karakteristik kinerja sebaliknya yang tepat (array.join vs + =) ditemukan terkadang benar dalam JavaScript . Di beberapa browser, rangkaian string tampaknya dioptimalkan secara otomatis, dan dalam kasus lain tidak. Jadi rekomendasinya (setidaknya dalam pertanyaan SO), adalah untuk menyatukan dan tidak khawatir tentang hal itu.
- Dalam kasus lain, kompiler Java dapat secara otomatis mengganti concatenation dengan konstruk yang lebih efisien seperti StringBuilder. Namun, seperti yang orang lain tunjukkan, ini tidak pasti, tidak dijamin, dan menggunakan StringBuilder tidak mengganggu keterbacaan. Dalam kasus khusus ini, saya cenderung merekomendasikan untuk tidak menggunakan penggabungan untuk koleksi besar atau mengandalkan perilaku kompiler Java indeterministik. Demikian pula, di .NET, tidak ada optimasi semacam itu dilakukan , pernah.
Ini bukan dosa utama untuk tidak mengetahui setiap nuansa dari setiap platform segera, tetapi mengabaikan masalah platform penting seperti ini hampir akan seperti pindah dari Jawa ke C ++ dan tidak peduli tentang deallocating memori.