Ketika aku coding di-mesin, saya sering hanya peduli dengan tetap n
: Aku sudah punya partisi spacial membatasi jumlah objek yang menerima update()
, physics()
dan render()
sekitar orang-orang di layar dan sekitarnya. Ukuran batch maksimum biasanya didefinisikan dengan cukup baik per-game, meskipun itu selalu sedikit lebih besar dari yang Anda rencanakan.
Dalam hal ini saya tidak terlalu peduli dengan big-O karena saya prihatin dengan faktor pengganda dan orde rendah yang konstan. Untuk fungsi dengan runtime seperti a*n^2 + b*n + c
(yang O(n^2)
), saya sering lebih peduli dengan mengurangi a
dan mungkin menghilangkan c
. Biaya setup atau teardown c
bisa menjadi besar secara proporsional vs kecil n
.
Namun, ini bukan untuk mengatakan bahwa big-O (atau lebih khusus big-theta ) adalah indikator bau kode yang hebat. Lihat suatu O(n^4)
tempat, atau lebih buruk lagi O(k^n)
waktu geometris, dan inilah saatnya untuk memastikan Anda mempertimbangkan opsi lain.
Saya umumnya jauh lebih peduli tentang optimalitas big-O dan melompat-lompat untuk menemukan algoritma dengan big-O rendah ketika saya berurusan dengan alat data make. Sementara jumlah objek dalam level tertentu / area streaming umumnya didefinisikan dengan baik, jumlah total objek / aset seni / file konfigurasi / dll di seluruh permainan mungkin tidak. Ini juga jumlah yang jauh lebih besar. Meskipun menjalankan pembuatan data paralel, kami masih menunggu dalam urutan satu menit (saya tahu, merengek - pembuatan data untuk konsol dapat memakan waktu berjam-jam - kami sebagian besar adalah game genggam kecil) untuk menjalani jam data-clean && jam data
siklus.
Untuk memberikan contoh spesifik: ini benar-benar tidak terkendali dengan algoritme streaming ubin latar belakang yang mengalirkan ubin 8x8 256-warna. Sangat berguna untuk membagikan buffer streaming di antara "lapisan" latar belakang, dan kami mungkin memiliki hingga 6 dari mereka di level tertentu yang berbagi buffer yang sama. Masalahnya adalah bahwa memperkirakan ukuran buffer yang dibutuhkan didasarkan pada posisi yang memungkinkan dari semua 6 lapisan - dan jika mereka adalah bilangan prima lebar / tinggi / kecepatan gulir, Anda dengan cepat mulai melakukan pencarian lengkap - yang mulai mendekatO(6^numTiles)
- yang berada dalam kategori "lebih lama dari jagad raya sekitar" dalam banyak kasus. Untungnya kebanyakan case hanya 2-3 layer, tetapi meskipun demikian, kami berada di atas runtime setengah jam. Saat ini, kami mengambil sampel subset yang sangat kecil dari kemungkinan ini, meningkatkan granularity hingga sejumlah waktu yang telah berlalu (atau kami telah menyelesaikan tugas, yang mungkin terjadi untuk konfigurasi double-layer kecil). Kami menaikkan perkiraan ini sedikit berdasarkan statistik sebelumnya tentang seberapa sering kami terbukti salah, dan kemudian menambahkan sedikit bantalan tambahan untuk ukuran yang baik.
Satu contoh lain yang menyenangkan: pada game PC beberapa waktu lalu, insinyur utama bereksperimen untuk sementara waktu dengan melewatkan daftar . Memori overhead pada akhirnya menyebabkan lebih banyak efek cache, yang menambahkan semacam pengganda non-konstan ke seluruh urusan - jadi mereka benar-benar bukan pilihan yang baik sama sekali untuk kecil n
. Tetapi untuk daftar yang lebih besar diurutkan di mana pencarian sering dilakukan, mereka memberikan manfaat.
(Saya sering menemukan bahwa algoritma naif lebih tinggi big-O, lebih cepat pada set data yang lebih kecil, dan lebih mudah untuk dipahami; yang lebih menarik / kompleks (misalnya patricia trie) lebih sulit bagi orang untuk memahami dan memelihara, tetapi kinerja yang lebih tinggi pada yang lebih besar set data.)