Saya mungkin bias bekerja di daerah yang sangat kritis terhadap kinerja seperti pemrosesan gambar dan raytracing, tapi saya masih mengatakan untuk mengoptimalkan "selambat mungkin" . Tidak peduli seberapa kritikal kinerja persyaratan Anda, selalu ada jauh lebih banyak informasi dan kejelasan di belakang, setelah Anda mengukur, daripada di muka, yang berarti bahkan optimasi paling efektif biasanya diterapkan kemudian setelah mendapatkan pengetahuan tersebut.
Kasus Aneh
Tetapi kadang-kadang "selambat mungkin" masih sangat awal dalam beberapa kasus aneh. Jika kita berbicara penyaji offline, misalnya, struktur data dan teknik yang Anda gunakan untuk mencapai kinerja benar-benar meresap ke dalam desain pengguna akhir. Ini mungkin terdengar menjijikkan tetapi bidangnya sangat canggih dan sangat kritis terhadap kinerja sehingga pengguna menerima kontrol akhir pengguna yang spesifik untuk teknik pengoptimalan yang berlaku untuk raytracer tertentu (mis: caching irradiance atau pemetaan foton), karena beberapa di antaranya digunakan untuk menunggu berjam-jam untuk membuat gambar, dan yang lain digunakan untuk mengeluarkan sejumlah besar uang untuk menyewa atau memiliki pertanian render dengan mesin yang didedikasikan untuk rendering. Ada pengurangan besar dalam waktu dan uang bagi para pengguna jika penyaji offline yang kompetitif dapat menawarkan pengurangan waktu yang dihabiskan untuk rendering yang tidak sepele. Ini adalah semacam area di mana pengurangan 5% dalam waktu sebenarnya menggairahkan pengguna.
Dalam kasus khusus seperti itu, Anda tidak bisa hanya memilih satu teknik rendering mau tak mau dan berharap untuk mengoptimalkannya nanti, karena seluruh desain, termasuk desain pengguna-akhir, berputar di sekitar struktur data dan algoritma yang Anda gunakan. Anda tidak dapat selalu hanya pergi dengan apa yang bekerja dengan baik untuk orang lain karena di sini, Anda, sebagai individu, dan kekuatan dan kelemahan khusus Anda, menjadi faktor penting dalam memberikan solusi kompetitif. Pola pikir dan kepekaan pengembang utama di belakang Arnold berbeda dari mereka yang bekerja pada VRay yang menggunakan pendekatan yang sangat berbeda; mereka tidak dapat selalu bertukar tempat / teknik dan melakukan pekerjaan terbaik (meskipun mereka berdua pemimpin industri). Anda harus melakukan eksperimen, prototipe, dan tolok ukur dan menemukan apa yang Anda inginkan. sangat baik dalam melakukan mengingat berbagai teknik canggih di luar sana jika Anda berharap untuk mengirimkan sesuatu yang kompetitif yang benar-benar akan dijual. Jadi dalam kasus khusus ini, masalah kinerja bergerak maju ke depan sebagai mungkin masalah yang paling penting sebelum memulai pengembangan.
Namun itu belum tentu merupakan pelanggaran untuk mengoptimalkan "selambat mungkin" , itu hanya "selambat mungkin" agak awal dalam kasus-kasus ekstrim dan aneh ini. Mencari tahu kapan dan juga apa yang tidak membutuhkan masalah kinerja awal, jika pernah sama sekali, mungkin merupakan tantangan utama bagi pengembang. Apa yang tidak dioptimalkan mungkin menjadi salah satu hal paling berharga untuk dipelajari dan terus dipelajari dalam karier seorang pengembang, karena Anda tidak dapat menemukan kekurangan pengembang naif yang ingin mengoptimalkan semuanya (dan sayangnya bahkan beberapa veteran yang entah bagaimana berhasil mempertahankan pekerjaan mereka di terlepas dari kontra-produktivitas mereka).
Selambat Mungkin
Mungkin bagian yang paling sulit adalah mencoba memahami artinya. Saya masih belajar dan saya sudah pemrograman selama hampir tiga dekade. Tetapi terutama sekarang dalam dekade ketiga saya, saya mulai menyadari bahwa itu tidak sulit. Ini bukan ilmu roket, jika Anda lebih fokus pada desain daripada implementasi. Semakin banyak desain Anda meninggalkan ruang bernafas untuk optimasi yang tepat nanti tanpa perubahan pada desain, semakin Anda dapat mengoptimalkan. Dan semakin banyak produktivitas yang saya peroleh dengan mencari desain seperti itu yang memberi saya ruang bernapas.
Desain Yang Menawarkan Ruang Pernapasan untuk Dioptimalkan Nanti
Jenis desain ini sebenarnya tidak terlalu sulit untuk dicapai dalam banyak kasus jika kita dapat menerapkan "akal sehat". Sebagai kisah pribadi saya menjadi seni visual sebagai hobi (saya merasa agak membantu memprogram perangkat lunak bagi para seniman untuk memahami kebutuhan mereka dan berbicara dalam bahasa mereka), dan saya menghabiskan beberapa waktu di awal tahun 2000 menggunakan applet Oekaki online sebagai cara cepat untuk mencorat-coret dan berbagi karya saya dan terhubung dengan artis lain.
Khususnya situs dan applet favorit saya di sana penuh dengan cacat kinerja (ukuran kuas non-sepele akan lambat merangkak), tetapi memiliki komunitas yang sangat bagus. Untuk mengatasi masalah kinerja saya menggunakan sikat kecil 1 atau 2-pixel kecil dan hanya menulis pekerjaan saya seperti:
Sementara itu saya terus memberi penulis saran perangkat lunak untuk meningkatkan kinerja, dan dia memperhatikan saran saya yang bersifat teknis berbicara tentang optimasi memori dan algoritma dan sebagainya. Jadi dia benar-benar bertanya apakah saya seorang programmer dan saya menjawab ya dan dia mengundang saya untuk bekerja pada kode sumber.
Jadi saya melihat kode sumber, menjalankannya, memprofilkannya, dan yang mengejutkan saya ia telah merancang perangkat lunak di sekitar konsep "antarmuka pixel abstrak", seperti IPixel
, yang akhirnya menjadi akar penyebab di balik hotspot teratas untuk semuanya dengan dinamis alokasi dan pengiriman untuk setiap piksel tunggal dari setiap gambar tunggal. Namun tidak ada cara praktis untuk mengoptimalkan itu tanpa mempertimbangkan kembali seluruh desain perangkat lunak karena desain telah menjebaknya ke sudut di mana tidak ada banyak di luar yang paling sepele dari optimasi mikro ketika abstraksi kami bekerja pada tingkat granular dari satu piksel abstrak tunggal dan semuanya tergantung pada pixel abstrak ini.
Saya pikir itu pelanggaran "akal sehat" tapi jelas itu bukan akal sehat pengembang. Tapi itu seperti tidak melakukan hal-hal abstrak pada tingkat granular di mana bahkan kasus penggunaan paling dasar akan menjadi instantiating oleh jutaan, seperti dengan piksel, atau partikel, atau unit kecil dalam simulasi pasukan ginormous. Mendukung IImage
(Anda dapat menangani semua format gambar / piksel yang Anda butuhkan pada tingkat agregat yang lebih besar) atau IParticleSystem
ke IPixel
atau IParticle
, dan kemudian Anda dapat memasukkan implementasi yang paling dasar dan cepat untuk menulis dan mudah dipahami di balik antarmuka dan memiliki semua ruang bernafas yang Anda perlukan untuk mengoptimalkan nanti tanpa mempertimbangkan kembali seluruh desain perangkat lunak.
Dan itulah tujuannya seperti yang saya lihat hari ini. Tidak termasuk kasus aneh seperti penyaji offline di atas, desain dengan ruang bernapas yang cukup untuk mengoptimalkan selambat mungkin, dengan informasi belakang sebanyak mungkin (termasuk pengukuran), dan menerapkan optimasi yang diperlukan selambat mungkin.
Tentu saja saya tidak menyarankan untuk memulai menggunakan algoritma kompleksitas kuadrat pada input yang dengan mudah mencapai ukuran non-sepele dalam kasus umum pengguna akhir. Lagi pula siapa yang melakukan itu? Tapi saya bahkan tidak berpikir itu masalah besar jika implementasinya mudah untuk ditukar nanti. Itu masih bukan kesalahan besar jika Anda tidak harus mempertimbangkan kembali desain apa pun.