Kadang-kadang Anda hanya memiliki algoritma yang tidak bisa lebih baik daripada waktu linear yang masih memiliki permintaan kinerja yang kuat.
Contohnya adalah pemrosesan video di mana Anda tidak dapat membuat gambar / bingkai lebih terang sebagai contoh dasar tanpa mengulangi setiap piksel (well, saya kira Anda bisa dengan semacam struktur hierarki yang menunjukkan properti yang diwarisi oleh anak-anak yang akhirnya turun ke ubin gambar untuk simpul daun, tetapi kemudian Anda akan menunda biaya perulangan yang lebih tinggi melalui setiap piksel ke penyaji dan kode mungkin akan lebih sulit dipertahankan daripada filter gambar yang paling dioptimalkan secara mikro).
Ada banyak kasus seperti itu di bidang saya. Saya cenderung melakukan loop kompleksitas-linear yang harus menyentuh segala sesuatu atau membaca semuanya daripada yang mendapat manfaat dari segala jenis struktur data atau algoritma yang canggih. Tidak ada pekerjaan yang dapat dilewati ketika semuanya harus disentuh. Jadi pada saat itu jika Anda berurusan dengan kompleksitas linear, Anda harus membuat pekerjaan yang dilakukan lebih murah dan lebih murah.
Jadi dalam kasus saya optimisasi yang paling penting dan umum sering representasi data dan tata letak memori, multithreading, dan SIMD (biasanya dalam urutan ini dengan representasi data menjadi yang paling penting, karena memengaruhi kemampuan untuk melakukan dua yang terakhir). Saya tidak mengalami begitu banyak masalah yang bisa diselesaikan oleh pohon, tabel hash, algoritma pengurutan, dan hal-hal semacam itu. Kode harian saya lebih sesuai, "untuk setiap hal, lakukan sesuatu."
Tentu saja itu adalah kasus lain untuk dibicarakan ketika optimasi diperlukan (dan yang lebih penting, ketika tidak), mikro atau algoritmik. Tetapi dalam kasus khusus saya, jika jalur eksekusi yang kritis memerlukan optimasi, peningkatan kecepatan 10x + sering dicapai oleh optimasi tingkat mikro seperti multithreading, SIMD, dan menata ulang susunan memori dan pola akses untuk meningkatkan lokalitas referensi. Tidak sering saya dapat, misalnya, mengganti semacam gelembung dengan introsort atau semacam radix atau deteksi tabrakan kompleksitas kuadratik dengan BVH sehingga banyak menemukan hotspot yang, katakanlah, manfaat dari pemisahan bidang panas / dingin.
Sekarang dalam kasus saya, bidang saya sangat kritis terhadap kinerja (raytracing, mesin fisika, dll) sehingga raytracer yang lambat namun benar-benar sempurna yang membutuhkan 10 jam untuk membuat gambar sering dianggap tidak berguna atau lebih cepat daripada yang cepat yang sepenuhnya interaktif tetapi menampilkan gambar yang paling jelek dengan sinar yang bocor di mana-mana karena kurangnya sinar kedap air / persimpangan tri. Kecepatan bisa dibilang metrik kualitas utama dari perangkat lunak tersebut, bahkan bisa dibilang lebih dari benar sampai titik tertentu (karena "kebenaran" adalah ide kabur dengan raytracing karena semuanya mendekati, asalkan tidak menabrak atau semacamnya). Dan ketika itu masalahnya, jika saya tidak memikirkan efisiensi di muka, saya merasa saya harus benar-benar mengubah kode pada level desain paling mahal untuk menangani desain yang lebih efisien. Jadi jika saya tidak
Game adalah bidang lain yang mirip dengan milikku. Tidak masalah seberapa benar logika gim Anda atau seberapa basis kode Anda yang dapat dipertahankan dan direkayasa dengan cemerlang jika gim Anda berjalan dengan kecepatan 1 frame per detik seperti tampilan slide. Di bidang-bidang tertentu kurangnya kecepatan sebenarnya bisa membuat aplikasi tidak berguna bagi penggunanya. Tidak seperti game, tidak ada metrik "cukup baik" di area seperti raytracing. Para pengguna selalu menginginkan lebih banyak kecepatan, dan persaingan industri terutama dalam mencari solusi yang lebih cepat. Ini tidak akan pernah cukup baik sampai saat itu juga, di mana game akan menggunakan pelacak jalur. Dan mungkin itu masih belum cukup baik untuk VFX, karena para seniman mungkin ingin memuat miliaran poligon dan melakukan simulasi partikel dengan tabrakan sendiri di antara miliaran partikel pada 30+ FPS.
Sekarang jika itu kenyamanan, meskipun begitu saya masih menulis sekitar 90% dari kode dalam bahasa scripting (Lua) tanpa khawatir tentang kinerja apa pun. Tetapi saya memiliki jumlah kode yang luar biasa besar yang sebenarnya perlu di-loop melalui jutaan hingga milyaran hal, dan ketika Anda mengulang-ulang jutaan hingga milyaran, Anda mulai melihat perbedaan epik antara kode single-threaded yang naif yang mengaktifkan cache miss dengan setiap iterasi vs. katakanlah, kode vektor berjalan di paralel mengakses blok yang berdekatan di mana tidak ada data yang tidak relevan dimuat ke dalam garis cache.