Sintaks dan semantik sudah didefinisikan dengan baik oleh jawaban-jawaban bagus lainnya untuk pertanyaan ini. Karena eksekusi dan kinerja tidak dirinci dengan baik, saya akan menambahkan jawaban saya.
Apa perbedaan fungsional antara 3 ini?
Saya selalu menganggap atom sebagai standar cukup aneh. Pada tingkat abstraksi tempat kami bekerja, menggunakan properti atom untuk kelas sebagai kendaraan untuk mencapai 100% keselamatan benang adalah kasus sudut. Untuk program multithread yang benar-benar benar, intervensi oleh programmer hampir pasti merupakan persyaratan. Sementara itu, karakteristik dan eksekusi kinerja belum dirinci secara mendalam. Setelah menulis beberapa program multithreaded selama bertahun-tahun, saya telah menyatakan properti saya nonatomic
sepanjang waktu karena atom tidak masuk akal untuk tujuan apa pun. Selama diskusi tentang rincian sifat atomik dan nonatomik pertanyaan ini , saya melakukan beberapa profil yang menemukan beberapa hasil yang aneh.
Eksekusi
Baik. Hal pertama yang saya ingin jelaskan adalah bahwa implementasi penguncian adalah implementasi yang didefinisikan dan disarikan. Louis menggunakan @synchronized(self)
dalam contohnya - Saya telah melihat ini sebagai sumber kebingungan yang umum. Implementasinya tidak benar - benar digunakan @synchronized(self)
; ia menggunakan kunci putaran tingkat objek . Ilustrasi Louis baik untuk ilustrasi tingkat tinggi menggunakan konstruksi yang kita semua kenal, tetapi penting untuk mengetahui bahwa itu tidak digunakan @synchronized(self)
.
Perbedaan lain adalah bahwa sifat atom akan mempertahankan / melepaskan siklus objek Anda dalam pengambil.
Performa
Inilah bagian yang menarik: Kinerja menggunakan akses properti atom dalam kasus-kasus yang tidak diperdebatkan (misalnya single-threaded) bisa sangat sangat cepat dalam beberapa kasus. Dalam kasus yang kurang ideal, penggunaan akses atom dapat menelan biaya lebih dari 20 kali biaya overhead nonatomic
. Sementara case yang diperebutkan menggunakan 7 thread adalah 44 kali lebih lambat untuk struct tiga byte (2.2 GHz Core i7 Quad Core, x86_64). Struct tiga byte adalah contoh dari properti yang sangat lambat.
Catatan samping yang menarik: Aksesor yang ditentukan pengguna dari struct tiga byte adalah 52 kali lebih cepat dari accessor atom yang disintesis; atau 84% kecepatan aksesor nonatomik yang disintesis.
Objek dalam kasus yang diperebutkan juga dapat melebihi 50 kali.
Karena jumlah optimasi dan variasi dalam implementasi, sangat sulit untuk mengukur dampak dunia nyata dalam konteks ini. Anda mungkin sering mendengar sesuatu seperti "Percayai, kecuali jika Anda profil dan menemukan itu masalah". Karena tingkat abstraksi, sebenarnya cukup sulit untuk mengukur dampak aktual. Memungut biaya aktual dari profil bisa sangat memakan waktu, dan karena abstraksi, cukup tidak akurat. Selain itu, ARC vs MRC dapat membuat perbedaan besar.
Jadi mari kita mundur, tidak fokus pada implementasi akses properti, kami akan menyertakan tersangka seperti objc_msgSend
, dan memeriksa beberapa hasil tingkat tinggi dunia nyata untuk banyak panggilan ke NSString
pengambil dalam kasus yang tidak terbantahkan (nilai dalam hitungan detik):
- MRC | nonatomik | getter yang diterapkan secara manual: 2
- MRC | nonatomik | pembuat getah disintesis: 7
- MRC | atom | pembuat getah disintesis: 47
- ARC | nonatomik | pengambil sintetis: 38 (catatan: ARC menambahkan hitungan hitungan bersepeda di sini)
- ARC | atom | pembuat getah disintesis: 47
Seperti yang mungkin sudah Anda duga, aktivitas penghitungan referensi / bersepeda adalah kontributor signifikan dengan atom dan di bawah ARC. Anda juga akan melihat perbedaan yang lebih besar dalam kasus yang diperebutkan.
Meskipun saya memperhatikan kinerja, saya masih mengatakan Semantik Pertama! . Sementara itu, kinerja adalah prioritas rendah untuk banyak proyek. Namun, mengetahui detail eksekusi dan biaya teknologi yang Anda gunakan tentu tidak ada salahnya. Anda harus menggunakan teknologi yang tepat untuk kebutuhan, tujuan, dan kemampuan Anda. Mudah-mudahan ini akan menghemat beberapa jam perbandingan, dan membantu Anda membuat keputusan yang lebih baik saat merancang program Anda.