Di mana Objective-C termasuk dalam kontinum kinerja bahasa?

20

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?

Fomite
sumber
23
1986 - Brad Cox dan Tom Love menciptakan Objective-C, mengumumkan "bahasa ini memiliki semua keamanan memori C dikombinasikan dengan semua kecepatan Smalltalk." Sejarawan modern menduga keduanya disleksia. ( sumber )
Mason Wheeler
4
Itu jatuh ke kisaran di mana kinerja tidak terlalu menjadi masalah. Ini satu-satunya bahasa yang didukung untuk berinteraksi dengan Kakao, jadi jika Anda ingin melakukan itu, tidak ada yang berfungsi sama sekali. Untuk hal lain, saya akan menganggapnya sebagai pilihan yang mengerikan, terlepas dari kinerja.
Jerry Coffin
1
"kinerja" bukan merupakan karakteristik dari suatu bahasa, tetapi dari implementasi bahasa dan, yang lebih penting, dari program yang ditulis dalam bahasa itu. Anda dapat menulis program yang sangat cepat di Objective-C, atau Anda dapat menulis yang sangat lambat.
Caleb
Gagal memiliki sintaks yang mengerikan tetapi bukan bahasa yang berkinerja buruk berdasarkan kompilernya saat ini karena kinerjanya lebih didasarkan pada kompiler / vm daripada bahasa yang sebenarnya.
Rig

Jawaban:

28

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 idsuperclass 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.

Javier
sumber
4
Sebenarnya objektif-c modern adalah tentang supersetty sebagai C ++ modern. Di C Anda diizinkan untuk melakukan aritmatika pada pointer sewenang-wenang, Anda tidak bisa dalam ObjC. Juga perbedaan kinerja karena pencarian metode dapat diukur: jalur cepat objc_msg Kirim sekitar empat kali lebih berat daripada panggilan fungsi anggota (dan jalur lambat tidak secepat jalur cepat).
11

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.

OlliP
sumber
1
Menemukan perbandingan kinerja ini dengan C: rmarcus.info/?p=488 Sepertinya Objective-C masih sangat dekat dengan C.
OlliP
Akan lebih baik untuk membandingkan Objective C dengan sisa paket di Game Benchmarks '
Deer Hunter
Saya pikir perbandingan kinerja perlu diambil dengan sedikit garam karena kode Objective-C adalah untuk beberapa memperluas kode C dan tidak mengirim pesan Objecttive-C. Saya tidak tahu untuk apa downgrade itu. Saya melakukan pengembangan Smalltalk selama lebih dari satu dekade dan Objective-C didasarkan pada Smalltalk dalam banyak hal. Saya pikir tahu apa yang saya bicarakan.
OlliP
Bukan downvoter; Saya terutama tertarik pada algoritma berat-numerik, dinamis dispatch tidak peduli banyak dalam mereka.
Deer Hunter
8

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.

Jacks_Gulch
sumber
7

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.

MHH
sumber