Saya bekerja melalui Ruby Koans.
The test_the_shovel_operator_modifies_the_original_string
Koan di about_strings.rb termasuk komentar berikut:
Pemrogram Ruby cenderung lebih menyukai operator shovel (<<) daripada operator plus sama dengan (+ =) saat membangun string. Mengapa?
Dugaan saya adalah ini melibatkan kecepatan, tetapi saya tidak mengerti aksi di bawah kap yang akan menyebabkan operator shovel lebih cepat.
Apakah seseorang dapat menjelaskan detail di balik preferensi ini?
ruby
string
optimization
erinbrown
sumber
sumber
Jawaban:
Bukti:
Jadi
<<
ubah string asli daripada membuat yang baru. Alasan untuk ini adalah bahwa dalam rubya += b
adalah singkatan sintaksis untuka = a + b
(yang sama berlaku untuk<op>=
operator lain ) yang merupakan tugas. Di sisi lain<<
adalah aliasconcat()
yang mengubah penerima di tempat.sumber
Array#join
lebih lambat daripada menggunakan<<
.Bukti kinerja:
sumber
Seorang teman yang mempelajari Ruby sebagai bahasa pemrograman pertamanya bertanya kepada saya pertanyaan yang sama saat ini melalui Strings in Ruby pada seri Ruby Koans. Saya menjelaskannya kepadanya menggunakan analogi berikut;
Anda memiliki segelas air yang setengah penuh dan Anda perlu mengisi ulang gelas Anda.
Cara pertama Anda melakukannya dengan mengambil gelas baru, mengisinya setengah dengan air dari keran dan kemudian menggunakan gelas setengah penuh kedua ini untuk mengisi gelas minum Anda. Anda melakukan ini setiap kali Anda perlu mengisi ulang gelas Anda.
Cara kedua Anda mengambil setengah gelas penuh dan isi ulang dengan air langsung dari keran.
Pada akhir hari, Anda akan memiliki lebih banyak kacamata untuk dibersihkan jika Anda memilih untuk mengambil gelas baru setiap kali Anda perlu mengisi ulang gelas Anda.
Hal yang sama berlaku untuk operator shovel dan operator plus sama. Ditambah lagi operator yang sama mengambil 'gelas' baru setiap kali perlu mengisi ulang gelasnya sementara operator shovel hanya mengambil gelas yang sama dan mengisinya kembali. Pada akhirnya, lebih banyak koleksi 'gelas' untuk operator setara Plus.
sumber
Ini adalah pertanyaan lama, tetapi saya hanya berlari melewatinya dan saya tidak sepenuhnya puas dengan jawaban yang ada. Ada banyak poin bagus tentang shovel << lebih cepat daripada concatenation + =, tetapi ada juga pertimbangan semantik.
Jawaban yang diterima dari @noodl menunjukkan bahwa << memodifikasi objek yang ada di tempatnya, sedangkan + = membuat objek baru. Jadi, Anda perlu mempertimbangkan apakah Anda ingin semua referensi ke string mencerminkan nilai baru, atau apakah Anda ingin meninggalkan referensi yang ada sendirian dan membuat nilai string baru untuk digunakan secara lokal. Jika Anda membutuhkan semua referensi untuk mencerminkan nilai yang diperbarui, maka Anda perlu menggunakan <<. Jika Anda ingin meninggalkan referensi lain sendirian, maka Anda perlu menggunakan + =.
Kasus yang sangat umum adalah hanya ada satu referensi ke string. Dalam hal ini, perbedaan semantik tidak masalah dan itu wajar untuk memilih << karena kecepatannya.
sumber
Karena lebih cepat / tidak membuat salinan string <-> pengumpul sampah tidak perlu dijalankan.
sumber
malloc
/free
. Juga, beberapa implementasi Ruby yang lebih modern mungkin akan mengoptimalkan alokasi objek dan penggabungan string sepenuhnya. OTOH, bermutasi objek sangat buruk untuk kinerja GC.Meskipun sebagian besar jawaban mencakup
+=
lebih lambat karena membuat salinan baru, penting untuk diingat bahwa+=
dan<<
tidak dapat dipertukarkan! Anda ingin menggunakan masing-masing dalam kasus yang berbeda.Menggunakan
<<
juga akan mengubah variabel apa pun yang diarahkanb
. Di sini kita juga bermutasia
ketika kita mungkin tidak mau.Karena
+=
membuat salinan baru, itu juga meninggalkan variabel apa pun yang menunjuk ke sana tidak berubah.Memahami perbedaan ini dapat menghemat banyak sakit kepala saat Anda berurusan dengan loop!
sumber
Meskipun bukan jawaban langsung untuk pertanyaan Anda, mengapa The Fully Upturned Bin selalu menjadi salah satu artikel Ruby favorit saya. Ini juga berisi beberapa info tentang string terkait dengan pengumpulan sampah.
sumber