Sudah beberapa bulan sejak saya memulai posisi saya sebagai pengembang perangkat lunak entry level. Sekarang saya sudah melewati beberapa kurva belajar (misalnya bahasa, jargon, sintaks VB dan C #) saya mulai fokus pada topik yang lebih esoteris, untuk menulis perangkat lunak yang lebih baik.
Sebuah pertanyaan sederhana yang saya sampaikan kepada seorang rekan kerja dijawab dengan "Saya fokus pada hal-hal yang salah." Sementara saya menghormati rekan kerja ini, saya tidak setuju bahwa ini adalah "hal yang salah" untuk difokuskan.
Berikut adalah kode (dalam VB) dan diikuti oleh pertanyaan.
Catatan: Function GenerateAlert () mengembalikan bilangan bulat.
Dim alertID as Integer = GenerateAlert()
_errorDictionary.Add(argErrorID, NewErrorInfo(Now(), alertID))
vs ...
_errorDictionary.Add(argErrorID, New ErrorInfo(Now(), GenerateAlert()))
Saya awalnya menulis yang terakhir dan menulis ulang dengan "Dim alertID" sehingga orang lain mungkin merasa lebih mudah dibaca. Tapi di sini ada kekhawatiran dan pertanyaan saya:
Jika seseorang menulis ini dengan Dim AlertID, sebenarnya akan memakan lebih banyak memori; terbatas tetapi lebih, dan haruskah metode ini dipanggil berkali-kali mungkinkah menimbulkan masalah? Bagaimana .NET akan menangani objek ini AlertID. Di luar. NET harus satu secara manual membuang objek setelah digunakan (dekat akhir sub).
Saya ingin memastikan saya menjadi programmer yang berpengetahuan luas yang tidak hanya mengandalkan pengumpulan sampah. Apakah saya terlalu memikirkan ini? Apakah saya fokus pada hal-hal yang salah?
Jawaban:
"Optimalisasi prematur adalah akar dari semua kejahatan (atau setidaknya sebagian besar) dalam pemrograman." - Donald Knuth
Ketika sampai pada pass pertama Anda, cukup tulis kode Anda sehingga benar dan bersih. Jika nanti ditentukan bahwa kode Anda kritis terhadap kinerja (ada alat untuk menentukan ini yang disebut profiler), maka dapat ditulis ulang. Jika kode Anda tidak dianggap kritis-kinerja, keterbacaan jauh lebih penting.
Apakah layak menggali topik kinerja dan pengoptimalan ini? Tentu saja, tetapi tidak pada dolar perusahaan Anda jika itu tidak perlu.
sumber
Untuk rata-rata .NET program Anda, ya, terlalu banyak berpikir. Mungkin ada saat di mana Anda ingin turun ke mur dan baut dari apa yang terjadi di dalam. NET tetapi ini relatif jarang.
Salah satu transisi sulit yang saya miliki adalah beralih dari menggunakan C dan MASM ke pemrograman VB klasik di tahun 90-an. Saya terbiasa mengoptimalkan segalanya untuk ukuran dan kecepatan. Saya harus melepaskan pemikiran ini untuk sebagian besar dan membiarkan VB melakukan itu untuk menjadi efektif.
sumber
Seperti yang biasa dikatakan rekan kerja saya:
Dengan kata lain, selalu ingat KISS (tetap bodoh sederhana). Karena over-engineering, over-thinking beberapa kode logika mungkin menjadi masalah untuk mengubah logika lain kali. Namun, menjaga kode tetap bersih dan sederhana selalu merupakan praktik yang baik .
Namun, berdasarkan waktu dan pengalaman, Anda akan tahu lebih baik kode mana yang berbau dan perlu segera dioptimalkan.
sumber
Keterbacaan itu penting. Dalam contoh Anda, saya tidak yakin Anda benar-benar membuat hal - hal yang lebih mudah dibaca. GenerateAlert () memiliki nama yang bagus dan tidak menambahkan banyak suara. Mungkin ada penggunaan waktu Anda yang lebih baik.
Saya kira tidak. Itu optimasi yang relatif lurus ke depan untuk membuat kompiler.
Menggunakan variabel lokal sebagai perantara tidak berdampak pada pengumpul sampah. Jika GenerateAlert () memori baru, maka itu penting. Tetapi itu akan menjadi masalah terlepas dari variabel lokal atau tidak.
AlertID bukan objek. Hasil dari GenerateAlert () adalah objek. AlertID adalah variabel, yang jika variabel lokal hanyalah ruang yang terkait dengan metode untuk melacak hal-hal.
Ini adalah pertanyaan tingkat yang tergantung pada konteks yang terlibat dan semantik kepemilikan dari contoh yang disediakan oleh GenerateAlert (). Secara umum, apa pun yang dibuat instance harus menghapusnya. Program Anda mungkin akan terlihat sangat berbeda jika dirancang dengan manajemen memori manual.
Seorang programmer yang baik menggunakan alat yang tersedia untuk mereka, termasuk pengumpul sampah. Lebih baik memikirkan hal-hal daripada hidup tanpa sadar. Anda mungkin berfokus pada hal-hal yang salah, tetapi karena kami di sini, Anda mungkin juga mempelajarinya.
sumber
Buat itu berfungsi, bersihkan, PADAT, MAKA membuatnya bekerja secepat yang dibutuhkan untuk bekerja .
Itu seharusnya urutan yang normal. Prioritas pertama Anda adalah membuat sesuatu yang akan lulus tes penerimaan yang menghilangkan persyaratan. Ini adalah prioritas pertama Anda karena ini adalah prioritas utama klien Anda; memenuhi persyaratan fungsional dalam tenggat waktu pengembangan. Prioritas berikutnya adalah menulis kode yang bersih dan mudah dibaca yang mudah dipahami dan dengan demikian dapat dipertahankan oleh anak cucu Anda tanpa WTF saat diperlukan (hampir tidak pernah menjadi pertanyaan "jika"; Anda atau seseorang setelah Anda AKAN harus pergi kembali dan ubah / perbaiki sesuatu). Prioritas ketiga adalah membuat kode mematuhi metodologi SOLID (atau GRASP jika Anda suka), yang menempatkan kode ke bongkahan modular, dapat digunakan kembali, dan diganti yang lagi membantu pemeliharaan (tidak hanya mereka dapat memahami apa yang Anda lakukan dan mengapa, tetapi ada garis-garis bersih di mana saya bisa dengan operasi menghapus dan mengganti potongan-potongan kode). Prioritas terakhir adalah kinerja; jika kode cukup penting sehingga harus sesuai dengan spesifikasi kinerja, itu hampir pasti cukup penting untuk dibuat benar, bersih dan SOLID terlebih dahulu.
Echoing Christopher (dan Donald Knuth), "optimasi prematur adalah akar dari semua kejahatan". Selain itu, jenis optimisasi yang Anda pertimbangkan sama-sama minor (referensi ke objek baru Anda akan dibuat di stack apakah Anda memberinya nama dalam kode sumber atau tidak) dan tipe yang tidak menyebabkan perbedaan dalam kompilasi IL. Nama variabel tidak dimasukkan ke dalam IL, jadi karena Anda mendeklarasikan variabel tepat sebelum penggunaannya yang pertama (dan mungkin hanya), saya berani bertaruh sejumlah uang bir bahwa IL identik antara dua contoh Anda. Jadi, rekan kerja Anda 100% benar; Anda mencari di tempat yang salah jika Anda mencari instantiation variabel vs inline untuk sesuatu untuk dioptimalkan.
Mikro-optimasi di. NET hampir tidak pernah sepadan (saya berbicara tentang 99,99% kasus). Dalam C / C ++, mungkin, JIKA Anda tahu apa yang Anda lakukan. Ketika bekerja di lingkungan .NET, Anda sudah cukup jauh dari logam perangkat keras sehingga ada overhead yang signifikan dalam eksekusi kode. Jadi, mengingat bahwa Anda sudah berada di lingkungan yang menunjukkan Anda menyerah pada kecepatan terik dan bukannya mencari untuk menulis kode "benar", jika sesuatu dalam lingkungan .NET benar-benar tidak bekerja cukup cepat, baik kompleksitasnya adalah terlalu tinggi, atau Anda harus mempertimbangkan untuk memparalelkannya. Berikut adalah beberapa petunjuk dasar untuk diikuti untuk pengoptimalan; Saya jamin produktivitas Anda dalam optimasi (kecepatan yang diperoleh untuk waktu yang dihabiskan) akan meroket:
if(myObject != null && myObject.someProperty == 1)
), atau B membutuhkan lebih dari 9 kali lebih lama dari A untuk mengevaluasi (if(myObject != null && some10SecondMethodReturningBool())
).sumber
Satu-satunya waktu untuk khawatir tentang pengoptimalan sejak dini adalah ketika Anda tahu Anda berurusan dengan sesuatu yang sangat besar atau sesuatu yang Anda tahu akan mengeksekusi sejumlah besar kali.
Definisi "besar" jelas bervariasi berdasarkan seperti apa sistem target Anda.
sumber
Saya lebih suka versi dua baris hanya karena lebih mudah untuk melangkah dengan debugger. Garis dengan beberapa panggilan tertanam membuatnya lebih sulit.
sumber