Tampaknya ada banyak diskusi tentang berbagai manfaat kecepatan untuk C atau C ++ dibandingkan dengan mengatakan Java atau Python, tapi saya jarang melihat Objective-C yang disebutkan. Kira-kira di mana ia jatuh dalam hal kinerja bahasa?
20
Jawaban:
Tidak seperti C ++, Objective-C dirancang sebagai superset bersih dari C. Kompiler Objective-C yang saya gunakan lebih dikenal sebagai kompiler C, tetapi juga menangani Objective-C.
Jadi, aman untuk mengasumsikan bahwa dalam level pembuatan kode, C dan Objective-C adalah setara.
Perbedaan pertama muncul di OOP ABI, juga disebut "metode terlambat mengikat". Sama seperti di C ++, Objective-C bergantung pada tabel pointer fungsi yang dihasilkan compiler yang dilalui saat runtime.
Tidak seperti C ++, metode pengikatan lebih 'dinamis', dan mempromosikan penggunaan
id
superclass di mana-mana, membuatnya sedikit lebih lambat daripada C ++ dalam teori. Dalam praktiknya, perbedaan ini jauh di bawah yang bisa diukur.Akhirnya, masalah kinerja yang paling penting adalah kualitas perpustakaan yang digunakan. Karena Objective-C hanya benar-benar populer di sistem Apple, masuk akal untuk menganggap Anda menggunakannya dengan Cocoa; yang merupakan seperangkat perpustakaan tingkat tinggi. Dalam kebanyakan kasus, Anda dapat meninggalkan beban berat kepada mereka, sehingga kode Anda tidak harus begitu cepat, atau jika Anda melakukan pengerasan berat, maka itu kemungkinan akan menjadi basis kode yang sebagian besar statis, kira-kira mirip dengan C biasa .
TL; DR: ada di sana dengan bahasa C dan C ++ yang paling penting. Jika Anda tidak mendapatkan kinerja yang baik, periksa algoritme Anda; sama seperti dalam bahasa yang serius.
sumber
Objective-C lebih lambat dari C / C ++. Alasannya adalah runtime dari Objective-C yang mengirimkan metode pencarian secara dinamis pada saat runtime dengan cara yang sama seperti Smalltalk, dari mana ia telah mengambil alih model eksekusi ini. Pengiriman semua metode saat runtime disebut "true message send" sebagai kebalikan dari panggilan fungsi di C / C ++ di mana alamat fungsi ditentukan pada waktu kompilasi (kecuali untuk metode virtual C ++). Tapi saya tidak bisa mengatakan seberapa lambat Objective-C lebih lambat. ASAIK hanya digunakan untuk pengembangan aplikasi karena hukuman kinerja.
sumber
Jawaban singkat: Ini dikompilasi ke dalam format yang sama seperti C / C ++ / D / Go / Rust. Itu tidak menggunakan lingkungan virtual seperti Java / .Net. Dan itu tidak ditafsirkan seperti Python / Ruby / Lua / JavaScript. Jadi itu adalah ujung spektrum yang lebih cepat.
sumber
Perbedaan kecepatan mendasar antara Obj-C dan C / C ++, seperti yang dikatakan Oliver di bawah ini, disebabkan oleh pengiriman metode dinamis.
Artikel ini profil overhead ini di Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946
Ini juga memberikan trik yang sangat bagus untuk mengoptimalkan kode Obj-C Anda ketika Anda menentukan metode pengiriman (yaitu objc_msgSend) adalah faktor pembatas - dapatkan pointer ke fungsi sekali, dan gunakan untuk memanggil fungsi berkali-kali. Seharusnya tidak banyak membantu karena Obj-C runtimes melakukan optimasi ini secara otomatis .
Perhatikan bahwa biaya sebenarnya dari pengiriman metode dinamis adalah karena kesalahan cache, karena itu merusak prediksi cabang CPU. Ini sulit diprofilkan dan mungkin kode yang dikutip di atas tidak mengukur biaya kehilangan cache yang sebenarnya.
Beberapa diskusi yang lebih bermanfaat ada di sini: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605
Intinya: perbedaan terbesar antara bahasa adalah algoritma Anda. Di luar itu, ada perbedaan kecepatan mendasar antara Obj-C, C, dan C ++, karena pengiriman metode dinamis atau virtual. Poin kedua ini tampaknya tidak besar. Dan artikel di atas memberikan trik untuk mengoptimalkannya, jika Anda dapat menemukan hot spot melalui profil, yang mungkin sulit karena CPU cache misses.
sumber