Saat menulis sesuatu yang sering membuat (1000-an) benda kecil, haruskah Anda mencoba meminimalkannya untuk kinerja? Terutama jika Anda tidak tahu sistem apa yang akan dijalankan, dari desktop rendah ke tinggi atau bahkan ponsel. Untuk seluler, saya mendengar bahwa membuat banyak objek sedikit menghalangi kinerja, meskipun saya tidak tahu seberapa benar itu.
Saya punya contoh yang menunjukkan ide ini dengan baik. Dalam program grafis, katakan ada metode yang digunakan untuk semua gambar yang disebut ideal drawPixel(Point)
. Mungkin ada 1000 Poin yang dibuat dan itu bisa diulang sering, seperti dalam game di mana itu bisa disebut 60+ kali per detik. Atau, drawPixel(int x, int y)
dapat digunakan untuk meminimalkan penciptaan banyak objek Point.
Dalam desain berorientasi objek, saya pikir menggunakan Point akan lebih disukai. Namun, menggunakan tipe primitif dapat meningkatkan kinerja. Peningkatan kinerja mungkin diabaikan dalam banyak kasus, tapi saya tidak yakin tentang hal-hal seperti ponsel atau mesin yang lebih tua. Apa keuntungan kinerja dari melakukan sesuatu seperti ini dan apakah itu sesuatu yang harus dipertimbangkan?
sumber
System.getProperty("java.version")
(atau "java.vm.version") adalah titik awal.Jawaban:
Secara umum, tidak , Anda tidak harus menghindari membuat objek karena takut kehilangan kinerja. Ada beberapa alasan untuk ini.
Yang mengatakan, ada tempat di mana membuat sesuatu menjadi objek tidak masuk akal untuk memulai. Melewati dua koordinat ke rutinitas menggambar bisa menjadi kasus seperti itu: pasangan koordinat tidak memiliki keberadaan independen, tidak memiliki identitas, digunakan hanya sekali dan kemudian segera dibuang, dll.
Jika ini masalahnya, maka tentu saja, lanjutkan dan lewati dua
int
s daripada membungkusnya menjadi objek. Maksud OOP bukanlah bahwa segala sesuatu harus menjadi objek. Intinya adalah bahwa objek membuat pengembangan lebih mudah di tempat-tempat di mana mereka adalah solusi alami untuk masalah representasi data. Jangan menghindari benda-benda yang masuk akal - jangan memperkenalkannya di tempat yang tidak masuk akal.sumber
Ketika merenungkan dampak pada kinerja sebelum Anda menulis kode, Anda harus menganggap Anda tidak tahu apa yang Anda lakukan.
Ada overhead ruang yang sangat kecil untuk objek di java versus primitif. Semakin kecil objek Anda, semakin besar persentase overhead. Namun, saya telah lama belajar bahwa hal-hal yang menggandakan n tidak ada apa-apanya dibandingkan dengan hal-hal yang berlipat ganda n
Jadi sementara ya Anda dapat memperdayai beberapa sistem yang memiliki dampak ukuran setengah atau bahkan keempat, tanyakan pada diri sendiri mengapa Anda benar-benar peduli. Solusi rumit untuk masalah ini tidak akan diterima dengan baik. Terutama karena menyelam ke kode semacam itu akan membingungkan. Programmer yang bingung menulis kode yang buruk. Mereka menulis n kali n kode yang seharusnya n log n kode. Dan mereka membutuhkan waktu lebih lama untuk melakukannya.
Sekarang jika Anda dapat menghemat ruang saya dengan beberapa trik yang cocok dalam kotak yang bagus yang saya tidak perlu melihat ke dalam sebagian besar waktu kita dapat berbicara. Jika kotak saya bisa menukar dengan kotak lain ketika kotak itu bekerja lebih baik, saya bahkan mungkin membayar untuk itu.
sumber
Dalam penyetelan kinerja yang telah saya lakukan ( contoh ), sangat mudah bagi manajemen memori untuk menjadi penyebab utama. Saya tidak peduli seberapa gilanya mereka mengatur operator baru dan pengumpul sampah, perhitungan tercepat bukanlah penghitungan. Jadi jika saya menemukan manajer memori membutuhkan waktu yang lama, dan saya tidak bisa menghindari membuat objek , maka saya menemukan cara untuk menggunakannya kembali, daripada terus-menerus membuat yang baru.
Saya hanya melakukan ini jika saya harus membuat objek. Untuk grafis, biasanya saya tidak. IMHO, gambar harus dibuat , bukan dibangun . Tentu, Anda bisa mengatakan bahwa gambar terdiri dari titik, garis yang menghubungkannya, poligon, teks, dan sebagainya. Itu tidak berarti Anda tidak memiliki alternatif untuk membuat benda-benda sebelum Anda menggambarnya . Saya hanya menggambar mereka.
Ada metode Paint. Saya menimpanya, menggambar semuanya menjadi bitmap, dan kemudian memblokir transfernya ke layar. Itu terlihat seketika. Untuk input mouse, ada metode untuk mengganti, untuk mendeteksi mengklik, menyeret, apa pun.
OOP adalah ide bagus untuk alasan tertentu. Alasan itu tidak berlaku dalam semua situasi.
sumber
Silakan dan gunakan alokasi kecil. Manajer memori modern, khususnya manajer objek Java yang sangat dioptimalkan, sangat efisien. Simpan optimasi kinerja utama untuk program kerja.
Sangat mungkin bahwa kinerja keseluruhan akan memadai. Jika ternyata bukan itu masalahnya, maka, dan baru setelah itu , profil kinerja kodenya. Dalam karir panjang pengembangan perangkat lunak, saya telah belajar bahwa kemacetan hampir tidak pernah seperti yang Anda harapkan.
Saya pernah meminta seorang anggota tim menghabiskan beberapa hari membuat pencarian anggota objek 20x lebih cepat. Keberhasilan! Namun, speedup keseluruhan terbaik dalam penggunaan aktual diukur dalam seratus persen. Perubahan segera dibatalkan, karena speedup membutuhkan alokasi memori yang lebih besar per anggota.
sumber
Sederhana: Jika Anda membutuhkan 1000 objek kecil, maka Anda membuat 1000 objek kecil dan tidak perlu khawatir. Jika Anda membutuhkan 100 objek kecil, maka membuat 1000 objek kecil itu bodoh - buat yang Anda butuhkan dan tidak lebih.
Jika Anda khawatir tentang kinerja (dan jika Anda tidak khawatir tentang kinerja juga), Anda harus memiliki fungsionalitas yang ditulis sekali di satu tempat, yang membuat seluruh kode Anda lebih sederhana dan lebih mudah dipahami. Kemudian jika Anda memiliki masalah kinerja, maka pengukuran dapat menunjukkan kepada Anda bahwa ada satu tempat di mana masalah kinerja terjadi, yang membuat segalanya lebih mudah, dan hanya satu tempat di mana Anda perlu mengubahnya. Atau pengukuran menunjukkan bahwa tempat ini tidak menimbulkan masalah, jadi Anda sudah selesai.
sumber