Untuk waktu yang paling lama di tempat-tempat seperti saluran IRC Jawa , SO, dan tempat-tempat lain saya telah diberitahu sesuatu di sepanjang baris "Khawatir tentang bagaimana kode terlihat dan keterbacaan / dimengerti sekarang, dan kinerja nanti jika benar-benar diperlukan". Jadi untuk waktu yang lama, saya belum benar-benar menjadi OCD tentang kinerja untuk desktop kecil atau aplikasi web saya, hanya menghapus yang jelas tidak efisien.
Sebagian besar tanggapan adalah "Bagaimana dengan skalabilitas?". Itu poin yang sah, tetapi jika aplikasi saya hanya dibuat untuk mengurai, katakanlah, panjang file 10.000 baris, haruskah saya membuat kode saya berantakan untuk sebagian kecil orang yang akan mendorong dalam 1.000.000 file baris?
Pertanyaan utama saya adalah kapan saya harus menukar cara yang mudah namun agak tidak efisien dalam melakukan tugas-tugas untuk binatang raksasa besar yang rumit yang melakukan banyak hal dengan sangat cepat tetapi menghancurkan segala cara yang mungkin untuk meningkatkan dan membuat kode terlalu sulit dan cenderung untuk menulis ulang oleh pengembang selanjutnya?
sumber
Ini biasanya dikotomi palsu . Anda dapat menulis kode yang sangat efisien, dapat dibaca dan dipelihara. Anda dapat menulis tumpukan berantakan yang sangat tidak efisien dan tidak dapat dipelihara.
Ketika berhadapan dengan masalah kinerja, saya biasanya mencoba memikirkan masalah bisnis yang saya selesaikan. Bagaimana perilaku perangkat lunak saya ketika pelanggan saya menggunakannya. Apakah kinerja aplikasi saya akan membuat Jacob Nielsen bahagia ?
sumber
Saya menyangkal mempelajari mikroprosesor di perguruan tinggi yang tinggal bersama saya: "Buat kasus umum dengan cepat. Buat kasus yang tidak biasa ini menjadi benar."
Selama Anda hanya memiliki sebagian kecil pengguna yang mencekik kode Anda dengan memasukkan dua urutan besar yang lebih besar dari yang seharusnya ditangani, jangan berkeringat. Pastikan ia menangani input dengan benar jika mereka memberikannya cukup lama, dan tidak meninggalkan apa pun yang rusak menjadi tidak berguna jika mereka membunuh pekerjaan sebelum selesai.
Tetapi, semakin banyak orang mulai menggunakannya dengan cara itu (atau mulai memberi tahu Anda, "Saya tahu, saya sangat suka menggunakan alat yang Anda tulis di laporan TPS mingguan saya, tapi itu butuh hari yang aneh"), saat itulah Anda mulai mempertimbangkan perdagangan jauh kemudahan perawatan untuk keuntungan kinerja.
sumber
"Khawatir tentang bagaimana kode terlihat dan mudah dibaca / dimengerti sekarang, dan kinerja nanti jika benar-benar diperlukan" adalah jalan keluar yang mudah, dan umumnya tidak membantu. desain yang baik akan mudah dirawat, mudah dibaca, dan efisien.
kinerja adalah salah satu komponen umum dari desain yang baik. jika program Anda lambat dan boros, itu benar-benar tidak dapat digunakan kembali. ketika Anda harus memperbaiki yang berantakan, Anda memaksa update pada klien Anda, kecuali itu terlalu waktu consuiming bagi mereka untuk pembaruan. program yang lambat itu menjadi kekacauan besar yang terlalu mahal untuk diperbaiki. kemudian mereka memilih alternatif karena tidak sesuai dengan kebutuhan mereka. mendiagnosis, memperbarui, dan menangani efek samping dari perbaikan pada desain yang buruk sering kali lebih penting daripada waktu pengembangan awal penulisan agar menjadi efisien, bekerja dengan benar, dan memiliki desain yang baik secara umum. program itu sangat dapat digunakan kembali dan membutuhkan pemeliharaan yang rendah (menang).
jadi, jawaban singkat untuk pertanyaan Anda adalah "jangan sia-sia. menulis untuk digunakan kembali. tidak apa-apa untuk malas ketika membuat prototipe / mengembangkan bukti konsep, tetapi jangan gunakan prototipe itu untuk kode produksi.".
waspadai dan hindari desain yang boros ketika menulis program dan program produksi yang ingin Anda gunakan kembali. selama implementasi adalah waktu yang ideal untuk menulis program Anda agar tidak sia-sia - Anda memiliki ide yang jelas tentang detail dan operasinya, dan itu benar-benar menyakitkan dan tidak efektif untuk diperbaiki setelah ditulis. banyak orang percaya sedikit profil (mungkin) di akhir atau jika ada masalah memadai, ketika biasanya terlalu memakan waktu untuk mendesain ulang / mengubah dan inefisiensi begitu banyak dan begitu luas bahwa Anda tidak mengerti program baik berdasarkan hasil profil. pendekatan ini membutuhkan sedikit waktu selama implementasi dan (dengan asumsi Anda telah melakukan ini cukup kali) biasanya menghasilkan desain yang beberapa kali lebih cepat, dan dapat digunakan kembali dalam banyak konteks lainnya. tidak boros, memilih algoritma yang baik, memikirkan implementasi Anda, dan menggunakan kembali implementasi yang tepat adalah semua komponen desain yang baik; semua yangmeningkatkan keterbacaan, pemeliharaan, dan penggunaan kembali lebih sering daripada menyakitinya.
sumber
Saya mencoba membuat kode dapat dibaca - kinerja terkutuk.
Kapan, dan jika, kode terbukti terlalu lambat, saya akan membuatnya lebih cepat. Biasanya proses refactoring diikuti dengan banyak komentar karena kode cenderung kurang dapat dibaca.
sumber
Um - Tidak pernah?
Serius, kode harus selalu ditulis agar mudah dipahami dan dipelihara.
Sehubungan dengan kapan menangani masalah kinerja, atasi mereka begitu Anda mengidentifikasi mereka, jangan pra-optimalkan kode Anda karena dengan begitu Anda hanya akan menebak di mana masalah kinerja itu.
Jika kode Anda ditulis agar jelas, ringkas, dapat dimengerti, dan dapat dipelihara, maka Anda atau programmer lain tidak akan mengalami masalah dalam refactoring kode tersebut agar lebih efisien.
sumber
Saya biasanya menulis kode agar dapat dibaca pertama dan terutama. Jika, dan hanya jika, saya menemukan bahwa program berjalan terlalu lambat untuk melakukan tugasnya, apakah saya profil dan mengoptimalkan. Yang mengatakan, tidak ada yang salah dengan kebiasaan melakukan optimisasi umum yang tidak mempengaruhi keterbacaan kode Anda. Artinya, jika sepotong kode dapat ditulis dalam dua cara yang sama (atau hampir sama) dibaca, pilih yang biasanya lebih cepat.
Sebagai contoh, dalam Python, daftar daftar (atau ekspresi generator) cenderung lebih cepat daripada
for
loop yang sama , jadi saya menggunakan daftar daftar di mana saya bisa, jika mereka tidak mempengaruhi keterbacaan (misalnya, saya tidak daftar sarang daftar jika Saya dapat menghindarinya, dan menggunakan for for loop karena pemahaman daftar bersarang bisa sulit untuk diuraikan secara mental).Demikian pula, tipe data yang tidak berubah cenderung lebih cepat daripada yang bisa berubah, jadi saya menggunakan tipe data yang tidak dapat diubah di mana saya bisa.
sumber
Jika Anda bekerja di bidang yang benar-benar kritis terhadap kinerja, maka Anda tidak dapat menunda efisiensi sebagai renungan. Ini adalah salah satu hal yang paling penting untuk dipikirkan ketika merancang sejak awal dalam kasus-kasus tersebut dan dengan cara yang berhubungan dengan pemeliharaan hasil akhir.
Anda tidak dapat mendesain dan mengimplementasikan server berskala besar dan mulai menulis kode yang mudah dan terdokumentasi dengan baik yang hanya menggunakan fungsi pemblokiran untuk semuanya dengan kunci utas global yang mengunci seluruh sistem untuk memproses setiap permintaan klien individu tanpa menempatkan berpikir apa pun ke keadaan bersama, pertikaian thread, dan asinkronisitas. Itulah resep untuk bencana dan kebutuhan untuk mendesain ulang dan menulis ulang sebagian besar kode yang didokumentasikan dengan baik yang Anda tulis dengan cara yang dapat mengarah pada basis kode yang paling sulit dipelihara yang dapat dibayangkan, diganggu oleh kondisi ras dan kebuntuan sebagai hasil dari mencoba untuk mencapai efisiensi yang diperlukan di belakang, bukan hanya memiliki pemikiran tentang efisien, sederhana, desain kerja di muka.
Tim pengembang game 8 bulan berproduksi dengan mesin yang hanya berjalan 2 frame per detik pada perangkat keras mereka yang paling besar dengan 32 core sementara memiliki kecenderungan untuk berhenti selama 15 detik setiap kali layar sibuk tidak mungkin untuk secara instan mendapatkan produk yang dapat digunakan hanya dengan memperbaiki satu hotspot lokal kecil. Kemungkinannya adalah bahwa desain mereka FUBAR dengan cara yang menjamin kunjungan epik papan gambar dan perubahan desain yang dapat mengalir ke setiap sudut basis kode.
Dengan John Carmack, dia berbicara sekali tentang bagaimana demo teknologi harus berjalan minimal ratusan hingga ribuan frame per detik untuk mengintegrasikannya ke dalam produksi. Itu bukan obsesi yang tidak sehat dengan efisiensi. Dia tahu di muka bahwa game harus dijalankan, secara keseluruhan, pada 30+ FPS agar pelanggan dapat menerimanya. Akibatnya satu aspek kecil seperti sistem soft shadow tidak dapat berjalan pada 30 FPS, atau permainan secara keseluruhan tidak mungkin cukup cepat untuk memberikan umpan balik realtime yang diperlukan. Ini tidak dapat digunakan sampai mencapai efisiensi yang diperlukan. Dalam area yang sangat kritis terhadap kinerja di mana ada persyaratan mendasar untuk efisiensi, solusi yang gagal mencapai kecepatan yang memadai sebenarnya tidak lebih baik daripada yang tidak berfungsi sama sekali,. Dan Anda tidak dapat merancang sistem bayangan lembut efisien yang berjalan pada ratusan hingga ribuan frame per detik seperti yang dibutuhkan untuk mesin gim realtime kecuali jika Anda mengedepankan pemikiran awal dalam hal efisiensi. Bahkan, dalam kasus seperti itu, 90 +% dari pekerjaan berorientasi pada efisiensi karena itu sepele untuk datang dengan sistem bayangan lembut yang bekerja dengan baik pada 2 jam per frame menggunakan penelusuran jalur, tetapi Anda tidak bisa berharap untuk menyetelnya untuk berjalan pada ratusan frame per detik tanpa perubahan pendekatan yang sama sekali berbeda.
Ketika efisiensi adalah bagian mendasar dari desain aplikasi, Anda tidak dapat berharap untuk mencapai efisiensi di belakang tanpa kehilangan secara dramatis lebih banyak waktu daripada Anda menghemat dengan mengabaikannya, karena Anda tidak bisa berharap untuk mencapai desain yang bekerja di belakang. Tidak ada yang mengatakan, "Tidak apa-apa untuk menunda berpikir tentang desain sampai nanti. Cukup mendokumentasikan kode Anda dengan baik dan Anda dapat menghasilkan desain yang tepat nanti ." Namun dalam arsitektur kinerja-kritis, itulah yang Anda lakukan secara efektif jika Anda tidak menaruh perhatian besar dan pemikiran ke dalam desain efisien di muka.
Sekarang itu tidak berarti Anda harus menyetel implementasi Anda secara langsung. Untuk detail implementasi, ada banyak ruang untuk beralih ke solusi yang lebih cepat setelah mengukur asalkan desain tidak perlu berubah, dan seringkali itulah cara paling produktif untuk melakukannya. Tetapi pada tingkat desain, itu berarti Anda harus memberikan pemikiran yang cukup tentang bagaimana desain dan arsitektur akan berhubungan dengan efisiensi sejak awal.
Perbedaan utama di sini adalah desain. Tidak mudah untuk membuat perubahan besar pada desain di belakang karena desain menumpuk dependensi, dan dependensi akan pecah jika desain berubah. Dan jika suatu desain memiliki persyaratan untuk menjadi cukup efisien atau, dalam beberapa kasus, bahwa kualitasnya sebagian besar diukur oleh efisiensinya, maka Anda tidak boleh berharap untuk dapat mencapai desain yang tepat sebagai renungan. Dengan setiap produk kompetitif di mana efisiensi merupakan aspek kualitas yang sangat besar baik itu sistem operasi atau kompiler atau prosesor video atau raytracer atau mesin game atau mesin fisika, pemikiran tentang efisiensi dan representasi data dipikirkan dengan cermat sejak awal. Dan dalam kasus-kasus itu bukan optimasi prematur untuk menaruh begitu banyak pemikiran ke depan efisiensi. Itu menempatkan pemikiran seperti itu tepat pada waktu paling produktif untuk melakukannya,
sumber