Di AS3 saya percaya Anda harus menginisialisasi semua variabel di luar loop untuk meningkatkan kinerja. Apakah ini yang terjadi dengan JavaScript juga? Mana yang lebih baik / lebih cepat / praktik terbaik?
var value = 0;
for (var i = 0; i < 100; i++)
{
value = somearray[i];
}
atau
for (var i = 0 ; i < 100; i++)
{
var value = somearray[i];
}
javascript
performance
davivid
sumber
sumber
Jawaban:
Sama sekali tidak ada perbedaan dalam arti atau kinerja, dalam JavaScript atau ActionScript.
var
adalah arahan untuk parser, dan bukan perintah yang dijalankan saat run-time. Jika pengidentifikasi tertentu telah dideklarasikanvar
sekali atau lebih di mana saja di badan fungsi (*), maka semua penggunaan pengenal itu di blok akan merujuk ke variabel lokal. Tidak ada bedanya apakahvalue
dinyatakan demikianvar
di dalam loop, di luar loop, atau keduanya.Karenanya, Anda harus menulis yang menurut Anda paling mudah dibaca. Saya tidak setuju dengan Crockford bahwa menempatkan semua vars di atas fungsi selalu merupakan hal terbaik. Untuk kasus di mana variabel digunakan sementara di bagian kode, lebih baik untuk mendeklarasikan
var
di bagian itu, sehingga bagian itu berdiri sendiri dan dapat disalin-tempel. Jika tidak, salin-tempel beberapa baris kode ke fungsi baru selama refactoring, tanpa secara terpisah memilih dan memindahkan yang terkaitvar
, dan Anda mendapatkan global yang tidak disengaja.Khususnya:
Crockford akan merekomendasikan Anda menghapus yang kedua
var
(atau menghapus keduanyavar
dan lakukan divar i;
atas), dan jslint akan memukul Anda untuk ini. Tapi IMO lebih mudah dikelola untuk menjaga keduanyavar
, menjaga semua kode terkait, daripada memiliki sedikit tambahan, kode yang mudah dilupakan di bagian atas fungsi.Secara pribadi saya cenderung menyatakan sebagai
var
penugasan pertama dari suatu variabel dalam bagian kode yang independen, terlepas dari apakah ada penggunaan terpisah dari nama variabel yang sama di beberapa bagian lain dari fungsi yang sama. Bagi saya, harus menyatakanvar
sama sekali adalah JS wart yang tidak diinginkan (akan lebih baik jika memiliki variabel default ke lokal); Saya tidak melihatnya sebagai tugas saya untuk menduplikasi keterbatasan [revisi lama] ANSI C di JavaScript juga.(*: selain dari pada fungsi yang bersarang)
sumber
var
hanya digunakan di bagian atas fungsi hanya meminta penciptaan variabel global yang tidak disengaja. Dan memiliki banyak variabel yang tidak terkait semua dinyatakan dalam satu tempat secara semantik tidak berarti, terutama ketika beberapa variabel tersebut akhirnya tidak pernah digunakan.Secara teori seharusnya tidak membuat perbedaan dalam JavaScript, karena bahasa tidak memiliki lingkup blok, tetapi hanya lingkup fungsi.
Saya tidak yakin tentang argumen kinerja, tetapi Douglas Crockford masih merekomendasikan bahwa
var
pernyataan harus menjadi pernyataan pertama di badan fungsi. Mengutip dari Konvensi Kode untuk Bahasa Pemrograman JavaScript :Saya pikir dia ada benarnya, seperti yang Anda lihat pada contoh berikut. Mendeklarasikan variabel di bagian atas fungsi tidak boleh membingungkan pembaca untuk berpikir bahwa variabel
i
disimpan dalam lingkupfor
blok loop:sumber
ecma- / javascript
akan menabrak mereka saat runtime. Itu disebut "Mengangkat". Jadi seharusnya tidak ada perbedaan.let
mempengaruhi jawaban ini?The
ECMA-/Javascript
bahasahoists
variabel yang dideklarasikan di mana saja untuk bagian atas fungsi. Itu karena bahasa ini memang memilikifunction scope
dan tidak tidak memilikiblock scope
seperti banyak bahasa mirip-C lainnya.Itu juga dikenal sebagai
lexical scope
.Jika Anda mendeklarasikan sesuatu seperti
Ini didapat
hoisted
ke:Jadi itu tidak membuat perbedaan dalam kinerja (Tapi perbaiki saya jika saya benar-benar salah di sini).
Argumen yang jauh lebih baik untuk tidak mendeklarasikan variabel di tempat lain daripada di bagian atas fungsi adalah keterbacaan . Mendeklarasikan variabel dalam a
for-loop
dapat mengarah pada asumsi yang salah bahwa variabel ini hanya dapat diakses dalam loop body, yang sama sekali salah . Infact Anda dapat mengakses variabel itu di mana saja dalam lingkup saat ini.sumber
let
mempengaruhi jawaban ini?Tahun depan, semua browser akan memiliki mesin JS yang mengkompilasi kode sehingga perbedaan kinerja (yang datang dari parsing blok kode yang sama lagi dan lagi ditambah menjalankan penugasan) harus diabaikan.
Juga, jangan pernah mengoptimalkan kinerja kecuali Anda harus melakukannya. Menjaga variabel tetap dekat dengan tempat Anda membutuhkannya saat pertama kali menjaga kode Anda tetap bersih. Di sisi negatif, orang yang terbiasa dengan bahasa dengan cakupan blok mungkin bingung.
sumber
Pertimbangan lain, sekarang kita miliki
let
danconst
di ES2015, adalah bahwa Anda sekarang dapat variabel lingkup khusus ke blok loop. Jadi, kecuali jika Anda memerlukan variabel yang sama di luar loop (atau jika setiap iterasi tergantung pada operasi yang dilakukan untuk variabel itu dalam iterasi sebelumnya), mungkin lebih baik untuk melakukan ini:sumber
Saya baru saja melakukan tes sederhana di Chrome. Cobalah biola di browser Anda dan lihat hasilnya
Hasilnya adalah bahwa tes terakhir memakan waktu ~ 8 detik dan 2 sebelumnya hanya ~ 2 detik. Sangat berulang dan terlepas dari pesanan.
Jadi, ini membuktikan kepada saya, bahwa seseorang harus selalu mendeklarasikan vars di luar loop. Kasus penasaran bagi saya adalah yang pertama di mana saya menyatakan
i
dalam pernyataan for (). Yang ini tampaknya sama cepatnya dengan tes ke-2 di mana saya pra-mendeklarasikan indeks.sumber
var
dinyatakan sebagai variabel variabel global yang akan tetaplah global.JavaScript adalah bahasa yang ditulis di bagian bawah oleh C atau C ++, saya tidak begitu yakin yang mana. Dan salah satu tujuannya adalah menyelamatkan lavour dari penanganan memori internal. Bahkan dalam C atau C ++, Anda tidak perlu khawatir tentang apakah itu akan menghabiskan banyak sumber daya ketika variabel dideklarasikan di dalam loop. Mengapa Anda harus khawatir tentang hal itu dalam JavaScript?
sumber
Yah, itu tergantung pada apa yang Anda coba capai ... jika
value
seandainya hanya variabel sementara di dalam blok loop maka jauh lebih jelas untuk menggunakan bentuk kedua. Ini juga lebih logis dan bertele-tele.sumber
Tidak ada bedanya jika Anda mendeklarasikan variabel di dalam atau di luar untuk loop. Di bawah ini adalah kode sampel untuk diuji.
Hasilnya menunjukkan dalam kasus saya
Terima kasih - MyFavs.in
sumber
let
bukannyavar
dana()
cenderung sedikit lebih lambat (seperti 120 vs 115 ms = ~ 6% = IMO tidak signifikan)Pertanyaan di sini pada dasarnya adalah untuk menyatakan var di dalam satu loop. Coba pikirkan apa yang terjadi jika Anda melakukan ini:
Apakah Anda pikir ini benar? Tidak ... karena Anda tidak ingin mendeklarasikan variabel berkali-kali. Ketika Anda mendeklarasikan variabel di dalam sebuah loop, bukankah itu menyatakan berapa kali loop berjalan? Jelas itu akan menampar Anda ketika Anda berada dalam mode 'gunakan ketat'. Orang-orang tidak setuju dengan Crockford tanpa memikirkan pertanyaan aslinya.
Jadi selalu baik untuk mendeklarasikan variabel di atas - 1. Agar mudah dibaca, 2. Membuat kebiasaan yang baik.
sumber
Dalam hal kinerja setelah menjalankan pengujian pada Chrome, Firefox, dan jsperf pada OS Linux tampaknya ada perbedaan kinerja antara deklarasi variabel dalam satu lingkaran dan keluar dari satu lingkaran. Ini adalah perbedaan kecil tetapi ini juga diperparah oleh jumlah iterasi dan jumlah deklarasi variabel.
Oleh karena itu untuk kinerja terbaik saya harus menyarankan mendeklarasikan variabel di luar loop. Atau lebih baik lagi deklarasikan variabel Anda. Lihat contoh.
Perhatikan bagaimana variabel 'al' dan 'av' ada di dalam baris deklarasi loop. Deklarasi inline ini telah memberi saya kinerja yang lebih baik secara konsisten. Bahkan lebih dari deklarasi variabel di luar loop. Sekali lagi perbedaan kinerja sangat kecil.
https://jsperf.com/outside-inline-for-loop-ase/1
sumber