Kawan, saya punya beberapa pertanyaan:
- Apakah ada perbedaan kinerja dalam JavaScript antara
switch
pernyataan danif...else
? - Jika demikian mengapa?
- Apakah perilaku
switch
danif...else
perbedaan antar browser? (FireFox, IE, Chrome, Opera, Safari)
Alasan untuk mengajukan pertanyaan ini adalah sepertinya saya mendapatkan kinerja yang lebih baik pada switch
pernyataan dengan sekitar 1000-an kasus di Firefox.
Diedit Sayangnya ini bukan kode saya, Javascript sedang diproduksi di sisi server dari perpustakaan yang dikompilasi dan saya tidak memiliki akses ke kode tersebut. Metode yang menghasilkan javascript disebut
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
note arrayofvalues
adalah daftar yang dipisahkan koma.
apa yang ia hasilkan adalah
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Catatan: where [name]
= nama diteruskan ke fungsi serveride
Sekarang saya mengubah output dari fungsi yang akan dimasukkan ke dalam TextArea, menulis beberapa kode JavaScript untuk mem-parsing melalui fungsi, dan mengubahnya menjadi seperangkat case
pernyataan.
akhirnya saya menjalankan fungsinya dan itu berjalan dengan baik tetapi kinerja berbeda di IE dan Firefox.
sumber
Jawaban:
Menjawab secara umum:
Situs uji
sumber
switch
danif/then
pernyataan di JS. Artikel ini menyatakan ini karenaswitch
optimasi jerawatan dan cara fungsi mesin JS yang berbeda. Quote:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
Terkadang lebih baik tidak menggunakan keduanya. Misalnya, dalam situasi "pengiriman", Javascript memungkinkan Anda melakukan sesuatu dengan cara yang sama sekali berbeda:
Menyiapkan percabangan multi-arah dengan membuat objek memiliki banyak keuntungan. Anda dapat menambah dan menghapus fungsionalitas secara dinamis. Anda dapat membuat tabel pengiriman dari data. Anda dapat memeriksanya secara terprogram. Anda dapat membangun penangan dengan fungsi lain.
Ada overhead yang ditambahkan dari panggilan fungsi untuk mendapatkan setara dengan "case", tetapi keuntungan (ketika ada banyak kasus) dari pencarian hash untuk menemukan fungsi untuk kunci tertentu.
sumber
Perbedaan kinerja antara a
switch
danif...else if...else
kecil, pada dasarnya mereka melakukan pekerjaan yang sama. Satu perbedaan di antara mereka yang mungkin membuat perbedaan adalah bahwa ekspresi untuk diuji hanya dievaluasi sesekaliswitch
itu dievaluasi untuk masing-masingif
. Jika mengevaluasi ekspresi itu mahal, melakukannya sekali saja tentu saja lebih cepat daripada melakukannya seratus kali.Perbedaan dalam implementasi perintah-perintah itu (dan semua skrip pada umumnya) berbeda sedikit antara browser. Adalah umum untuk melihat perbedaan kinerja yang agak besar untuk kode yang sama di browser yang berbeda.
Karena Anda hampir tidak dapat menguji kinerja semua kode di semua browser, Anda harus mencari kode yang paling cocok untuk apa yang Anda lakukan, dan mencoba untuk mengurangi jumlah pekerjaan yang dilakukan daripada mengoptimalkan cara melakukannya.
sumber
Pada dasarnya, gunakan apa pun yang membuat kode itu paling mudah dibaca. Pasti ada tempat di mana satu atau yang lain membuat konstruksi menjadi lebih bersih, lebih mudah dibaca dan lebih dapat dipelihara. Ini jauh lebih penting yang mungkin menyimpan beberapa nanodetik dalam kode JavaScript.
sumber
if..else
danswitch
disebabkan oleh versi browser yang unik, perangkat keras komputer, dan kombinasi OS.Selain sintaks, sebuah saklar dapat diimplementasikan menggunakan pohon yang membuatnya
O(log n)
, sementara jika / harus diimplementasikan denganO(n)
pendekatan prosedural. Lebih sering keduanya diproses secara prosedural dan satu-satunya perbedaan adalah sintaksis, dan terlebih lagi apakah itu benar-benar penting - kecuali jika Anda secara statis mengetikkan 10k kasus if / else?sumber
Jawaban Pointy menyarankan penggunaan objek literal sebagai alternatif
switch
atauif
/else
. Saya suka pendekatan ini juga, tetapi kode dalam jawaban menciptakanmap
objek baru setiap kalidispatch
fungsi dipanggil:Jika
map
berisi banyak entri, ini dapat membuat overhead yang signifikan. Lebih baik mengatur peta tindakan hanya sekali dan kemudian menggunakan peta yang sudah dibuat setiap kali, misalnya:sumber
Saya rasa tidak,
switch
berguna / singkat jika Anda ingin mencegah beberapaif-else
kondisi.Perilaku sama di semua browser :)
sumber
switch is useful/short if you want prevent multiple if-else conditions.
Ya, tuan, kiriman yang bagus.sumber
Ternyata kalau-kalau kalau umumnya lebih cepat dari saklar
http://jsperf.com/switch-if-else/46
sumber