Apakah Anda tahu jika menggunakan tanda kutip ganda sebagai ganti tanda kutip tunggal di ruby mengurangi kinerja dengan cara apa pun yang berarti di ruby 1.8 dan 1.9.
jadi jika saya mengetik
question = 'my question'
apakah lebih cepat dari
question = "my question"
Saya membayangkan ruby mencoba mencari tahu apakah sesuatu perlu dievaluasi ketika bertemu dengan tanda kutip ganda dan mungkin menghabiskan beberapa siklus melakukan hal itu.
ruby
performance
syntax
dimus
sumber
sumber
Jawaban:
Catatan: Saya telah memperbarui ini untuk membuatnya berfungsi dengan versi Ruby yang lebih baru, dan membersihkan header, dan menjalankan patokan pada sistem yang lebih cepat.
Jawaban ini menghilangkan beberapa poin penting. Lihat terutama jawaban-jawaban lain mengenai interpolasi ini dan alasannya tidak ada perbedaan kinerja yang signifikan ketika menggunakan tanda kutip tunggal vs ganda.
sumber
'
dan"
karena mereka diuraikan untuk hal yang sama.Ringkasan: tidak ada perbedaan kecepatan; panduan gaya Ruby kolaboratif yang hebat ini merekomendasikan untuk konsisten. Saya sekarang menggunakan
'string'
kecuali interpolasi diperlukan (opsi A dalam panduan ini) dan menyukainya, tetapi Anda biasanya akan melihat lebih banyak kode"string"
.Detail:
Secara teoritis, ini dapat membuat perbedaan ketika kode Anda diurai , tetapi tidak hanya jika Anda tidak peduli tentang waktu parse secara umum (diabaikan dibandingkan dengan waktu eksekusi), Anda tidak akan dapat menemukan perbedaan yang signifikan dalam kasus ini.
Yang penting adalah bahwa ketika dieksekusi akan persis sama .
Pembandingan ini hanya menunjukkan kurangnya pemahaman tentang cara kerja Ruby. Dalam kedua kasus, string akan diurai menjadi
tSTRING_CONTENT
(lihat sumber diparse.y
). Dengan kata lain, CPU akan melalui operasi yang sama persis saat membuat'string'
atau"string"
. Bit yang sama persis akan membalik dengan cara yang sama persis. Benchmarking ini hanya akan menunjukkan perbedaan yang tidak signifikan dan karena faktor lain (GC menendang, dll.); ingat, tidak ada perbedaan dalam hal ini! Tolok ukur mikro seperti ini sulit untuk diperbaiki. Lihat permata sayafruity
untuk alat yang layak untuk ini.Perhatikan bahwa jika ada interpolasi formulir
"...#{...}..."
, ini akan diuraikan ke atSTRING_DBEG
, banyaktSTRING_DVAR
untuk setiap ekspresi#{...}
dan finaltSTRING_DEND
. Itu hanya jika ada interpolasi, yang bukan tentang OP.Saya dulu menyarankan Anda menggunakan tanda kutip ganda di mana-mana (membuatnya lebih mudah untuk benar-benar menambahkannya
#{some_var}
nanti), tetapi saya sekarang menggunakan tanda kutip tunggal kecuali saya perlu interpolasi\n
,, dll. Saya suka secara visual dan itu sedikit lebih eksplisit, karena tidak ada perlu mengurai string untuk melihat apakah mengandung ekspresi apa pun.sumber
#{n}
akan melakukan konversi nomor). Apakah itu tidak menunjukkan perbedaan parsing?Namun tidak ada yang mengukur konkatasi vs interpolasi:
Secara khusus, perhatikan
assign interp = 2.62
vsconcat single = 3.76
. Sebagai lapisan gula pada kue, saya juga menemukan interpolasi lebih mudah dibaca daripada'a' + var + 'b'
terutama berkaitan dengan spasi.sumber
Tidak ada perbedaan - kecuali jika Anda menggunakan
#{some_var}
interpolasi string gaya. Tetapi Anda hanya mendapatkan kinerja yang baik jika Anda benar-benar melakukannya.Dimodifikasi dari contoh Zetetic :
keluaran
sumber
Kutipan tunggal dapat menjadi sedikit lebih cepat daripada tanda kutip ganda karena lexer tidak harus memeriksa
#{}
penanda interpolasi. Bergantung pada implementasi, dll. Perhatikan bahwa ini adalah biaya waktu parse, bukan biaya waktu berjalan.Yang mengatakan, pertanyaan sebenarnya adalah apakah menggunakan string dikutip ganda "menurunkan kinerja dengan cara yang berarti", yang jawabannya adalah "tidak" yang menentukan. Perbedaan kinerja sangat kecil sehingga sama sekali tidak signifikan dibandingkan dengan masalah kinerja nyata. Jangan buang waktu Anda.
Interpolasi yang sebenarnya adalah cerita yang berbeda, tentu saja.
'foo'
akan hampir tepat 1 detik lebih cepat daripada"#{sleep 1; nil}foo"
.sumber
Kutipan ganda membutuhkan dua kali lebih banyak serangan kunci untuk diketik daripada kutipan tunggal. Saya selalu terburu-buru. Saya menggunakan tanda kutip tunggal. :) Dan ya, saya menganggap itu "peningkatan kinerja". :)
sumber
Saya pikir saya akan menambahkan perbandingan 1,8.7 dan 1.9.2. Saya berlari mereka beberapa kali. Varians sekitar + -0,01.
ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux]
ruby 1.9.2p0 (revisi 2010-08-18 29036) [x86_64-linux]
sumber
Tidak ada perbedaan signifikan di kedua arah. Itu harus besar untuk itu penting.
Kecuali untuk saat-saat ketika Anda yakin ada masalah aktual dengan pengaturan waktu, optimalkan untuk pemeliharaan programmer.
Biaya waktu alat berat sangat kecil. Biaya waktu programmer untuk menulis kode dan memeliharanya sangat besar.
Apa gunanya pengoptimalan untuk menghemat detik, bahkan menit runtime selama ribuan berjalan jika itu berarti bahwa kode lebih sulit dipertahankan?
Memilih dengan gaya dan tongkat dengan itu tetapi tidak memilih gaya berdasarkan milidetik statistik tidak signifikan dari runtime.
sumber
Saya juga berpikir bahwa string yang dikutip tunggal mungkin lebih cepat untuk diuraikan untuk Ruby. Sepertinya tidak demikian.
Bagaimanapun, saya pikir tolok ukur di atas mengukur hal yang salah. Masuk akal bahwa kedua versi akan diuraikan ke dalam representasi string internal yang sama sehingga untuk mendapatkan jawaban yang lebih cepat diurai, kita tidak seharusnya mengukur kinerja dengan variabel string, melainkan kecepatan string penguraian Ruby.
Menjalankan berulang tampaknya tidak membuat banyak perbedaan. Masih membutuhkan waktu yang hampir bersamaan untuk mengurai kedua versi string.
sumber
Ini tentu mungkin tergantung pada implementasinya, tetapi bagian pemindaian juru bahasa hanya boleh melihat setiap karakter sekali saja. Ini akan membutuhkan hanya status tambahan (atau kemungkinan serangkaian kondisi) dan transisi untuk menangani blok # {}.
Dalam pemindai berbasis tabel, itu akan menjadi pencarian tunggal untuk menentukan transisi, dan akan terjadi untuk setiap karakter.
Ketika parser mendapatkan hasil pemindai, sudah diketahui bahwa ia harus eval kode di blok. Jadi overhead hanya benar-benar overhead memori dalam pemindai / pengurai untuk menangani blok # {}, yang Anda bayar dengan cara apa pun.
Kecuali jika saya melewatkan sesuatu (atau salah mengingat detail konstruksi kompiler), yang tentunya juga mungkin :)
sumber
sumber
Ada satu yang kalian semua lewatkan.
DI SINI doc
coba ini
Itu memberi saya
dan
jadi tentu saja lebih baik daripada concat dan menulis semua put itu.
Saya ingin melihat Ruby mengajar lebih banyak di sepanjang garis bahasa manipulasi dokumen.
Lagipula, bukankah kita benar-benar melakukannya di Rails, Sinatra, dan menjalankan tes?
sumber
Saya mengubah jawaban Tim Snowhite.
Hasil:
sumber
Saya mencoba yang berikut ini:
Dan ini adalah outputnya:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Jika saya tidak membuat kesalahan, menurut saya keduanya membutuhkan waktu yang kira-kira sama, walaupun single quotes sedikit lebih cepat dalam kebanyakan kasus.
sumber