Ruang lingkup variabel lokal harus selalu sekecil mungkin.
Dalam contoh saya nyana str
yang tidak digunakan di luar while
lingkaran, jika tidak, anda tidak akan mengajukan pertanyaan, karena menyatakan itu dalamwhile
lingkaran tidak akan menjadi pilihan, karena itu tidak akan mengkompilasi.
Jadi, karena str
ini tidak digunakan di luar loop, ruang lingkup terkecil yang mungkin untuk str
ini dalam sementara lingkaran.
Jadi, jawabannya adalah empatik yang str
mutlak harus dinyatakan dalam loop sementara. Tidak ada, tidak ada, dan tidak ada.
Satu-satunya kasus di mana aturan ini mungkin dilanggar adalah jika karena alasan tertentu itu sangat penting bahwa setiap siklus jam harus diperas dari kode, dalam hal ini Anda mungkin ingin mempertimbangkan instantiasi sesuatu dalam lingkup luar dan menggunakannya kembali daripada instantiasi ulang pada setiap iterasi dari ruang lingkup dalam. Namun, ini tidak berlaku untuk contoh Anda, karena kekekalan string di java: contoh baru dari str akan selalu dibuat di awal loop Anda dan harus dibuang di akhir, jadi ada tidak ada kemungkinan untuk mengoptimalkan di sana.
Sunting: (menyuntikkan komentar saya di bawah dalam jawaban)
Bagaimanapun, cara yang tepat untuk melakukan sesuatu adalah dengan menulis semua kode Anda dengan benar, menetapkan persyaratan kinerja untuk produk Anda, mengukur produk akhir Anda terhadap persyaratan ini, dan jika tidak memuaskannya, maka optimalkan segala sesuatunya. Dan yang biasanya terjadi adalah Anda menemukan cara untuk menyediakan beberapa optimasi algoritmik yang bagus dan formal hanya dalam beberapa tempat yang membuat program kami memenuhi persyaratan kinerjanya alih-alih harus menjelajahi seluruh basis kode Anda dan men-tweak dan meretas hal-hal di Untuk memeras siklus jam di sana-sini.
Saya membandingkan kode byte dari dua contoh (serupa) itu:
Mari kita lihat 1. contoh :
setelah itu
javac Test.java
,javap -c Test
Anda akan mendapatkan:Mari kita lihat 2. contoh :
setelah itu
javac Test.java
,javap -c Test
Anda akan mendapatkan:Pengamatan menunjukkan bahwa tidak ada perbedaan di antara dua contoh itu. Ini adalah hasil dari spesifikasi JVM ...
Tetapi atas nama praktik pengkodean terbaik, disarankan untuk mendeklarasikan variabel dalam ruang lingkup sekecil mungkin (dalam contoh ini berada di dalam loop, karena ini adalah satu-satunya tempat di mana variabel digunakan).
sumber
final
pecinta: menyatakanstr
sepertifinal
dalaminside
paket juga tidak ada bedanya =)Mendeklarasikan objek dalam lingkup terkecil meningkatkan keterbacaan .
Kinerja tidak masalah untuk kompiler saat ini. (Dalam skenario ini)
Dari perspektif pemeliharaan, opsi ke-2 lebih baik.
Deklarasikan dan inisialisasi variabel di tempat yang sama, dalam ruang lingkup sesempit mungkin.
Seperti yang dikatakan Donald Ervin Knuth :
yaitu) situasi di mana seorang programmer memungkinkan pertimbangan kinerja mempengaruhi desain sepotong kode. Ini dapat menghasilkan desain yang tidak sebersih mungkin atau kode yang tidak benar, karena kode rumit oleh optimasi dan programmer terganggu dengan optimalisasi .
sumber
jika Anda ingin menggunakan
str
looop luar juga; mendeklarasikannya di luar. jika tidak, versi ke-2 baik-baik saja.sumber
Silakan lewati ke jawaban yang diperbarui ...
Bagi mereka yang peduli dengan kinerja, keluarkan System.out dan batasi loop hingga 1 byte. Menggunakan double (test 1/2) dan menggunakan String (3/4) waktu yang berlalu dalam milidetik diberikan di bawah ini dengan Windows 7 Professional 64 bit dan JDK-1.7.0_21. Bytecodes (juga diberikan di bawah ini untuk test1 dan test2) tidak sama. Saya terlalu malas untuk menguji dengan benda yang bisa berubah & relatif kompleks.
dua kali lipat
Test1 mengambil: 2710 msecs
Test2 mengambil: 2790 msecs
String (ganti saja double dengan string dalam tes)
Test3 mengambil: 1200 msecs
Test4 mengambil: 3000 msecs
Mengompilasi dan mendapatkan bytecode
JAWABAN TERBARU
Benar-benar tidak mudah untuk membandingkan kinerja dengan semua optimisasi JVM. Namun, itu agak mungkin. Tes yang lebih baik dan hasil terperinci dalam Google Caliper
Kode Uji Parsial untuk Deklarasi rangkap
Ini tidak identik dengan kode di atas. Jika Anda hanya mengkode loop dummy, JVM akan melewatkannya, jadi setidaknya Anda perlu menetapkan dan mengembalikan sesuatu. Ini juga direkomendasikan dalam dokumentasi Caliper.
sumber
Salah satu solusi untuk masalah ini bisa dengan menyediakan ruang lingkup variabel yang merangkum loop sementara:
Mereka akan secara otomatis kehilangan referensi ketika lingkup luar berakhir.
sumber
Di dalam, semakin sedikit ruang lingkup variabel terlihat menjadi lebih baik.
sumber
Jika Anda tidak perlu menggunakan
str
after loop sementara (lingkup terkait) maka kondisi kedua yaitulebih baik karena jika Anda mendefinisikan objek pada stack hanya jika
condition
itu benar. Yaitu menggunakannya jika Anda membutuhkannyasumber
Saya pikir sumber terbaik untuk menjawab pertanyaan Anda adalah posting berikut:
Perbedaan antara mendeklarasikan variabel sebelum atau dalam lingkaran?
Menurut pemahaman saya, hal ini tergantung pada bahasa. IIRC Java mengoptimalkan ini, jadi tidak ada perbedaan, tetapi JavaScript (misalnya) akan melakukan alokasi memori keseluruhan setiap kali dalam loop. Di Jawa khususnya saya pikir yang kedua akan berjalan lebih cepat ketika melakukan profil.
sumber
Seperti banyak orang tunjukkan,
adalah TIDAK lebih baik dari ini:
Jadi jangan mendeklarasikan variabel di luar cakupannya jika Anda tidak menggunakannya kembali ...
sumber
Mendeklarasikan String str di luar loop wile memungkinkannya direferensikan di dalam & di luar loop while. Mendeklarasikan String str di dalam loop sementara memungkinkan untuk hanya direferensikan di dalam loop sementara.
sumber
Variabel harus dinyatakan sedekat mungkin dengan tempat mereka digunakan.
Itu membuat RAII (Akuisisi Sumber Daya Adalah Inisialisasi) lebih mudah.
Itu membuat ruang lingkup variabel ketat. Ini memungkinkan pengoptimal bekerja lebih baik.
sumber
Menurut panduan Pengembangan Android Google, ruang lingkup variabel harus dibatasi. Silakan periksa tautan ini:
Batasi Cakupan Variabel
sumber
The
str
variabel akan tersedia dan disediakan beberapa ruang di memori bahkan setelah beberapa saat dieksekusi di bawah kode.The
str
variabel tidak akan tersedia dan juga memori akan dirilis yang dialokasikan untukstr
variabel di bawah kode.Jika kita mengikuti yang kedua tentunya ini akan mengurangi memori sistem kita dan meningkatkan kinerja.
sumber
Mendeklarasikan di dalam loop membatasi ruang lingkup variabel masing-masing. Itu semua tergantung pada persyaratan proyek pada ruang lingkup variabel.
sumber
Sungguh, pertanyaan yang disebutkan di atas adalah masalah pemrograman. Bagaimana Anda ingin memprogram kode Anda? Di mana Anda membutuhkan 'STR' untuk diakses? Tidak ada gunanya mendeklarasikan variabel yang digunakan secara lokal sebagai variabel global. Dasar-dasar pemrograman saya percaya.
sumber
Dua contoh ini menghasilkan hal yang sama. Namun, yang pertama memberi Anda menggunakan
str
variabel di luar loop sementara; yang kedua bukan.sumber
Peringatan untuk hampir semua orang dalam pertanyaan ini: Berikut adalah contoh kode di mana di dalam loop itu dapat dengan mudah 200 kali lebih lambat di komputer saya dengan Java 7 (dan konsumsi memori juga sedikit berbeda). Tapi ini tentang alokasi dan bukan hanya ruang lingkup.
Kesimpulan: Bergantung pada ukuran variabel lokal, perbedaannya bisa sangat besar, bahkan dengan variabel yang tidak terlalu besar.
Hanya mengatakan bahwa kadang-kadang, di luar atau di dalam loop itu penting.
sumber
bigStuff[(int) (value % STUFF_SIZE)] = value;
(Coba nilai 2147483649L)Saya pikir ukuran objek juga penting. Dalam salah satu proyek saya, kami telah mendeklarasikan dan menginisialisasi array dua dimensi besar yang membuat aplikasi membuang pengecualian di luar memori. Kami memindahkan deklarasi keluar dari loop sebagai gantinya dan menghapus array pada awal setiap iterasi.
sumber
Anda berisiko
NullPointerException
jikacalculateStr()
metode Anda mengembalikan nol dan kemudian Anda mencoba memanggil metode di str.Secara umum, hindari memiliki variabel dengan nilai nol . Ngomong-ngomong, atribut kelas lebih kuat.
sumber
NullPointerException.
Jika kode ini dicobareturn str;
akan mengalami kesalahan kompilasi.