Pertama, (IMO) membandingkan dengan Python hampir tidak ada artinya. Hanya perbandingan dengan Objective-C yang bermakna.
- Bagaimana bahasa pemrograman baru bisa lebih cepat?
Objective-C adalah bahasa yang lambat. (Hanya bagian C yang cepat, tapi itu karena itu C) Tidak pernah sangat cepat. Itu cukup cepat untuk tujuan mereka (Apple), dan lebih cepat dari versi lama mereka. Dan itu lambat karena ...
- Apakah hasil Objective-C dari kompiler buruk atau ada sesuatu yang kurang efisien di Objective-C daripada Swift?
Objective-C menjamin setiap metode dikirim secara dinamis. Tidak ada pengiriman statis sama sekali. Itu membuatnya mustahil untuk mengoptimalkan program Objective-C lebih lanjut. Yah, mungkin teknologi JIT dapat membantu, tetapi AFAIK, Apple benar-benar membenci karakteristik kinerja yang tidak terduga dan objek seumur hidup. Saya tidak berpikir mereka telah mengadopsi hal-hal JIT. Swift tidak memiliki jaminan pengiriman dinamis seperti itu kecuali Anda menaruh beberapa atribut khusus untuk kompatibilitas Objective-C.
- Bagaimana Anda menjelaskan peningkatan kinerja 40%? Saya mengerti bahwa pengumpulan sampah / kontrol referensi otomatis mungkin menghasilkan beberapa overhead tambahan, tapi ini banyak?
GC atau RC tidak masalah di sini. Swift juga menggunakan RC terutama. Tidak ada GC di sana, dan juga tidak akan kecuali ada lompatan arsitektur besar pada teknologi GC. (IMO, selamanya) Saya percaya Swift memiliki lebih banyak ruang untuk optimasi statis. Terutama algoritma enkripsi level rendah, karena mereka biasanya mengandalkan perhitungan numerik besar, dan ini adalah kemenangan besar untuk bahasa pengiriman statis.
Sebenarnya saya terkejut karena 40% sepertinya terlalu kecil. Saya berharap jauh lebih banyak. Bagaimanapun, ini adalah rilis awal, dan saya pikir optimisasi bukanlah perhatian utama. Swift bahkan tidak lengkap fitur! Mereka akan membuatnya lebih baik.
Memperbarui
Beberapa terus menggangguku untuk berargumen bahwa teknologi GC lebih unggul. Meskipun hal-hal di bawah ini bisa diperdebatkan, dan hanya pendapat saya yang sangat bias, tapi saya pikir saya harus mengatakan untuk menghindari argumen yang tidak perlu ini.
Saya tahu apa itu GC konservatif / tracing / generasional / inkremental / paralel / realtime dan bagaimana mereka berbeda. Saya pikir sebagian besar pembaca juga sudah tahu itu. Saya juga setuju bahwa GC sangat bagus di beberapa bidang, dan juga menunjukkan throughput yang tinggi dalam beberapa kasus.
Bagaimanapun, saya menduga klaim throughput GC selalu lebih baik daripada RC. Sebagian besar overhead RC berasal dari operasi penghitungan ulang dan penguncian untuk melindungi variabel angka penghitungan ulang. Dan implementasi RC biasanya menyediakan cara untuk menghindari penghitungan operasi. Di Objective-C, ada __unsafe_unretained
dan di Swift, (meskipun masih agak tidak jelas bagi saya) unowned
barang. Jika biaya operasi penghitungan ulang tidak dapat diterima, Anda dapat mencoba untuk memilihnya secara selektif dengan menggunakan mekanisme. Secara teoritis, kita dapat mensimulasikan skenario kepemilikan yang hampir unik dengan menggunakan referensi tidak mempertahankan sangat agresif untuk menghindari overhead RC. Saya juga berharap kompiler dapat menghilangkan beberapa operasi RC yang jelas tidak perlu secara otomatis.
Tidak seperti sistem RC, AFAIK, penyisihan sebagian tipe referensi bukan opsi pada sistem GC.
Saya tahu ada banyak grafis dan game yang dirilis yang menggunakan sistem berbasis GC, dan juga tahu kebanyakan dari mereka menderita karena kurangnya determinisme. Tidak hanya untuk karakteristik kinerja, tetapi juga objek manajemen seumur hidup. Unity sebagian besar ditulis dalam C ++, tetapi bagian C # kecil menyebabkan semua masalah kinerja aneh. Aplikasi hibrida HTML dan masih menderita oleh lonjakan tak terduga di sistem apa pun. Digunakan secara luas tidak berarti itu unggul. Itu berarti mudah dan populer bagi orang-orang yang tidak memiliki banyak pilihan.
Perbarui 2
Sekali lagi untuk menghindari argumen atau diskusi yang tidak perlu, saya menambahkan beberapa detail lagi.
@ Asik memberikan pendapat yang menarik tentang paku GC. Itu yang bisa kita anggap pendekatan nilai-tipe-di mana-mana sebagai cara untuk memilih keluar dari barang-barang GC. Ini cukup menarik, dan bahkan dapat dilakukan pada beberapa sistem (misalnya pendekatan murni fungsional). Saya setuju bahwa ini bagus secara teori. Namun dalam praktiknya ada beberapa masalah. Masalah terbesar adalah aplikasi parsial dari trik ini tidak memberikan karakteristik bebas lonjakan yang benar.
Karena masalah latensi selalu menjadi masalah semua atau tidak sama sekali . Jika Anda memiliki satu lonjakan frame selama 10 detik (= 600 frame), maka seluruh sistem jelas gagal. Ini bukan tentang bagaimana lebih baik atau lebih buruk. Itu hanya lulus atau gagal. (atau kurang dari 0,0001%) Lalu di mana sumber lonjakan GC? Itu distribusi beban GC yang buruk. Dan itu karena GC secara fundamental tidak pasti. Jika Anda membuat sampah, maka itu akan mengaktifkan GC, dan lonjakan akan terjadi pada akhirnya. Tentu saja, di dunia ideal di mana beban GC akan selalu ideal, ini tidak akan terjadi, tapi saya hidup di dunia nyata daripada dunia ideal imajiner.
Kemudian jika Anda ingin menghindari lonjakan, Anda harus menghapus semua jenis ref dari keseluruhan sistem. Tapi itu sulit, gila, dan bahkan tidak mungkin karena bagian yang tidak dapat dilepaskan seperti .NET core system dan library. Hanya menggunakan sistem non-GC jauh lebih mudah .
Tidak seperti GC, RC pada dasarnya adalah deterministik, dan Anda tidak harus menggunakan optimasi gila ini (hanya tipe nilai saja) hanya hanya untuk menghindari spike. Yang harus Anda lakukan adalah melacak dan mengoptimalkan bagian yang menyebabkan lonjakan. Dalam sistem RC, spike adalah masalah algoritma lokal, tetapi dalam sistem GC, lonjakan selalu menjadi masalah sistem global.
Saya pikir jawaban saya sudah terlalu banyak di luar topik, dan sebagian besar hanya pengulangan diskusi yang ada. Jika Anda benar-benar ingin mengklaim keunggulan / inferioritas / alternatif atau hal lain dari barang-barang GC / RC, ada banyak diskusi yang ada di situs ini dan StackOverflow, dan Anda dapat terus bertarung di sana.