Back home

Mengoptimalkan Waktu Startup Aplikasi

Optimalkan waktu startup Aplikasi

mengoptimalkan waktu startup aplikasi

https://developer.apple.com/videos/play/wwdc2016/406/

[ Musik ] Selamat pagi dan selamat datang di sesi 406, Mengoptimalkan Waktu Startup Aplikasi. [Musik] Selamat pagi semuanya, dan selamat datang di Kuliah 406: Mengoptimalkan Waktu Startup Aplikasi.

Nama saya Nick Kledzik, dan hari ini saya dan kolega saya Louis akan membawa Anda dalam tur berpemandu tentang bagaimana suatu proses diluncurkan. Nama saya Nick Kledzik, dan hari ini saya dan kolega saya Louis akan mengajak Anda berkeliling tentang bagaimana suatu proses dimulai.

Sekarang Anda mungkin bertanya-tanya, apakah topik ini tepat untuk saya. Sekarang Anda mungkin berpikir, apakah topik ini cocok untuk saya?

Jadi kami meminta tim pemasaran pengembangan crack kami melakukan penelitian, dan mereka menentukan ada tiga kelompok yang akan mendapat manfaat dengan mendengarkan pembicaraan ini. Jadi kami meminta tim pemasaran kami yang hebat untuk melakukan penelitian dan mereka menentukan ada tiga kelompok orang yang akan mendapat manfaat dari mendengarkan pembicaraan ini.

Yang pertama, adalah pengembang aplikasi yang memiliki aplikasi yang diluncurkan dengan lambat. Yang pertama adalah pengembang aplikasi yang peluncuran aplikasinya lambat.

Kelompok kedua adalah pengembang aplikasi yang tidak ingin berada di kelompok pertama [tertawa]. Kelompok kedua adalah para pengembang aplikasi yang tidak mau masuk kelompok pertama [tertawa].

Dan terakhir, siapa saja yang benar-benar penasaran dengan cara kerja OS ini. Terakhir, siapa yang penasaran dengan cara kerja suatu sistem operasi?

Jadi pembicaraan ini akan dibagi menjadi dua bagian, yang pertama lebih banyak teori dan yang kedua lebih praktis, saya akan mengerjakan bagian teori yang pertama. Jadi pembicaraan ini akan dibagi menjadi dua bagian, bagian pertama lebih bersifat teoritis dan bagian kedua lebih praktis, saya akan membahas bagian pertama.

Dan di dalamnya saya akan memandu Anda melalui semua langkah yang terjadi, hingga langkah utama. Saya akan membawa Anda melalui semua langkah yang terjadi, hingga ke bagian utama.

Namun agar Anda memahami dan menghargai semua langkah, pertama-tama saya perlu memberi Anda kursus kilat tentang Mach-O dan Memori Virtual. Namun agar Anda memahami dan mengapresiasinya, pertama-tama saya perlu memberi Anda kursus kilat dalam komputasi analog dan memori virtual.

Jadi pertama-tama beberapa terminologi Mach-O, cepat. Pertama beberapa terminologi Mach-O.

Mach-O adalah sekumpulan jenis file untuk executable run time yang berbeda. Mach-O adalah sekumpulan tipe file untuk executable runtime yang berbeda.

Jadi yang pertama dapat dieksekusi, itulah biner utama dalam suatu aplikasi, juga biner utama dalam ekstensi aplikasi. File pertama yang dapat dieksekusi adalah file biner utama dalam aplikasi dan file biner utama dalam ekstensi aplikasi.

Dylib adalah perpustakaan dinamis, di platform lain, Anda mungkin mengetahuinya sebagai DSO atau DLL. Dylib adalah perpustakaan dinamis, dan pada platform lain Anda mungkin mengetahuinya sebagai DSO atau dll.

Platform kami juga memiliki hal lain yang disebut bundel. Platform kami juga memiliki hal lain yang disebut bundel.

Sekarang sebuah bundel adalah jenis dylib khusus yang tidak dapat Anda tautkan, yang dapat Anda lakukan hanyalah memuatnya saat run time dengan dlopen dan itu digunakan pada Mac OS untuk plug-in. Bundel adalah dylib khusus yang tidak dapat Anda tautkan, yang dapat Anda lakukan hanyalah memuatnya saat runtime melalui dlopen, yang digunakan untuk plugin di Mac OS.

Yang terakhir adalah istilah gambar. Akhirnya ada gambar.

Gambar mengacu pada salah satu dari tiga jenis ini. Gambar mengacu pada salah satu dari tiga jenis ini.

Dan saya akan sering menggunakan istilah itu. Saya akan sering menggunakan kata ini.

Dan yang terakhir, istilah framework sangat berlebihan di industri kita, namun dalam konteks ini, framework adalah sebuah dylib dengan struktur direktori khusus di sekitarnya untuk menampung file yang dibutuhkan oleh dylib tersebut. Terakhir, istilah framework sangat berlebihan di industri kita, namun dalam konteks ini, framework adalah dylib yang memiliki struktur direktori khusus di sekitarnya untuk menampung file yang dibutuhkan dylib tersebut.

Jadi mari selami format gambar Mach-O. Mari langsung beralih ke format gambar Mach-O.

Gambar Mach-O dibagi menjadi beberapa segmen, berdasarkan konvensi semua nama segmen menggunakan huruf besar. Gambar Mach-O disegmentasi menjadi beberapa segmen, dan berdasarkan konvensi, semua nama segmen menggunakan huruf besar.

Sekarang setiap segmen selalu kelipatan ukuran halaman, dalam contoh ini teksnya 3 halaman, DATA dan LINKEDIT masing-masing satu halaman. Sekarang, setiap segmen selalu merupakan kelipatan ukuran halaman, dalam contoh ini teks adalah 3 halaman dan data serta LINKEDIT keduanya 1 halaman.

Sekarang ukuran halaman ditentukan oleh perangkat keras, untuk arm64, ukuran halamannya 16K, yang lainnya 4k. Sekarang ukuran halaman ditentukan oleh hardware, untuk arm64 ukuran halamannya 16K, yang lain 4k.

Sekarang cara lain untuk melihatnya adalah bagian. Pendekatan lainnya adalah segmentasi.

Jadi bagian adalah sesuatu yang dihilangkan oleh kompiler. Jadi sebagiannya diabaikan oleh kompiler.

Namun bagian sebenarnya hanyalah subrentang segmen, tidak memiliki batasan apa pun terkait ukuran halaman, namun tidak tumpang tindih. Namun bagian sebenarnya hanyalah subrentang dari suatu segmen. Mereka tidak memiliki batasan ukuran halaman, namun tidak tumpang tindih.

Sekarang, nama segmen yang paling umum adalah TEXT, DATA, LINKEDIT, bahkan hampir setiap biner memiliki ketiga segmen tersebut. Saat ini, nama segmen yang paling umum adalah TEXT, DATA, dan LINKEDIT. Faktanya, hampir setiap biner memiliki ketiga segmen ini.

Anda dapat menambahkan yang khusus tetapi biasanya tidak menambah nilai apa pun. Anda dapat menambahkan nilai khusus, tetapi biasanya tidak ada nilai yang ditambahkan.

Jadi untuk apa ini digunakan? TEXT ada di awal file, berisi header Mach, berisi instruksi mesin apa pun serta konstanta hanya baca seperti string c. Untuk apa ini? Teksnya ada di awal file, berisi header Mach, yang berisi instruksi mesin apa pun serta konstanta read-only, seperti string c.

Segmen DATA sedang ditulis ulang, segmen DATA berisi semua variabel global Anda. Segmen data ditulis ulang dan berisi semua variabel global.

Dan yang terakhir adalah LINKEDIT. Terakhir, LINKEDIT.Sekarang LINKEDIT tidak berisi fungsi variabel global Anda, LINKEDIT berisi informasi tentang fungsi variabel Anda seperti nama dan alamatnya. LINKEDIT tidak berisi fungsi variabel global, melainkan berisi informasi tentang fungsi variabel, seperti nama dan alamatnya.

Anda mungkin juga pernah mendengar tentang file universal, apa itu? Misalkan Anda membuat aplikasi iOS, untuk 64 bit, dan sekarang Anda memiliki file Mach-O ini, jadi apa yang terjadi pada kode selanjutnya ketika Anda mengatakan Anda juga ingin membuatnya untuk perangkat 32 bit? Saat Anda membangun kembali, Xcode akan membuat file Mach-O terpisah lainnya, yang ini dibuat untuk 32 bit, RB7. Anda mungkin juga pernah mendengar tentang file universal, apa itu? Katakanlah Anda membuat aplikasi iOS untuk 64-bit dan sekarang Anda memiliki file Mach-O ini, lalu apa yang terjadi selanjutnya ketika Anda mengatakan ingin membuatnya untuk perangkat 32-bit juga? Saat Anda membangun kembali, Xcode akan membuat file Mach-O terpisah lainnya, yang ini dibuat untuk 32-bit, RB7.

Dan kemudian kedua file tersebut digabungkan menjadi file ketiga, yang disebut file universal Mach-O. Kedua file ini kemudian digabungkan menjadi file ketiga yang disebut file universal Mach-O.

Dan itu memiliki header di awal, dan semua header memiliki daftar semua arsitektur dan offsetnya di dalam file. Ini memiliki header di awal dengan daftar semua arsitektur dan offsetnya dalam file.

Dan header itu juga berukuran satu halaman. Judul juga seukuran halaman.

Sekarang Anda mungkin bertanya-tanya, mengapa segmen memiliki ukuran beberapa halaman? Mengapa headernya berukuran halaman, dan itu menghabiskan banyak ruang. Sekarang Anda mungkin bertanya-tanya, mengapa segmen memiliki ukuran beberapa halaman? Mengapa headernya berukuran satu halaman, membuang banyak ruang.

Alasan mengapa semuanya berbasis halaman ada hubungannya dengan topik kita berikutnya yaitu memori virtual. Alasan mengapa semuanya berbasis halaman berkaitan dengan topik kita berikutnya dan itu adalah memori virtual.

Jadi apa itu memori virtual? Beberapa dari Anda mungkin mengetahui pepatah dalam rekayasa perangkat lunak bahwa setiap masalah dapat diselesaikan dengan menambahkan tingkat tipuan. Jadi apa itu memori virtual? Beberapa dari Anda mungkin mengetahui pepatah dalam rekayasa perangkat lunak bahwa setiap masalah dapat diselesaikan dengan menambahkan tingkat tipuan.

Jadi masalahnya, memori virtual itu terpecahkan, adalah bagaimana Anda mengelola semua RAM fisik Anda ketika Anda memiliki semua proses ini? Jadi mereka menambahkan sedikit tipuan. Jadi masalah yang dipecahkan oleh memori virtual adalah bagaimana Anda mengelola semua RAM fisik ketika Anda memiliki semua proses ini? Jadi mereka menambahkan beberapa tipuan.

Setiap proses adalah ruang alamat logis yang dipetakan ke beberapa halaman fisik RAM. Setiap proses adalah ruang alamat logis, yang dipetakan ke halaman fisik tertentu dari RAM.

Sekarang pemetaan ini tidak harus satu ke satu, Anda dapat memiliki alamat logis yang tidak menuju ke RAM fisik dan Anda dapat memiliki beberapa alamat logis yang menuju ke RAM fisik yang sama. Sekarang, pemetaan ini tidak harus satu-ke-satu, Anda dapat memiliki alamat logis yang tidak masuk ke RAM fisik, atau Anda dapat memiliki beberapa alamat logis yang masuk ke RAM fisik yang sama.

Ini menawarkan banyak peluang di sini. Ini memberikan banyak peluang.

Jadi apa yang dapat Anda lakukan dengan VM? Pertama, jika Anda memiliki alamat logis yang tidak dipetakan ke RAM fisik apa pun, saat Anda mengakses alamat itu dalam proses Anda, terjadi kesalahan halaman. Jadi apa yang bisa dilakukan VM? Pertama, jika ada alamat logis yang tidak dipetakan ke RAM fisik apa pun, dan ketika Anda mengakses alamat tersebut dalam suatu proses, kesalahan halaman akan terjadi.

Pada saat itu, kernel menghentikan thread tersebut dan mencoba mencari tahu apa yang perlu terjadi. Pada titik ini, kernel menghentikan thread dan mencoba mencari tahu apa yang perlu terjadi.

Hal berikutnya adalah jika Anda memiliki dua proses, dengan alamat logis berbeda, memetakan ke halaman fisik yang sama, kedua proses tersebut sekarang berbagi bit RAM yang sama. Selanjutnya, jika Anda memiliki dua proses dengan alamat logis berbeda, dipetakan ke halaman fisik yang sama, maka kedua proses tersebut sekarang berbagi bit RAM yang sama.

Anda sekarang memiliki pembagian antar proses. Anda sekarang dapat berbagi antar proses.

Fitur menarik lainnya adalah pemetaan yang didukung file. Fitur menarik lainnya adalah pemetaan dukungan file.

Daripada benar-benar membaca seluruh file ke dalam RAM, Anda dapat memberi tahu sistem VM melalui panggilan mmap, saya ingin potongan file ini dipetakan ke rentang alamat ini dalam proses saya. Anda dapat memberi tahu sistem VM melalui panggilan mmap bahwa alih-alih membaca seluruh file ke dalam RAM, saya ingin bagian file ini dipetakan ke rentang alamat ini dalam prosesnya.

Jadi mengapa Anda melakukan itu? Daripada harus membaca keseluruhan file, dengan mengatur pemetaan tersebut, saat Anda pertama kali mengakses alamat-alamat yang berbeda tersebut, seolah-olah Anda telah membacanya di memori, setiap kali Anda mengakses alamat yang belum diakses sebelumnya akan menyebabkan kesalahan halaman, kernel hanya akan membaca satu halaman itu. Jadi mengapa Anda melakukan itu? Daripada harus membaca seluruh file, yang diatur oleh peta, saat Anda pertama kali mengakses alamat yang berbeda ini, jika Anda membacanya di memori, setiap kali Anda mengakses alamat yang belum pernah diakses sebelumnya, itu akan menyebabkan kesalahan halaman dan kernel akan membaca satu halaman.

Dan itu membuat Anda malas membaca file Anda. Hal ini akan membuat Anda malas membaca dokumen Anda.

Sekarang kita dapat menggabungkan semua fitur ini, dan apa yang saya katakan tentang Mach-O, Anda sekarang menyadari bahwa segmen TEKS dari setiap dylib atau gambar tersebut dapat dipetakan ke dalam beberapa proses, akan dibaca dengan malas, dan semua halaman tersebut dapat dibagikan di antara proses-proses tersebut. Sekarang kita dapat menggabungkan semua fitur ini, dan saya sudah bilang Mach-o, Anda sekarang menyadari bahwa segmen teks dari setiap dylib atau gambar dapat dipetakan ke dalam beberapa proses, akan dibaca dengan malas, dan semua halaman tersebut dapat dibagikan di antara proses-proses tersebut.

Bagaimana dengan segmen DATA? Segmen DATA adalah baca, tulis, jadi untuk itu kami memiliki trik yang disebut copy on write, mirip dengan kloning yang terlihat di sistem file Apple. Bagaimana dengan segmen data? Segmen data dibaca dan ditulis, jadi kita mempunyai apa yang disebut teknik copy-on-write, yang agak mirip dengan kloning seperti yang terlihat pada sistem file Apple.Apa yang dilakukan salin dan tulis adalah dengan optimis membagikan halaman DATA di antara semua proses. Apa yang dilakukan salin dan tulis adalah berbagi halaman data secara optimis di antara semua proses.

Apa yang terjadi ketika satu proses, selama mereka hanya membaca dari variabel global bahwa berbagi berhasil. Apa yang terjadi ketika suatu proses berbagi berfungsi selama mereka hanya membaca dari variabel global.

Namun segera setelah suatu proses benar-benar mencoba menulis ke halaman DATA-nya, penyalinan dan penulisan terjadi. Namun segera setelah suatu proses benar-benar mencoba menulis ke halaman datanya, terjadi penyalinan dan penulisan.

Salin dan tulis menyebabkan kernel membuat salinan halaman itu ke RAM fisik lain dan mengarahkan pemetaan ke sana. Salin dan tulis menyebabkan kernel menyalin halaman ke RAM fisik lain dan mengarahkan pemetaan ke RAM fisik tersebut.

Sehingga satu proses sekarang memiliki salinan halaman tersebut sendiri. Jadi suatu proses sekarang memiliki salinan halamannya sendiri.

Yang membawa kita pada halaman bersih versus halaman kotor. Ini membawa kita ke halaman bersih dan kotor.

Sehingga salinan itu dianggap halaman kotor. Sehingga salinan itu dianggap halaman kotor.

Halaman kotor adalah sesuatu yang berisi informasi spesifik proses. Halaman kotor adalah halaman yang berisi informasi spesifik proses.

Halaman bersih adalah sesuatu yang nantinya dapat dibuat ulang oleh kernel jika diperlukan seperti membaca ulang dari disk. Halaman bersih adalah halaman yang dapat dibuat ulang oleh kernel jika diperlukan nanti, seperti membaca ulang dari disk.

Jadi halaman kotor jauh lebih mahal dibandingkan halaman bersih. Jadi halaman kotor jauh lebih mahal dibandingkan halaman bersih.

Dan yang terakhir adalah batas izin berada pada batas halaman. Poin terakhirnya adalah batas izin berada pada batas halaman.

Maksud saya, izinnya adalah Anda dapat menandai halaman sebagai dapat dibaca, dapat ditulis, atau dapat dieksekusi, atau kombinasi keduanya. Yang saya maksud dengan izin adalah Anda dapat menandai halaman sebagai dapat dibaca, dapat ditulis, dapat dieksekusi, atau kombinasi dari semuanya.

Jadi mari kita gabungkan semuanya, saya berbicara tentang format Mach-O, sesuatu tentang memori virtual, mari kita lihat bagaimana keduanya bermain bersama. Mari kita gabungkan semuanya, saya telah membicarakan tentang format Mach-O, sedikit tentang memori virtual, dan mari kita lihat bagaimana keduanya bekerja sama.

Sekarang saya akan melompat ke depan dan berbicara sedikit, bagaimana dyld beroperasi dan dalam beberapa saat saya akan memandu Anda melalui hal ini tetapi untuk saat ini, saya hanya ingin menunjukkan kepada Anda bagaimana ini memetakan antara Mach-O dan memori virtual. Sekarang saya akan melewatkan sedikit dan berbicara sedikit tentang cara kerja dyld, dan saya akan memandu Anda melalui hal ini secara mendetail sebentar lagi, tetapi untuk saat ini, saya hanya ingin menunjukkan kepada Anda bagaimana ini memetakan antara Mach-O dan memori virtual.

Jadi kita punya file dylib di sini, dan daripada membacanya di memori, kita memetakannya di memori. Kami memiliki file dylib di sini, dan alih-alih membacanya di memori, kami memetakannya di memori.

Jadi, dalam memori, dylib ini akan memakan waktu delapan halaman. Di memori, dylib ini membutuhkan 8 halaman.

Penghematannya, kenapa berbeda adalah ZeroFills ini. Yang membuatnya berbeda adalah zero paddings ini.

Jadi ternyata sebagian besar variabel global awalnya nol. Jadi sebagian besar variabel global dimulai dengan 0.

Jadi statis [tidak terdengar] membuat optimasi yang memindahkan semua variabel global nol ke akhir, dan kemudian tidak memakan ruang disk. Jadi statis [tidak terdengar] dioptimalkan untuk memindahkan semua variabel global 0 ke akhir dan kemudian tidak memakan ruang disk.

Dan sebagai gantinya, kami menggunakan fitur VM untuk memberi tahu VM saat pertama kali halaman ini diakses, isi dengan nol. Sebagai gantinya, kami menggunakan fitur VM untuk memberi tahu VM agar mengisinya dengan angka nol saat pertama kali mengakses halaman ini.

Jadi tidak perlu membaca. Jadi tidak perlu membaca.

Jadi hal pertama yang harus dilakukan dyld adalah melihat header Mach, di memori, dalam proses ini. Jadi hal pertama yang dilakukan dyld adalah melihat header Mach di memori selama proses ini.

Jadi akan terlihat di kotak paling atas di memori, ketika itu terjadi, tidak ada apa pun di sana, tidak ada pemetaan ke halaman fisik sehingga terjadi kesalahan halaman. Ia akan melihat kotak paling atas di memori dan ketika itu terjadi, tidak ada apa pun di sana, tidak ada pemetaan ke halaman fisik sehingga terjadi kesalahan halaman.

Pada saat itu kernel menyadari bahwa ini dipetakan ke sebuah file, sehingga ia akan membaca halaman pertama file tersebut, menempatkannya ke dalam RAM fisik, dan mengatur pemetaannya. Pada titik ini, kernel menyadari bahwa peta tersebut adalah sebuah file, sehingga ia membaca halaman pertama dari file tersebut, memasukkannya ke dalam RAM fisik, dan menyetel peta ke dalamnya.

Sekarang dyld sebenarnya bisa mulai membaca header Mach. Sekarang, dyld dapat mulai membaca header Mach.

Bunyinya melalui header Mach, header Mach mengatakan oh, ada beberapa informasi di segmen LINKEDIT yang perlu Anda lihat. Ia akan membaca header Mach, dan header Mach akan mengatakan bahwa ada beberapa informasi di fragmen LINKEDIT yang perlu dilihat.

Jadi sekali lagi, dyld menjatuhkan apa yang ada di kotak paling bawah dalam proses pertama. Sekali lagi, dyld meletakkan isi kotak paling bawah dari proses 1.

Yang lagi-lagi menyebabkan kesalahan halaman. Ini lagi-lagi akan menyebabkan kesalahan halaman.

Kernel melayaninya dengan membaca halaman fisik RAM lainnya, LINKEDIT. Kernel melayaninya dengan membaca halaman fisik lain LINKEDIT RAM.

Sekarang dyld dapat mengharapkan LINKEDIT. Sekarang, dyld dapat menantikan LINKEDIT.

Sekarang dalam proses, LINKEDIT akan memberitahu dyld, Anda perlu melakukan beberapa perbaikan pada halaman DATA ini agar dylib ini dapat dijalankan. Sekarang, selama proses ini, LINKEDIT akan memberi tahu dyld bahwa Anda perlu melakukan beberapa perbaikan pada halaman data ini agar dylib ini dapat dijalankan.

Jadi hal yang sama terjadi, dyld sekarang membaca beberapa data dari halaman DATA, tetapi ada yang berbeda di sini. Hal yang sama terjadi, sekarang saya membaca beberapa data dari halaman data, tetapi ada yang berbeda di sini.

dyld sebenarnya akan menulis sesuatu kembali, itu sebenarnya akan mengubah halaman DATA itu dan pada titik ini, salinan saat menulis terjadi. dyld akan menulis sesuatu kembali, itu akan mengubah halaman data itu, dan pada saat ini, copy-on-write akan terjadi.

Dan halaman ini menjadi kotor. Halaman ini semakin kotor.Jadi berapakah 8 halaman RAM kotor jika saya hanya malloced delapan halaman dan kemudian membaca isinya, saya akan memiliki delapan halaman RAM kotor. Jadi apa memori kotor 8 halaman? Jika saya salah menaruh 8 halaman dan kemudian membacanya, saya akan memiliki 8 halaman memori kotor.

Tapi sekarang saya hanya punya satu halaman RAM kotor dan dua halaman bersih. Tapi sekarang saya hanya punya satu halaman memori kotor dan dua halaman memori bersih.

Jadi apa yang akan terjadi ketika proses kedua memuat dylib yang sama. Jadi apa yang terjadi jika proses kedua memuat dylib yang sama.

Jadi pada proses kedua, dyld melewati langkah yang sama. Pada lintasan kedua, dyld melewati langkah yang sama.

Pertama terlihat pada header Mach, tapi kali ini kernel berkata, ah, saya sudah memiliki halaman itu di RAM di suatu tempat jadi ia hanya mengalihkan pemetaan untuk menggunakan kembali halaman itu, tidak ada iO yang dilakukan. Pertama terlihat pada header Mach, tapi kali ini kernel berkata, ah, saya sudah memiliki halaman itu di suatu tempat di RAM, jadi itu hanya mengarahkan ulang peta untuk menggunakan kembali halaman itu, tidak ada iOs.

Begitu pula dengan LINKEDIT, jauh lebih cepat. Seperti LINKEDIT, lebih cepat.

Sekarang kita masuk ke halaman DATA, pada titik ini kernel harus melihat apakah halaman DATA, salinan bersihnya masih ada di RAM di suatu tempat, dan jika ada maka dapat menggunakannya kembali, jika tidak, maka harus membacanya kembali. Sekarang mari kita lihat halaman data, pada titik ini kernel harus melihat halaman data dan melihat apakah salinan bersih masih ada di suatu tempat di RAM, jika ada maka dapat menggunakannya kembali, jika tidak maka harus membacanya kembali.

Dan sekarang dalam proses ini, dyld akan mengotori RAM. Dalam prosesnya, dyld mencemari RAM.

Sekarang langkah terakhir adalah LINKEDIT hanya diperlukan saat dyld sedang melakukan operasinya. Langkah terakhir adalah LINKEDIT yang hanya diperlukan saat dyld melakukan operasi.

Jadi hal ini dapat memberikan petunjuk kepada kernel, setelah selesai, bahwa ia tidak memerlukan halaman LINKEDIT ini lagi, Anda dapat mengambilnya kembali ketika orang lain membutuhkan RAM. Ini dapat memberikan petunjuk kepada kernel bahwa setelah selesai, ia tidak memerlukan halaman LINKEDIT itu lagi dan Anda dapat mengambilnya kembali ketika orang lain membutuhkan RAM.

Jadi hasilnya sekarang kita punya dua proses yang berbagi dylib ini, masing-masing akan terdiri dari delapan halaman, atau total 16 halaman kotor, tapi sekarang kita hanya punya dua halaman kotor dan satu halaman bersih yang dibagikan. Hasilnya adalah sekarang kita memiliki dua proses yang membagikan dylib ini, masing-masing dengan 8 halaman, atau total 16 halaman kotor, tetapi sekarang kita hanya memiliki dua halaman kotor dan satu halaman bersih yang dibagikan.

Dua hal kecil lainnya yang ingin saya bahas adalah bagaimana dampak keamanan terhadap dyld, dua hal keamanan besar yang berdampak pada dyld. Dua hal kecil lainnya yang ingin saya bicarakan adalah bagaimana keamanan mempengaruhi dyld, dan dua hal besar ini mempengaruhi dyld.

Jadi salah satunya adalah ASLR, pengacakan tata letak ruang alamat, ini adalah teknologi lama satu atau dua dekade, di mana pada dasarnya Anda mengacak alamat beban. Salah satunya adalah ASLR, Address Space Layout Randomization, yang merupakan teknologi dari sepuluh hingga dua puluh tahun yang lalu di mana pada dasarnya Anda mengacak alamat pemuatan.

Yang kedua adalah penandatanganan kode, itu harus terjadi, banyak dari Anda harus berurusan dengan penandatanganan kode, di Xcode, dan Anda menganggap penandatanganan kode sebagai, Anda menjalankan hash kriptografi di seluruh file, dan kemudian menandatanganinya dengan tanda tangan Anda. Yang kedua adalah penandatanganan kode. Banyak orang telah berurusan dengan penandatanganan kode di Xcode. Penandatanganan kode hanya menjalankan hash kriptografi pada seluruh file dan kemudian menandatanganinya dengan tanda tangan.

Nah, untuk memvalidasi waktu proses tersebut, itu berarti seluruh file harus dibaca ulang. Untuk memverifikasi runtime, ini berarti seluruh file harus dibaca ulang.

Jadi apa yang sebenarnya terjadi pada waktu pembuatan adalah setiap halaman file Mach-O Anda mendapatkan hash kriptografiknya sendiri. Jadi apa yang sebenarnya terjadi pada waktu pembuatan adalah setiap halaman file Mach-O memiliki hash kriptografinya sendiri.

Dan semua hash tersebut disimpan di LINKEDIT. Semua tabel hash ini disimpan di LINKEDIT.

Hal ini memungkinkan setiap halaman divalidasi bahwa halaman tersebut belum dirusak dan merupakan milik Anda pada halaman tersebut tepat pada waktunya. Ini memverifikasi setiap halaman untuk memastikan halaman tersebut tidak dirusak dan merupakan halaman yang Anda miliki saat Anda berada di halaman tersebut.

Oke, jadi kita sudah menyelesaikan kursus kilatnya, sekarang saya akan memandu Anda dari eksekutif ke utama. Oke, kita sudah menyelesaikan kursus kilat, sekarang saya akan membawa Anda dari eksekutif ke utama.

Jadi apa itu eksekutif? Exec adalah panggilan sistem. Jadi apa itu eksekutif? Exec adalah panggilan sistem.

Ketika Anda terjebak dalam kernel, pada dasarnya Anda mengatakan saya ingin mengganti proses ini dengan program baru ini. Ketika Anda terjebak di kernel, pada dasarnya Anda dapat mengatakan saya ingin mengganti proses ini dengan program baru ini.

Kernel menghapus seluruh ruang alamat dan memetakan executable yang Anda tentukan. Kernel membersihkan dan memetakan seluruh ruang alamat dalam executable yang ditentukan.

Sekarang untuk ASLR ia memetakannya ke alamat acak. Untuk ASLR, ini dipetakan ke alamat acak.

Hal berikutnya yang dilakukannya adalah dari acak itu, kembali ke nol, itu menandai bahwa seluruh wilayah tidak dapat diakses, maksud saya itu ditandai tidak dapat dibaca, tidak dapat ditulis, tidak dapat dieksekusi. Hal berikutnya yang dilakukannya adalah dari acak itu, kembali ke 0, itu menandai seluruh area sebagai tidak dapat diakses, maksud saya menandainya sebagai tidak dapat dibaca, tidak dapat ditulis, tidak dapat dieksekusi.

Ukuran wilayah tersebut minimal 4KB untuk proses 32 bit dan minimal 4GB untuk proses 64 bit. Ukuran area ini minimal harus 4KB untuk proses 32-bit dan 4GB untuk proses 64-bit.

Ini menangkap referensi pointer NULL dan juga memperkirakan lebih banyak bit, menangkap pemotongan pointer apa pun. Ia menangkap referensi penunjuk nol apa pun, dan memprediksi lebih banyak bit, ia menangkap pemotongan penunjuk apa pun.

Sekarang, hidup terasa mudah selama beberapa dekade pertama Unix karena yang saya lakukan hanyalah memetakan sebuah program, mengatur PC ke dalamnya, dan mulai menjalankannya. Selama beberapa dekade pertama, kehidupan di Unix sangatlah sederhana karena yang saya lakukan hanyalah memetakan sebuah program, memasukkan PC saya ke dalamnya, dan mulai menjalankannya.

Dan kemudian perpustakaan bersama ditemukan. Kemudian, perpustakaan bersama ditemukan.Jadi siapa yang memuat dylib? Mereka segera menyadari bahwa mereka menjadi sangat rumit dengan cepat dan orang-orang kernel tidak ingin kernel melakukannya, jadi program pembantu pun dibuat. Jadi siapa yang memasang dylib? Mereka segera menyadari bahwa mereka menjadi sangat kompleks dengan sangat cepat dan orang-orang kernel tidak ingin kernel melakukannya, sehingga program pembantu dibuat.

Di platform kami, ini disebut dyld. Platform kami disebut dyld.

Di Unix lain Anda mungkin mengenalnya sebagai LD. Di Unix lain Anda mungkin mengenalnya sebagai LD.

Jadi. Jadi.

Jadi ketika kernel selesai memetakan suatu proses, ia sekarang memetakan Mach-O lain yang disebut dyld ke dalam proses itu di alamat acak lain. Jadi ketika kernel telah selesai memetakan proses, ia sekarang memetakan Mach-O lain bernama dyld ke dalam proses di alamat acak lain.

Atur PC ke dyld dan mari kita selesaikan peluncuran prosesnya. Atur PC ke dyld dan biarkan dyld menyelesaikan prosesnya.

Jadi sekarang dyld sedang berjalan dalam proses dan tugasnya adalah memuat semua dylib yang Anda andalkan dan menyiapkan dan menjalankan semuanya. Sekarang dyld sudah berjalan, tugasnya adalah memuat semua dylib yang Anda andalkan dan menyiapkan semuanya dan berjalan.

Jadi mari kita ikuti langkah-langkah tersebut. Mari kita lihat langkah-langkahnya.

Ini adalah serangkaian langkah dan memiliki semacam garis waktu di bagian bawah sini, saat kita melewatinya, kita akan menelusuri garis waktu. Ini adalah serangkaian langkah dan memiliki garis waktu di bagian bawah dan saat kita melewatinya, kita melewati garis waktu.

Jadi hal pertama yang harus dilakukan adalah dyld harus memetakan semua dylib yang bergantung. Pertama, dyld perlu memetakan semua dylib yang bergantung.

Lalu apa saja dylib dependennya? Untuk menemukannya, pertama-tama ia membaca header dari executable utama yang sudah dipetakan oleh kernel. Header itu adalah daftar semua perpustakaan yang bergantung. Apa itu dylib dependen? Untuk menemukan file-file ini, pertama-tama ia membaca header utama yang dapat dieksekusi yang telah dipetakan oleh kernel ke dalam header file tersebut, yang merupakan daftar semua perpustakaan yang bergantung.

Jadi itu harus diuraikan. Itu perlu diurai.

Kemudian ia harus menemukan setiap dylib. Kemudian ia harus menemukan setiap dylib.

Dan setelah menemukan setiap dylib, ia harus membuka dan menjalankan awal setiap file, ia perlu memastikan bahwa itu adalah file Mach-O, memvalidasinya, menemukan tanda tangan kodenya, mendaftarkan tanda tangan kode tersebut ke kernel. Setelah menemukan setiap dylib, ia harus membuka dan menjalankan awal setiap file, ia perlu memastikan bahwa itu adalah file Mach-O, memverifikasinya, menemukan tanda tangan kodenya, dan mendaftarkan tanda tangan kode tersebut ke kernel.

Dan kemudian ia dapat memanggil mmap di setiap segmen di dylib itu. Kemudian ia dapat memanggil mmap di setiap segmen di dylib.

Oke, jadi itu cukup sederhana. Sangat sederhana.

Aplikasi Anda mengetahui tentang kernel dyld, dyld lalu berkata oh aplikasi ini bergantung pada dylib A dan B, muat keduanya, selesai. Aplikasi Anda mengetahui tentang kernel dyld, dan kemudian dyld berkata, aplikasi ini bergantung pada dylib A dan B, muat keduanya dan selesai.

Nah, ini menjadi lebih rumit, karena A. Hal ini menjadi lebih rumit karena A.

dilib dan B. dilib dan B.

dylib sendiri dapat bergantung pada dylib. dylibs sendiri dapat bergantung pada dylibs.

Jadi dyld harus melakukan hal yang sama lagi untuk masing-masing dylib tersebut, dan masing-masing dylib tersebut mungkin bergantung pada sesuatu yang sudah dimuat atau sesuatu yang baru sehingga harus menentukan apakah sudah dimuat atau belum, dan jika belum, maka perlu memuatnya. Jadi dyld harus melakukan hal yang sama untuk setiap dylib, setiap dylib mungkin bergantung pada sesuatu yang sudah dimuat atau baru dimuat sehingga harus menentukan apakah sudah dimuat dan jika belum, perlu memuatnya.

Jadi, ini terus berlanjut. Ini terus berlanjut.

Dan akhirnya semuanya dimuat. Akhirnya itu memuat semuanya.

Sekarang jika Anda melihat suatu proses, rata-rata proses di sistem kami, memuat antara 1 hingga 400 dylib, jadi itu banyak sekali dylib yang harus dimuat. Sekarang, jika Anda melihat suatu proses, rata-rata proses di sistem kami, memiliki antara 1 dan 400 dylib yang dimuat, jadi itu adalah banyak sekali dylib yang harus dimuat.

Untungnya sebagian besar adalah dylib OS, dan kami melakukan banyak pekerjaan saat membangun OS untuk melakukan pra-perhitungan dan melakukan pra-cache banyak pekerjaan yang harus dilakukan dyld untuk memuat hal-hal ini. Untungnya, kebanyakan dari mereka adalah dylib OS dan kami melakukan banyak pekerjaan saat membangun OS untuk melakukan pra-komputasi dan melakukan pra-cache banyak pekerjaan yang diperlukan agar dylib dapat memuat hal-hal ini.

Jadi dylib OS memuat dengan sangat, sangat cepat. Jadi dylib OS memuat dengan sangat cepat.

Jadi sekarang kita sudah memuat semua dylib, tapi semuanya berada dalam posisi mengambang yang independen satu sama lain, dan sekarang kita harus mengikatnya bersama-sama. Sekarang kita sudah memuat semua dylib, tetapi semuanya ada di floatnya masing-masing, kita perlu mengikatnya bersama-sama.

Itu disebut perbaikan. Inilah yang disebut bisa diatur.

Namun satu hal tentang perbaikan yang telah kami pelajari, karena penandatanganan kode kami tidak dapat mengubah instruksi. Namun satu hal yang telah kami pelajari tentang perbaikan adalah kami tidak dapat mengubah instruksi karena penandatanganan kode.

Jadi bagaimana cara satu dylib memanggil dylib lain jika Anda tidak dapat mengubah instruksi cara pemanggilannya? Ya, kami menelepon kembali teman lama kami, dan kami menambahkan banyak tipuan lama. Jadi, bagaimana cara satu dylib memanggil dylib lain jika Anda tidak dapat mengubah instruksi pemanggilannya? Baiklah, mari kita telepon kembali seorang teman lama dan berikan banyak ucapan tidak langsung.

Jadi gen kode kita disebut PIC dinamis. Jadi pembuatan kode kita disebut PIC dinamis.

Ini diposisikan sebagai kode independen, artinya kode dapat dimuat ke dalam alamat dan bersifat dinamis, artinya segala sesuatunya ditujukan secara tidak langsung. Ini adalah kode yang tidak bergantung pada lokasi, yang berarti kode dapat dimuat ke dalam alamat, dan dinamis, yang berarti segala sesuatunya ditangani secara tidak langsung.Artinya adalah memanggil satu hal ke hal lain, co-gen sebenarnya membuat sebuah pointer di segmen DATA dan pointer tersebut menunjuk ke apa yang ingin Anda panggil. Artinya untuk memanggil dari satu hal ke hal lain, co-gen sebenarnya membuat sebuah pointer di segmen data yang menunjuk ke hal yang akan dipanggil.

Kode memuat penunjuk itu dan melompat ke penunjuk. Kode memuat penunjuk itu dan melompat ke sana.

Jadi yang dilakukan dyld hanyalah memperbaiki petunjuk dan data. Jadi yang dilakukan dyld adalah memperbaiki pointer dan data.

Sekarang ada dua kategori utama fix-up, rebasing dan binding, lalu apa bedanya? Jadi rebasing adalah jika Anda memiliki penunjuk yang mengarah ke dalam gambar Anda, dan penyesuaian apa pun yang diperlukan untuk itu, yang kedua bersifat mengikat. Sekarang ada dua jenis perbaikan utama, rebasing dan binding, lalu apa bedanya? Jadi, jika Anda memiliki penunjuk ke gambar Anda dan memerlukan penyesuaian apa pun, yang kedua bersifat mengikat.

Binding adalah jika Anda menunjuk sesuatu di luar gambar Anda. Binding adalah saat Anda menunjuk sesuatu di luar gambar Anda.

Dan masing-masingnya perlu diperbaiki secara berbeda, jadi saya akan membahas langkah-langkahnya. Masing-masing memerlukan perbaikan yang berbeda, jadi saya akan membahas langkah-langkahnya satu per satu.

Tapi pertama-tama, jika Anda penasaran, ada perintah, dyld info dengan banyak pilihan di dalamnya. Tapi pertama-tama, jika Anda penasaran, ada perintahnya, dyld info, dengan banyak pilihan di dalamnya.

Anda dapat menjalankan ini pada biner apa pun dan Anda akan melihat semua perbaikan yang harus dilakukan dyld agar biner tersebut dapat mempersiapkannya. Anda dapat menjalankan ini pada biner apa pun dan Anda akan melihat semua modifikasi yang dilakukan oleh dyld pada biner tersebut.

Jadi rebasing. Jadi penetapan harga ulang.

Nah di masa lalu Anda dapat menentukan alamat pemuatan pilihan untuk setiap dylib, dan alamat pemuatan pilihan itu adalah linker statis dan dyld bekerja sama sehingga, jika Anda memuat, ke alamat pemuatan pilihan itu, semua petunjuk dan data yang seharusnya dikodekan secara internal, sudah benar dan dyld tidak perlu melakukan perbaikan apa pun. Di usia tua Anda dapat menentukan alamat pemuatan prioritas untuk setiap dylib, dan alamat pemuatan prioritas adalah linker statis dan dyld bekerja bersama, jika Anda memuat, alamat pemuatan prioritas, semua pointer dan data harus ada dalam kode internal, benar dan dyld tidak perlu melakukan apa pun untuk mengaturnya.

Namun saat ini, dengan ASLR, dylib Anda dimuat ke alamat acak. Namun sekarang, dengan ASLR, dylib Anda dimuat ke alamat acak.

Itu meluncur ke beberapa alamat lain, yang berarti semua pointer dan data tersebut sekarang masih menunjuk ke alamat lama. Itu berpindah ke alamat lain, yang berarti semua petunjuk dan data tersebut sekarang masih mengarah ke alamat lama.

Jadi untuk memperbaikinya, kita perlu menghitung slide, berapa banyak yang telah dipindahkan, dan untuk masing-masing penunjuk interior tersebut, pada dasarnya menambahkan nilai slide ke dalamnya. Untuk mengatasi masalah ini, kita perlu menghitung penggeser, yaitu seberapa banyak ia bergerak, dan untuk setiap penunjuk internal, kita perlu menambahkan nilai penggeser ke dalamnya.

Jadi rebasing berarti menelusuri semua penunjuk data Anda, yang bersifat internal, dan pada dasarnya menambahkan slide ke dalamnya. Jadi relokasi berarti mengulangi semua penunjuk data, yang bersifat internal, dan pada dasarnya menambahkan slide ke dalamnya.

Jadi konsepnya sangat sederhana, baca, tambah, tulis, baca, tambah, tulis. Konsepnya sederhana, baca, tambah, tulis, baca, tambah, tulis.

Tapi di manakah petunjuk data itu? Jika penunjuk tersebut berada di segmen Anda, dikodekan dalam segmen LINKEDIT. Tapi di manakah petunjuk data itu? Petunjuk ini ada di segmen Anda, yang dikodekan dalam segmen LINKEDIT.

Sekarang, pada titik ini, yang kita miliki hanyalah semuanya dipetakan, jadi ketika kita mulai melakukan rebasing, kita sebenarnya menyebabkan kesalahan halaman pada semua halaman DATA. Sekarang, pada titik ini, apa yang kita miliki adalah semuanya dipetakan, jadi ketika kita mulai melakukan rebasing, kita sebenarnya menyebabkan kesalahan halaman di semua halaman data.

Dan kemudian kami menyebabkan penyalinan dan penulisan saat kami mengubahnya. Saat kami mengubahnya, penyalinan dan penulisan terjadi.

Jadi rebasing terkadang bisa mahal karena semua iO. Jadi relokasi terkadang mahal karena iOs.

Namun salah satu trik yang kami lakukan adalah melakukannya secara berurutan dan dari sudut pandang kernel, ia melihat kesalahan data terjadi secara berurutan. Namun salah satu trik yang akan kita lakukan adalah melakukannya secara berurutan, sehingga dari sudut pandang kernel, kesalahan data akan terlihat terjadi secara berurutan.

Dan ketika melihat hal itu, kernel, membaca ke depan untuk kita yang membuat iO lebih murah. Ketika melihat hal ini, kernel membacakan data untuk kita sebelumnya, sehingga mengurangi biaya iOs.

Jadi selanjutnya adalah mengikat, mengikat adalah untuk pointer yang menunjuk di luar dylib Anda. Berikutnya adalah binding, yaitu penunjuk ke luar dylib.

Mereka sebenarnya terikat berdasarkan nama, sebenarnya adalah string, dalam hal ini, malloc disimpan di tautan edit, yang mengatakan penunjuk data ini harus menunjuk ke malloc. Mereka sebenarnya terikat berdasarkan nama, sebenarnya string, dan dalam contoh ini, malloc disimpan dalam edit tautan, yang mengatakan bahwa penunjuk data ini harus menunjuk ke malloc.

Jadi pada saat run time, dyld perlu menemukan implementasi simbol tersebut, yang memerlukan banyak komputasi, dengan melihat melalui tabel simbol. Jadi pada saat runtime, dyld perlu benar-benar menemukan implementasi simbol tersebut, yang memerlukan komputasi intensif dan memerlukan melihat tabel simbol.

Setelah ditemukan, nilai itulah yang disimpan dalam penunjuk data itu. Setelah ditemukan, nilai tersebut disimpan dalam penunjuk data tersebut.

Jadi ini jauh lebih rumit secara komputasi daripada rebasing. Jadi ini jauh lebih rumit daripada penargetan ulang.

Namun iO sangat sedikit karena rebasing telah melakukan sebagian besar iO. Namun iO yang ada sangat sedikit karena Chongji telah menyelesaikan sebagian besar iO.

Selanjutnya, ObjC memiliki banyak struktur DATA, struktur kelas DATA yang merupakan penunjuk ke metodenya dan penunjuk ke super gloss dan sebagainya. Selanjutnya, ObjC memiliki banyak struktur data, struktur data kelas adalah penunjuk ke metodenya dan penunjuk ke super glossy dan seterusnya.Hampir semuanya diperbaiki, melalui rebasing atau binding. Hampir semuanya diperbaiki melalui rebase atau binding.

Namun ada beberapa hal tambahan yang memerlukan waktu berjalan ObjC. Namun runtime ObjC memerlukan sesuatu yang ekstra.

Yang pertama adalah ObjC adalah bahasa dinamis dan Anda dapat meminta kelas dibuktikan berdasarkan namanya. Yang pertama adalah ObjC adalah bahasa dinamis dan Anda dapat meminta kelas untuk dikonfirmasi namanya.

Jadi itu berarti run time ObjC harus memelihara tabel semua nama kelas mana yang dipetakan. Ini berarti runtime ObjC harus memelihara tabel yang berisi semua nama kelas yang dipetakan.

Jadi setiap kali Anda memuat sesuatu, ia mendefinisikan sebuah kelas, namanya harus didaftarkan pada tabel global. Jadi setiap kali sesuatu dimuat, ia mendefinisikan sebuah kelas dan namanya perlu didaftarkan dalam tabel global.

Selanjutnya, di C++ Anda mungkin pernah mendengar tentang masalah ivar yang rapuh, maaf. Selanjutnya, di c++ Anda mungkin pernah mendengar tentang masalah ivar yang rapuh, maaf.

Masalah kelas dasar yang rapuh. Masalah kelas dasar yang rapuh.

Kami tidak memiliki masalah dengan ObjC karena salah satu perbaikan yang kami lakukan adalah mengubah offset semua ivar secara dinamis, pada waktu muat. ObjC tidak mengalami masalah ini karena perbaikan yang kami lakukan adalah mengubah offset semua ivar saat dimuat secara dinamis.

Selanjutnya, di ObjC Anda dapat menentukan kategori yang mengubah metode kelas lain. Selanjutnya, di ObjC, Anda bisa menentukan kategori yang mengubah metode kelas lain.

Terkadang metode tersebut berada di kelas yang tidak ada dalam gambar Anda di dylib lain, sehingga perbaikan metode tersebut harus diterapkan pada saat ini. Terkadang kelas-kelas ini tidak ada dalam gambar di dylib lain dan metode ini harus diterapkan pada saat itu.

Dan yang terakhir, ObjC [tidak terdengar] didasarkan pada penyeleksi yang unik sehingga kita memerlukan penyeleksi yang unik. Terakhir, ObjC [tidak terdengar] didasarkan pada penyeleksi yang unik sehingga kita memerlukan penyeleksi yang unik.

Jadi sekarang pekerjaan yang telah kita lakukan semua perbaikan DATA, sekarang kita bisa melakukan semua perbaikan DATA yang pada dasarnya dapat dijelaskan secara statis. Sekarang kita telah melakukan semua koreksi data, sekarang kita dapat melakukan semua koreksi data yang pada dasarnya dapat dijelaskan secara statis.

Jadi sekarang adalah kesempatan kita untuk melakukan perbaikan DATA dinamis. Sekarang saatnya kita melakukan perbaikan data dinamis.

Jadi di C++, Anda dapat memiliki inisialisasi, Anda dapat mengatakan [tidak terdengar] sama dengan ekspresi apa pun yang Anda inginkan. Di C++, Anda dapat memiliki penginisialisasi dan Anda dapat mengatakan [tidak terdengar] sama dengan ekspresi apa pun yang Anda inginkan.

Ekspresi sewenang-wenang itu, saat ini perlu dijalankan dan dijalankan pada saat ini. Ekspresi sewenang-wenang ini, yang sekarang perlu dijalankan, telah dijalankan.

Jadi kompiler C++ menghasilkan inisialisasi untuk inisialisasi DATA sewenang-wenang ini. Kompiler C++ menghasilkan inisialisasi untuk inisialisasi data sewenang-wenang ini.

Di ObjC, ada sesuatu yang disebut metode +load. Di ObjC, ada metode yang disebut +load.

Sekarang metode +load sudah tidak digunakan lagi, kami menyarankan Anda untuk tidak menggunakannya. Metode +load sekarang tidak digunakan lagi dan kami menyarankan Anda untuk tidak menggunakannya.

Kami menyarankan Anda menggunakan inisialisasi plus. Kami menyarankan Anda menggunakan +inisialisasi.

Namun jika Anda memilikinya, saat ini sudah dijalankan. Namun jika Anda memilikinya, itu akan berjalan pada saat ini.

Jadi, sekarang saya memiliki grafik besar ini, kami memiliki bagian atas utama yang dapat dieksekusi, semua dylib bergantung pada grafik besar ini, kami harus menjalankan inisialisasi. Sekarang saya memiliki grafik besar ini, kami memiliki executable utama Anda di atas yang menjadi sandaran semua dylib, grafik besar ini, kita harus menjalankan penginisialisasi.

Urutan apa yang kita inginkan? Ya, kami menjalankannya dari bawah ke atas. Dalam urutan apa kita ingin mengaturnya? Mari kita hitung dari bawah ke atas.

Dan alasannya adalah, ketika inisialisasi dijalankan, mungkin perlu memanggil beberapa dylib dan Anda ingin memastikan bahwa dylib sudah siap untuk dipanggil. Alasannya adalah ketika init berjalan, mungkin perlu memanggil beberapa dylib, dan Anda perlu memastikan dylib tersebut siap untuk dipanggil.

Jadi dengan menjalankan inisialisasi dari bawah hingga ke atas kelas aplikasi, Anda aman untuk memanggil sesuatu yang Anda andalkan. Oleh karena itu, dengan menjalankan penginisialisasi dari bawah ke atas, Anda dapat memanggil hal-hal yang Anda andalkan dengan aman.

Jadi setelah semua initiliazer selesai, sekarang kita akhirnya bisa memanggil program dyld utama. Setelah semua rutinitas inisialisasi selesai, sekarang kita akhirnya dapat memanggil program dyld utama

Jadi Anda selamat dari bagian teori ini, Anda sekarang semua ahli tentang bagaimana proses dimulai, Anda sekarang tahu bahwa dyld adalah program pembantu, ia memuat semua perpustakaan yang bergantung, memperbaiki semua halaman DATA, menjalankan inisialisasi dan kemudian melompat ke utama. Jadi Anda telah melewati bagian teori ini, Anda sekarang sudah ahli dalam bagaimana proses dimulai, dan Anda sekarang tahu bahwa dyld adalah program pembantu yang memuat semua perpustakaan dependen, memperbaiki semua halaman data, menjalankan penginisialisasi, dan kemudian melompat ke main.

Jadi sekarang untuk menerapkan semua teori yang telah Anda pelajari ini, saya ingin menyerahkannya kepada Louis, yang akan memberi Anda beberapa tip praktis. Sekarang, untuk mempraktikkan teori yang telah Anda pelajari, saya ingin menyerahkannya kepada Louis, yang akan memberi Anda beberapa nasihat praktis.

Terima kasih, Nick. Terima kasih, Nick.

Kita semua pernah mengalami pengalaman ketika kita mengeluarkan ponsel dari saku, menekan tombol beranda, lalu mengetuk aplikasi yang ingin kita jalankan. Kita semua pernah mengalaminya: kita mengeluarkan ponsel dari saku, menekan tombol beranda, dan mengklik aplikasi yang ingin kita jalankan.

Lalu ketuk, ketuk, lalu ketuk lagi pada beberapa tombol karena tidak merespons. Kemudian klik, dan klik, dan klik beberapa tombol lagi karena tidak merespons.

Ketika itu terjadi pada saya, itu benar-benar membuat frustrasi, dan saya ingin menghapus aplikasi tersebut. Ketika ini terjadi pada saya, saya menjadi sangat frustrasi dan ingin menghapus aplikasi tersebut.

Saya Louis Gerbarg. Saya bekerja di dyld dan hari ini, kita akan membahas cara membuat aplikasi Anda diluncurkan secara instan, sehingga pengguna Anda senang. Saya Louis Gerbarg, saya bekerja di dyld, dan hari ini kita akan membahas tentang cara membuat aplikasi Anda diluncurkan secara instan sehingga pengguna Anda akan senang.Jadi pertama-tama, mari kita bahas apa yang akan kita bahas pada bagian pembicaraan ini. Pertama, mari kita bahas bagian ini.

Kami akan membahas seberapa cepat Anda benar-benar perlu meluncurkannya agar pengguna Anda mendapatkan pengalaman yang baik. Kami akan membahas seberapa cepat Anda sebenarnya perlu memberikan pengalaman yang baik kepada pengguna Anda.

Bagaimana mengukur waktu peluncuran tersebut. Bagaimana mengukur waktu peluncuran.

Karena itu bisa sangat sulit. Karena itu sangat sulit.

Cara standar untuk mengukur aplikasi Anda tidak berlaku sebelum kode Anda dapat dijalankan. Sampai kode dapat dijalankan, metode standar pengukuran aplikasi tidak berlaku.

Kami akan membahas daftar alasan umum mengapa kode Anda, atau maaf kami akan membahas daftar alasan umum mengapa peluncuran Anda lambat. Kami akan mencantumkan beberapa alasan umum untuk menjelaskan mengapa kode Anda dimulai dengan lambat. Maaf, kami akan mencantumkan beberapa alasan umum untuk menjelaskan mengapa kode Anda dimulai dengan lambat.

Dan terakhir, kita akan membahas cara untuk memperbaiki semua perlambatan tersebut. Terakhir, yang ingin kami bicarakan adalah solusi untuk semua masalah kelambatan.

Jadi saya akan memberi Anda sedikit spoiler untuk sisa pembicaraan saya. Jadi di sisa pidato saya, saya akan menceritakan sebuah episode kecil kepada Anda.

Anda perlu melakukan lebih sedikit hal [tertawa]. Anda perlu melakukan lebih sedikit [tertawa].

Sekarang, saya tidak bermaksud bahwa aplikasi Anda harus memiliki lebih sedikit fitur, yang saya maksudkan adalah aplikasi Anda harus melakukan lebih sedikit hal sebelum dapat berjalan. Sekarang, saya tidak mengatakan aplikasi Anda harus memiliki lebih sedikit fitur, saya mengatakan aplikasi Anda harus melakukan lebih sedikit hal sebelum dapat berjalan.

Kami ingin Anda mengetahui cara menunda beberapa perilaku peluncuran untuk menginisialisasinya sebelum eksekusi. Kami harap Anda dapat mengetahui cara menunda beberapa perilaku startup agar dapat diinisialisasi sebelum dieksekusi.

Jadi, mari kita bahas tujuannya, seberapa cepat kita ingin meluncurkannya. Jadi, mari kita bicara tentang tujuan, seberapa cepat kita ingin meluncurkannya.

Nah, waktu peluncuran untuk berbagai platform berbeda-beda. Waktu startup berbeda untuk platform yang berbeda.

Namun, aturan praktis yang bagus adalah 400 milidetik adalah waktu peluncuran yang baik. Namun, aturan praktisnya adalah 400 milidetik adalah waktu startup yang baik.

Sekarang, alasannya adalah kami telah meluncurkan animasi di ponsel untuk memberikan kesan kesinambungan antara layar beranda dan aplikasi Anda, saat Anda melihatnya dijalankan. Alasannya adalah kami memulai animasi di ponsel untuk memberikan kesan kontinuitas saat Anda melihat layar beranda dan aplikasi Anda dijalankan.

Dan animasi tersebut memerlukan waktu, dan animasi tersebut memberi Anda kesempatan untuk menyembunyikan waktu peluncuran Anda. Animasi ini memerlukan waktu, dan animasi ini memberi Anda kesempatan untuk menyembunyikan waktu mulai Anda.

Tentu saja itu mungkin berbeda, dalam konteks yang berbeda, ekstensi aplikasi Anda juga merupakan aplikasi yang harus diluncurkan, mereka diluncurkan dalam jangka waktu yang berbeda. Tentu saja, ini mungkin berbeda, dalam situasi yang berbeda, ekstensi aplikasi Anda juga merupakan aplikasi yang perlu diluncurkan, dan diluncurkan pada waktu yang berbeda.

Ponsel, TV, dan jam tangan adalah hal yang berbeda, tetapi 400 milidetik adalah target yang bagus. Ponsel, TV, jam tangan adalah hal yang berbeda, tetapi 400 milidetik adalah target yang bagus.

Anda tidak akan pernah membutuhkan waktu lebih dari 20 detik untuk meluncurkannya. Waktu peluncuran tidak boleh lebih dari 20 detik.

Jika Anda membutuhkan waktu lebih dari 20 detik, OS akan mematikan aplikasi Anda, dengan asumsi aplikasi sedang melalui putaran tak terbatas, dan kita semua pernah mengalaminya. Jika Anda membutuhkan waktu lebih dari 20 detik, sistem akan mematikan aplikasi Anda, dengan asumsi aplikasi sedang melalui putaran tak terbatas, kita semua pernah mengalaminya.

Saat Anda mengeklik suatu aplikasi, aplikasi itu muncul di layar beranda, tidak merespons, lalu hilang begitu saja, dan itulah yang biasanya terjadi di sini. Saat Anda mengetuk suatu aplikasi, aplikasi tersebut muncul di layar beranda, menjadi tidak responsif, lalu menghilang, yang biasanya terjadi di sini.

Terakhir, sangat penting untuk menguji pada perangkat Anda yang didukung paling lambat. Terakhir, penting untuk menguji pada perangkat paling lambat yang didukung.

Jadi pengatur waktu tersebut adalah nilai konstan di semua perangkat yang didukung di platform kami. Jadi pengatur waktu ini konstan untuk semua perangkat yang didukung di platform kami.

Jadi, jika Anda mencapai 400 milidetik pada iPhone 6S yang Anda gunakan untuk pengujian saat ini, Anda mungkin hanya mencapainya sedikit, Anda mungkin tidak akan mencapainya pada iPhone 5. Jadi, jika Anda mengetuk selama 400 milidetik pada iPhone 6S yang Anda uji, Anda mungkin mengetuknya saja, dan mungkin tidak mengetuknya di iPhone 5.

Jadi, mari kita rekap bagian pembicaraan Nick. Mari kita tinjau pidato Nick.

Apa yang harus kita lakukan untuk meluncurkannya, kita harus mengurai gambar, memetakan gambar, mengubah basis gambar, mengikat gambar, menjalankan inisialisasi gambar, dan kemudian memanggil main. Apa yang perlu kita lakukan untuk memulai, kita perlu mengurai gambar, memetakan gambar, mengatur ulang gambar, mengikat gambar, menjalankan inisialisasi gambar, dan kemudian memanggil main.

Jika kedengarannya terlalu banyak, ya, saya lelah hanya mengatakannya. Jika kedengarannya terlalu banyak, memang benar, dan saya lelah hanya mengatakannya.

Dan setelah itu, kita harus memanggil UIApplicationMain, Anda akan melihatnya di aplikasi ObjC atau aplikasi Swift Anda ditangani secara implisit. Kemudian, kita perlu memanggil UIApplicationMain, yang akan Anda lihat ditangani secara implisit di aplikasi ObjC atau aplikasi Swift Anda.

Itu melakukan beberapa hal lain, termasuk menjalankan inisialisasi kerangka kerja dan memuat nib Anda. Ia juga dapat melakukan beberapa hal lain, termasuk menjalankan penginisialisasi kerangka kerja dan memuat nib.

Dan akhirnya Anda akan mendapat panggilan kembali di delegasi aplikasi Anda. Terakhir, Anda akan mendapatkan panggilan balik di delegasi aplikasi.

Saya menyebutkan dua yang terakhir ini karena keduanya dihitung dalam waktu 400 milidetik yang baru saja saya sebutkan. Saya menyebutkan dua yang terakhir karena dihitung menggunakan 400 milidetik yang baru saja saya sebutkan.

Namun kami tidak akan membahasnya dalam pembicaraan ini. Namun kami tidak akan membahasnya dalam pembicaraan ini.Jika Anda ingin gambaran yang lebih baik tentang apa yang terjadi di sana, ada pembicaraan dari tahun 2012, daya tanggap kinerja aplikasi iOS. Jika Anda ingin lebih memahami apa yang terjadi di sana, ada pembicaraan tahun 2012, Responsif Kinerja Aplikasi iOS.

Saya sangat menyarankan Anda kembali dan melihat videonya. Saya sangat menyarankan Anda kembali dan menonton videonya.

Namun itu adalah hal terakhir yang akan kita bicarakan saat ini. Tapi itu hal terakhir yang akan kita bicarakan sekarang.

Jadi, mari kita lanjutkan, satu hal lagi yang ingin saya bicarakan, peluncuran hangat versus peluncuran dingin. Jadi mari kita beralih ke hal lain yang ingin saya katakan, emisi panas dan emisi dingin.

Jadi saat Anda meluncurkan aplikasi, kita berbicara tentang peluncuran hangat dan dingin. Saat Anda memulai aplikasi, kami membahas start hangat dan start dingin.

Dan peluncuran hangat adalah aplikasi yang aplikasinya sudah ada di memori, baik karena sudah diluncurkan dan ditutup sebelumnya, dan masih tersimpan di diskache di kernel, atau karena Anda baru saja menyalinnya. Sedangkan Warm Boot adalah ketika aplikasi sudah ada di memori karena sudah dijalankan dan keluar sebelumnya, masih ada di disk kernel, atau karena baru disalin.

Peluncuran dingin adalah peluncuran yang tidak ada dalam diskache. Cold boot adalah boot yang tidak ada pada disk.

Dan peluncuran dingin umumnya lebih penting untuk diukur. Emisi dingin seringkali merupakan pengukuran yang lebih penting.

Alasan peluncuran dingin lebih penting untuk diukur adalah saat pengguna Anda meluncurkan aplikasi setelah melakukan boot ulang ponsel, atau untuk pertama kalinya setelah sekian lama, saat itulah Anda benar-benar menginginkannya instan. Alasan yang lebih penting untuk cold start adalah ketika pengguna Anda meluncurkan aplikasi setelah menghidupkan ulang ponsel, atau untuk pertama kalinya setelah sekian lama, Anda benar-benar menginginkannya instan.

Untuk mengukurnya, Anda benar-benar perlu melakukan boot ulang di antara pengukuran. Untuk mengukurnya, Anda perlu melakukan boot ulang di antara pengukuran.

Oleh karena itu, jika Anda berupaya meningkatkan peluncuran hangat, peluncuran dingin Anda juga akan cenderung meningkat. Oleh karena itu, jika Anda meningkatkan start hangat, start dingin juga akan meningkat.

Anda dapat melakukan siklus pengembangan cepat pada peluncuran hangat, tetapi sering kali, uji dengan peluncuran dingin. Anda dapat menjalankan siklus pengembangan cepat pada permulaan yang hangat, tetapi kadang-kadang menggunakan permulaan yang dingin untuk pengujian.

Jadi, bagaimana kita mengukur waktu sebelum waktu utama? Ya, kami memiliki sistem pengukuran bawaan di dyld, Anda dapat mengaksesnya melalui pengaturan variabel lingkungan. Jadi, bagaimana kita mengukur waktu sebelum acara utama? Kami memiliki sistem pengukuran bawaan di dyld, yang dapat Anda akses dengan mengatur variabel lingkungan.

Statistik Cetak DYLD. DYLD mencetak data.

Dan sebenarnya sudah tersedia di OS pengiriman, tetapi ia mencetak banyak informasi debug internal yang tidak terlalu berguna, ada beberapa informasi yang mungkin Anda inginkan yang hilang. Ini sebenarnya sudah tersedia di sistem operasi yang dirilis, tetapi ia mencetak banyak informasi debug internal yang tidak terlalu berguna, dan kehilangan beberapa informasi yang mungkin Anda inginkan.

Dan kami sedang memperbaikinya hari ini. Kami sedang mengatasi masalah ini hari ini.

Jadi ini meningkat secara signifikan pada OS baru. Jadi ini ditingkatkan secara signifikan pada sistem operasi baru.

Ini akan memberikan lebih banyak informasi relevan bagi Anda yang akan memberi Anda cara yang dapat ditindaklanjuti untuk meningkatkan waktu peluncuran Anda. Ini akan memberi Anda informasi yang lebih relevan yang akan memberi Anda cara yang dapat ditindaklanjuti untuk meningkatkan waktu penerbitan Anda.

Dan itu akan tersedia di seed 2. Ini akan tersedia dalam benih 2.

Jadi, satu hal lain yang ingin saya bicarakan dengan hal ini, adalah bahwa debugger harus menjeda peluncuran pada setiap pemuatan dylib untuk mengurai simbol dari aplikasi Anda dan memuat titik istirahat Anda, melalui kabel USB yang bisa sangat memakan waktu. Jadi, hal lain yang ingin saya katakan adalah bahwa debugger harus menjeda startup setiap kali dylib dimuat untuk menyelesaikan simbol dalam aplikasi dan memuat breakpoint melalui kabel USB, yang bisa sangat memakan waktu.

Tapi dyld tahu tentang itu dan itu mengurangi waktu tunggu debugger dari angka yang didaftarkannya. Tapi dyld mengetahui hal ini dan itu mengurangi waktu debugger dari nomor yang terdaftar.

Jadi Anda tidak perlu khawatir, tetapi Anda menyadarinya karena dyld akan memberi Anda angka yang jauh lebih kecil daripada yang Anda amati dengan melihat jam di dinding. Jadi Anda tidak perlu khawatir, tetapi Anda akan menyadarinya karena dyld akan memberi Anda angka yang jauh lebih kecil daripada yang Anda lihat jika Anda melihat jam di dinding.

Itu sudah diharapkan dan dipahami, dan semuanya berjalan dengan baik jika Anda melihatnya, tapi saya hanya ingin mencatatnya. Ini diharapkan dan dapat dimengerti, dan jika Anda melihatnya, semuanya normal, tetapi saya hanya ingin menuliskannya.

Jadi mari kita lanjutkan, untuk mengatur variabel lingkungan di Xcode, Anda cukup pergi ke editor skema, dan menambahkannya seperti ini. Mari kita lanjutkan dan atur variabel lingkungan di Xcode, Anda cukup pergi ke editor skema dan menambahkannya seperti ini.

Setelah Anda melakukannya, Anda akan mendapatkan log konsol baru ke dalam output, output konsol dicatat. Setelah Anda melakukan ini, Anda akan mendapatkan log konsol baru untuk dikeluarkan, log keluaran konsol.

Dan seperti apa bentuknya? Seperti inilah keluarannya, dan kami memiliki bilah waktu di bagian bawah yang mewakili berbagai bagiannya. Seperti apa bentuknya? Seperti inilah keluarannya, dengan bilah waktu di bagian bawah untuk mewakili berbagai bagiannya.

Dan mari kita tambahkan satu hal lagi. Mari tambahkan satu hal lagi.

Mari tambahkan indikator untuk target 400 milidetik tersebut, yang tidak tercapai oleh aplikasi yang sedang saya kerjakan ini. Mari tambahkan indikator untuk target 400 milidetik, yang tidak tercapai dengan aplikasi yang saya gunakan ini.

Jadi, jika Anda perhatikan, ini pada dasarnya adalah langkah-langkah yang dibahas Nick untuk meluncurkan aplikasi, jadi mari kita bahas secara berurutan. Jika dilihat, pada dasarnya inilah langkah-langkah yang Nick bahas tentang peluncuran aplikasi. Mari kita lihat secara berurutan.Jadi pemuatan dylib, hal penting yang perlu dipahami tentang pemuatan dylib dan perlambatan yang akan Anda lihat darinya, adalah bahwa dylib yang tertanam bisa mahal. Jadi pemuatan dylib, masalah penting dalam memahami pemuatan dylib, dan perlambatan yang akan Anda lihat, adalah bahwa dylib yang tertanam bisa mahal.

Jadi Nick mengatakan rata-rata aplikasi bisa memiliki 100 hingga 400 dylib. Nick mengatakan bahwa sebuah aplikasi rata-rata dapat memiliki 100 hingga 400 dylib.

Namun dylib OS cepat karena saat kami membangun OS, kami memiliki cara untuk menghitung terlebih dahulu banyak data tersebut. Namun dylib sistem operasi cepat karena saat kita membangun sistem operasi, kita memiliki cara untuk menghitung data dalam jumlah besar terlebih dahulu.

Namun kami tidak memiliki semua dylib di setiap aplikasi saat kami membangun OS. Namun ketika membangun sebuah sistem operasi, tidak semua aplikasi memiliki dylib di dalamnya.

Kami tidak dapat menghitungnya terlebih dahulu untuk dylib yang Anda sematkan dengan aplikasi Anda, jadi kami harus melalui proses yang jauh lebih lambat saat memuatnya. Kami tidak dapat menghitungnya terlebih dahulu untuk dylib yang tertanam dalam aplikasi, jadi saat memuatnya kami harus melalui proses yang jauh lebih lambat.

Dan solusinya adalah kita hanya perlu menggunakan lebih sedikit dylib dan itu mungkin sulit. Solusi untuk masalah ini adalah kita hanya perlu menggunakan lebih sedikit dylib, yang mungkin bersifat kasar.

Dan saya tidak mengatakan Anda tidak dapat menggunakannya, tetapi ada beberapa opsi di sini Anda dapat menggabungkan dylib yang ada. Saya tidak mengatakan Anda tidak dapat menggunakan apa pun, tetapi berikut adalah dua opsi yang dapat Anda gunakan untuk menggabungkan dylib yang ada.

Anda dapat menggunakan arsip statis dan menautkannya ke keduanya, ke dalam aplikasi dengan cara itu. Anda dapat menggunakan arsip statis dan menautkannya ke kedua aplikasi.

Dan Anda mempunyai opsi untuk melakukan pemuatan lambat, yaitu dengan menggunakan dlopen, namun dlopen menyebabkan beberapa masalah kinerja dan kebenaran yang tidak kentara, dan hal ini sebenarnya mengakibatkan dilakukannya lebih banyak pekerjaan di kemudian hari, namun hal ini ditangguhkan. Anda dapat memilih pemuatan lambat, bahkan menggunakan dlopen, tetapi dlopen menyebabkan beberapa masalah kinerja dan kebenaran yang tidak kentara, ini sebenarnya menyebabkan lebih banyak pekerjaan yang harus diselesaikan nanti, tetapi tertunda.

Jadi, ini adalah pilihan yang layak tetapi Anda harus berpikir panjang dan keras tentang hal itu dan, saya tidak akan menyarankannya jika memungkinkan. Jadi, ini adalah pilihan yang layak, tetapi Anda harus memikirkannya dan saya akan menghalangi Anda jika memungkinkan.

Jadi, saya punya aplikasi di sini yang saat ini memiliki 26 dylib, dan memuatnya membutuhkan waktu 240 milidetik, tetapi jika saya mengubahnya dan menggabungkan dylib tersebut menjadi dua dylib, maka hanya perlu 20 milidetik untuk memuat dylib tersebut. Saya memiliki aplikasi yang saat ini memiliki 26 dylib dan memerlukan waktu 240 md untuk memuatnya, tetapi jika saya mengubahnya dan menggabungkan dylib ini menjadi dua dylib, hanya diperlukan waktu 20 md untuk memuat dylib ini.

Jadi saya masih dapat memiliki dylib, saya masih dapat menggunakannya untuk berbagi fungsionalitas antara aplikasi dan ekstensi saya, tetapi membatasinya akan sangat berguna. Jadi saya masih bisa menggunakan dylib, saya masih bisa menggunakannya untuk berbagi fungsionalitas antara aplikasi dan ekstensi saya, namun membatasinya akan sangat berguna.

Dan saya memahami ini adalah trade-off yang Anda buat antara kenyamanan pengembangan dan waktu peluncuran aplikasi untuk pengguna Anda. Saya memahami ini adalah trade-off yang Anda buat antara kenyamanan pengembangan bagi pengguna Anda dan waktu startup aplikasi.

Karena semakin banyak dylib yang Anda miliki, semakin mudah untuk membangun dan menautkan kembali aplikasi Anda dan semakin cepat siklus pengembangan Anda. Karena semakin banyak dylib, semakin mudah untuk membangun dan menghubungkan kembali aplikasi, dan semakin cepat pula siklus pengembangannya.

Jadi Anda benar-benar bisa dan harus menggunakan beberapa, tapi ada baiknya mencoba menargetkan jumlah yang terbatas, menurut saya, target yang bagus adalah sekitar setengah lusin. Jadi Anda benar-benar dapat dan harus menggunakan beberapa, tetapi lebih baik menargetkan jumlah yang terbatas dan menurut saya, target yang baik adalah sekitar enam.

Jadi sekarang kita sudah memperbaiki jumlah dylib kita, mari beralih ke tempat berikutnya di mana kita mengalami perlambatan. Sekarang kita telah menyelesaikan masalah jumlah dylib, mari beralih ke perlambatan berikutnya.

Antara 350 milidetik dalam pengikatan dan rebasing. 350 milidetik antara pengikatan dan relokasi.

Jadi seperti yang disebutkan Nick, rebasing cenderung lebih lambat karena iO dan pengikatan cenderung mahal secara komputasi tetapi iO sudah dilakukan. Seperti yang disebutkan Nick, rebasing akan lebih lambat karena iO dan biaya komputasi pengikatan akan lebih tinggi tetapi hal ini dilakukan dengan iO.

Jadi iO itu untuk mereka berdua dan mereka datang, waktunya juga datang. Jadi iO diperuntukkan bagi mereka berdua, mereka datang dan waktunya tiba.

Jadi jika kita masuk dan melihatnya, semua itu memperbaiki petunjuk di bagian DATA. Jika kita masuk dan melihatnya, semua ini adalah petunjuk ke bagian data tetap.

Jadi yang harus kita lakukan hanyalah memperbaiki lebih sedikit petunjuk. Jadi yang harus kita lakukan adalah memperbaiki lebih sedikit petunjuk.

Nick menunjukkan kepada Anda alat yang dapat Anda jalankan untuk melihat petunjuk apa yang sedang diperbaiki di bagian DATA, bagian, info dyld. Nick menunjukkan kepada Anda alat yang dapat Anda jalankan untuk melihat petunjuk apa yang diperbaiki di DATA, bagian, info dyld.

Dan ini menunjukkan segmen dan bagian apa yang ada, sehingga akan memberi Anda gambaran bagus tentang apa yang sedang diperbaiki. Ini menunjukkan bagian-bagian dari sesuatu, yang memberi Anda gambaran bagus tentang apa yang sedang dipulihkan.

Misalnya, jika Anda melihat simbol kelas ObjC di bagian ObjC, kemungkinan Anda memiliki banyak kelas ObjC. Misalnya, jika Anda melihat simbol untuk kelas ObjC di bagian ObjC, Anda mungkin memiliki banyak kelas ObjC.

Jadi, salah satu hal yang dapat Anda lakukan adalah mengurangi jumlah objek kelas ObjC dan ivar yang Anda miliki. Satu hal yang dapat Anda lakukan adalah mengurangi jumlah objek kelas ObjC dan ivar yang Anda miliki.

Jadi ada sejumlah gaya pengkodean yang mendorong kelas-kelas yang sangat kecil, yang mungkin hanya memiliki satu atau dua fungsi. Oleh karena itu, ada banyak gaya pengkodean yang mendorong kelas yang sangat kecil, yang mungkin hanya memiliki satu atau dua fungsi.Dan, pola-pola tertentu tersebut dapat menyebabkan perlambatan bertahap pada aplikasi Anda saat Anda menambahkan lebih banyak aplikasi. Dan, saat Anda menambahkan lebih banyak aplikasi, pola spesifik ini dapat menyebabkan aplikasi Anda melambat secara bertahap.

Jadi, Anda harus berhati-hati tentang itu. Jadi, Anda harus berhati-hati dengan ini.

Sekarang memiliki 100 atau 1.000 kelas tidak menjadi masalah, namun kita telah melihat aplikasi dengan 5, 10, 15, 20.000 kelas. Sekarang memiliki 100 atau 1000 kelas tidak menjadi masalah, tapi kita telah melihat aplikasi dengan 5, 10, 15, 20 ribu kelas.

Dan dalam kasus tersebut, hal tersebut dapat menambah hingga 7 atau 800 milidetik pada waktu peluncuran Anda agar kernel dapat memasukkannya. Dalam kasus ini, waktu boot kernel untuk memasukkan halaman tersebut akan meningkat sebesar 7 atau 800 milidetik.

Hal lain yang dapat Anda lakukan adalah mencoba mengurangi penggunaan fungsi virtual C++. Hal lain yang dapat Anda lakukan adalah meminimalkan penggunaan fungsi virtual C++.

Jadi fungsi virtual membuat apa yang kita sebut tabel V, yang sama dengan metadata ObjC dalam arti membuat struktur di bagian DATA yang harus diperbaiki. Jadi fungsi virtual menciptakan apa yang kita sebut tabel-V, yang sama dengan metadata ObjC karena membuat struktur di bagian data yang perlu diperbaiki.

Mereka lebih kecil dari ObjC, lebih kecil dari metadata ObjC tetapi masih signifikan untuk beberapa aplikasi. Mereka lebih kecil dari ObjC dan lebih kecil dari metadata ObjC tetapi mereka masih penting untuk beberapa aplikasi.

Anda dapat menggunakan struct Swift. Struct Swift dapat digunakan.

Jadi Swift cenderung menggunakan lebih sedikit data yang memiliki petunjuk untuk perbaikan semacam ini. Oleh karena itu, Swift cenderung menggunakan lebih sedikit data yang memiliki petunjuk untuk perbaikan tersebut.

Dan, Swift lebih inlinable dan dapat melakukan co-gen dengan lebih baik untuk menghindari hal-hal tersebut, jadi bermigrasi ke Swift adalah cara yang bagus untuk meningkatkan hal ini. Selain itu, Swift lebih mudah untuk disematkan dan bekerja lebih baik bersama-sama untuk menghindari hal ini, jadi beralih ke Swift adalah cara terbaik untuk meningkatkannya.

Dan satu hal lagi, Anda harus berhati-hati dengan kode yang dihasilkan mesin, jadi kami memiliki contoh di mana, Anda dapat mendeskripsikan beberapa struktur dalam istilah DSL atau bahasa khusus dan kemudian memiliki program yang menghasilkan kode lain darinya. Hal lainnya, Anda harus berhati-hati dengan kode yang dihasilkan mesin, jadi kami memiliki contoh di mana Anda menjelaskan beberapa struktur dalam DSL atau bahasa khusus dan kemudian membuat program menghasilkan kode lain darinya.

Dan jika program yang dihasilkan memiliki banyak petunjuk di dalamnya, program tersebut bisa menjadi sangat mahal karena ketika Anda membuat kode, Anda dapat menghasilkan struktur yang sangat, sangat besar. Jika program yang dihasilkan ini memiliki banyak petunjuk di dalamnya, program tersebut bisa menjadi sangat mahal karena ketika Anda membuat kode, Anda dapat menghasilkan struktur yang sangat, sangat besar.

Kami telah melihat kasus di mana hal ini menyebabkan megabita dan megabita data. Kita telah melihat bahwa hal ini dapat menghasilkan megabyte data.

Namun keuntungannya adalah Anda biasanya memiliki banyak kendali karena Anda bisa mengubah pembuat kode untuk menggunakan sesuatu yang bukan pointer, misalnya struktur berbasis offset. Namun keuntungannya adalah Anda biasanya memiliki banyak kendali, karena Anda dapat mengubah pembuat kode untuk menggunakan sesuatu yang bukan penunjuk, seperti struktur berbasis offset.

Dan itu akan menjadi kemenangan besar. Ini akan menjadi kemenangan besar.

Jadi dalam hal ini, mari kita lihat apa yang terjadi pada saya, dengan waktu buka saya. Dalam hal ini, mari kita lihat apa yang terjadi di sini, waktu buka.

Dan saya memiliki setidaknya 10.000 kelas, sebenarnya saya memiliki 20.000 kelas, begitu banyak sehingga tidak terlihat lagi. Saya memiliki setidaknya 10.000 kursus, sebenarnya saya memiliki 20.000 kursus, banyak di antaranya yang muncul begitu saja.

Dan jika saya menguranginya menjadi 1.000 kelas, saya hanya mengurangi waktu peluncuran saya, waktu saya dalam bagian peluncuran ini dari 350 menjadi 20 milidetik. Jika saya menguranginya menjadi 1000 kelas, saya mengurangi waktu startup saya, saya beralih dari 350 md menjadi 20 md untuk bagian ini.

Jadi, sekarang, semuanya kecuali penginisialisasi sebenarnya berada di bawah angka 400 milidetik, jadi kami melakukannya dengan cukup baik. Sekarang, kecuali penginisialisasi, semuanya berada di bawah 400 ms dan kami melakukannya dengan baik.

Jadi untuk pengaturan ObjC, Nick menyebutkan semua yang harus dilakukan. Untuk pembuatan ObjC, Nick menyebutkan semua yang harus dilakukan.

Itu harus melakukan registrasi kelas, harus berurusan dengan ivar yang tidak rapuh, harus melakukan registrasi kategori dan harus melakukan selector uniqing. Ia harus melakukan registrasi kelas, harus menangani ivar yang tidak rapuh, harus melakukan registrasi kelas dan harus melakukan keunikan pemilih.

Dan saya tidak akan menghabiskan banyak waktu untuk hal ini sama sekali, dan alasan saya tidak melakukannya adalah, kami menyelesaikan semua itu dengan memperbaiki rebasing dan data, serta mengikat sebelumnya. Saya tidak akan menghabiskan terlalu banyak waktu untuk hal ini, dan alasan saya tidak akan menghabiskan terlalu banyak waktu untuk hal ini adalah karena kami menyelesaikan semua masalah ini dengan membangun kembali basis dan data, serta pengikatan sebelumnya.

Semua pengurangan di sana akan menjadi hal yang sama yang ingin Anda lakukan di sini. Semua pengurangan di sini sama.

Jadi disini kita hanya mendapatkan sedikit kemenangan gratis saja, kecil saja. Jadi kami mendapat sedikit kemenangan gratis di sini, itu kecil.

Itu 8 milidetik. Ini adalah 8 milidetik.

Tapi kami tidak melakukan sesuatu yang eksplisit untuk itu. Tapi kami tidak melakukan sesuatu yang eksplisit.

Dan sekarang yang terakhir, kita akan melihat inisialisasi saya yang merupakan 10 detik terbesar di sini. Akhirnya, kita sampai pada inisialisasi saya dan itu adalah 10 detik terpenting di sini.

Jadi saya akan membahas hal ini lebih dalam daripada yang dilakukan Nick. Jadi saya akan membahas lebih dalam daripada Nick.

Ada dua jenis inisialisasi, inisialisasi eksplisit, seperti +load. Ada dua jenis inisialisasi, inisialisasi eksplisit seperti +load.

Seperti yang dikatakan Nick, kami menyarankan untuk menggantinya dengan +inisialisasi, yang akan menyebabkan waktu proses ObjC menginisialisasi kode Anda saat kelas-kelas tersebut dibuktikan, bukan saat file dimuat. Seperti yang dikatakan Nick, kami menyarankan untuk menggantinya dengan +inisialisasi, yang akan menyebabkan runtime ObjC menginisialisasi kode saat kelas dikonfirmasi, bukan saat file dimuat.Atau, di C/C++ ada atribut yang bisa dimasukkan ke fungsi yang akan menyebabkannya, menghasilkannya sebagai inisialisasi, jadi itu adalah inisialisasi eksplisit, yang sebaiknya tidak Anda gunakan. Alternatifnya, di C/C++, ada atribut yang bisa Anda pasang pada fungsi yang akan menghasilkan inisialisasi tersebut, yang merupakan inisialisasi eksplisit dan kami harap Anda tidak menggunakannya.

Kami lebih suka Anda menggantinya dengan inisialisasi situs panggilan. Kami lebih suka Anda menggantinya dengan inisialisasi situs panggilan.

Jadi yang saya maksud dengan penginisialisasi situs adalah hal-hal seperti pengiriman sekali. Dengan memanggil penginisialisasi situs, maksud saya seperti mengirimkannya sekali.

Atau jika Anda menggunakan kode lintas platform, pthread sekali. Alternatifnya, jika Anda menggunakan kode lintas platform, gunakan pthread satu kali.

Atau jika Anda menggunakan kode C++, std sekali. Atau jika Anda menggunakan kode c++, std sekali.

Semua fungsi ini pada dasarnya memiliki fungsi yang sama di mana, kode apa pun di salah satu blok ini akan dieksekusi saat pertama kali dipukul dan hanya itu. Semua fungsi ini pada dasarnya memiliki fungsi yang sama, kode apa pun dalam satu blok akan dieksekusi pada pukulan pertama dan hanya itu.

Pengiriman sekali sangat, sangat dioptimalkan di sistem kami. Penjadwalan sekali sangat, sangat dioptimalkan di sistem kami.

Setelah eksekusi pertama, ini pada dasarnya setara dengan tidak ada operasi yang melewatinya, jadi saya sangat menyarankan daripada menggunakan inisialisasi eksplisit. Setelah eksekusi pertama, ini pada dasarnya setara dengan tidak ada operasi yang berjalan di atasnya, jadi saya sangat menyarankan untuk tidak menggunakan inisialisasi eksplisit.

Jadi mari beralih ke inisialisasi implisit. Mari kita lanjutkan pembicaraan tentang inisialisasi implisit.

Jadi inisialisasi implisit adalah apa yang sebagian besar dijelaskan oleh Nick dari global C++ dengan inisialisasi non-sepele, dengan konstruktor non-sepele. Oleh karena itu, inisialisasi aplikasi dijelaskan oleh Nick dalam variabel global c++, yang mencakup inisialisasi non-trivial dan konstruktor non-trivial.

Dan salah satu opsinya adalah Anda dapat menggantinya dengan inisialisasi situs panggilan seperti yang baru saja kami sebutkan. Salah satu opsinya adalah Anda dapat menggantinya dengan inisialisasi situs panggilan yang baru saja kami sebutkan.

Pastinya ada tempat di mana Anda dapat menempatkan global dengan struktur non-global atau penunjuk ke objek yang akan Anda inisialisasi. Tentu saja Anda dapat meletakkan variabel global dengan struktur non-global di suatu tempat, atau pointer ke objek yang akan diinisialisasi.

Pilihan lainnya adalah Anda tidak memiliki inisialisasi non-sepele. Pilihan lainnya adalah Anda tidak memiliki inisialisasi non-sepele.

Jadi di C++ ada inisialisasi yang disebut POD, data lama biasa. Di c++ ada penginisialisasi yang disebut POD, data lama biasa.

Dan jika objek Anda hanyalah data lama, statis, atau tautan statis akan menghitung terlebih dahulu semua data untuk bagian DATA, menatanya seperti data yang terlihat di sana, tidak harus dijalankan, tidak harus diperbaiki. Jika objek Anda hanyalah data lama, statis, atau statis, linker akan menghitung terlebih dahulu semua data di bagian data, seperti data yang Anda lihat di sini, tidak perlu dijalankan, dan tidak perlu diperbaiki.

Terakhir, akan sangat sulit untuk menemukannya, karena bersifat implisit, namun kami memiliki peringatan di kompiler -Wglobal-constructors dan jika Anda melakukannya, Anda akan diberi peringatan setiap kali Anda membuat salah satu dari ini. Terakhir, sulit untuk menemukannya karena bersifat implisit, namun kami memiliki peringatan di compiler-wglobal-constructor yang akan memberi Anda peringatan jika Anda membuat salah satu dari ini.

Jadi ada baiknya untuk menambahkannya ke flag yang digunakan kompiler Anda. Jadi lebih baik menambahkannya ke flag yang digunakan oleh compiler.

Pilihan lainnya adalah menulis ulang di Swift. Pilihan lainnya adalah menulis ulang dengan cepat.

Dan alasannya adalah, Swift memiliki variabel global dan variabel tersebut akan diinisialisasi, dijamin akan diinisialisasi sebelum Anda menggunakannya. Alasannya adalah Swift memiliki variabel global yang diinisialisasi, dan dijamin akan diinisialisasi sebelum Anda menggunakannya.

Namun cara melakukannya, alih-alih menggunakan inisialisasi, ia, di belakang layar, menggunakan pengiriman satu kali untuk Anda. Namun cara penerapannya adalah, di balik layar, alih-alih menggunakan penginisialisasi, ia menggunakan pengiriman untuk Anda.

Ia menggunakan salah satu inisialisasi situs panggilan tersebut. Ini menggunakan salah satu inisialisasi situs panggilan.

Jadi pindah ke Swift akan menyelesaikan masalah ini untuk Anda, jadi saya sangat menganjurkan agar itu menjadi pilihan. Jadi pindah ke Swift akan membantu Anda mengatasi masalah ini, jadi saya sangat menganjurkan Anda untuk melakukannya sebagai opsi.

Terakhir, dalam inisialisasi Anda, mohon jangan panggil dlopen, itu akan menjadi penurunan kinerja yang besar karena berbagai alasan. Terakhir, di penginisialisasi Anda, jangan panggil dlopen, ini akan menjadi pukulan besar bagi kinerja karena berbagai alasan.

Saat dyld berjalan, itu sebelum aplikasi dimulai dan, kita dapat melakukan hal-hal seperti mematikan penguncian, karena kita berulir tunggal. Saat dyld sedang berjalan belum dimulai, kita bisa mematikan kuncinya karena kita single threaded.

Segera setelah dlopens terjadi, dalam situasi tersebut, grafik bagaimana inisialisasi kami harus menjalankan perubahan, kami dapat memiliki banyak thread, kami harus mengaktifkan penguncian, itu hanya akan menjadi kekacauan kinerja yang besar. Setelah dlopen terjadi, dalam kasus ini, bagaimana penginisialisasi menjalankan grafik yang diubah, kita mungkin memiliki banyak utas dan kita harus membuka kuncinya, yang akan menyebabkan kekacauan kinerja yang sangat besar.

Anda juga dapat mengalami kebuntuan halus dan perilaku tidak terdefinisi. Anda juga dapat mengalami kebuntuan halus dan perilaku tidak terdefinisi.

Selain itu, mohon jangan memulai thread di inisialisasi Anda, pada dasarnya karena alasan yang sama. Selain itu, tolong jangan memulai thread di inisialisasi, karena pada dasarnya alasan yang sama.

Anda dapat mengatur teks bisu jika Anda harus dan teks bisu bahkan memiliki, teks bisu pilihan bahkan memiliki, nilai statis yang telah ditentukan sebelumnya yang dapat Anda atur dengan kode tanpa proses itu. Anda dapat menyetel teks senyap jika perlu, teks senyap, dan bahkan ada teks senyap pilihan, nilai statis yang telah ditentukan sebelumnya yang dapat Anda atur tanpa menjalankan kode.Namun sebenarnya memulai thread di penginisialisasi Anda berpotensi menimbulkan masalah kinerja dan kebenaran yang besar. Namun sebenarnya memulai thread di penginisialisasi adalah potensi masalah kinerja dan kebenaran.

Jadi di sini kita memiliki beberapa kode, saya memiliki kelas C++ dengan inisialisasi non-sepele. Di sini kita memiliki beberapa kode, saya memiliki kelas c++ yang memiliki inisialisasi penting.

Saya mengalami masalah dengan koneksi. Ada masalah dengan koneksi saya.

Silakan coba lagi sebentar lagi. Silakan coba lagi nanti.

Terima kasih Siri. Terima kasih, Siri.

Saya sedang mengalami, saya memiliki inisialisasi non-sepele. Saya memiliki inisialisasi non-sepele.

Dan saya rasa saya sudah memasukkannya untuk men-debug semua komentar dan oke, totalnya tinggal 50 milidetik. Saya rasa saya telah men-debug semuanya dan berkomentar dan totalnya hanya 50 ms.

Saya punya banyak waktu untuk menginisialisasi ujung pena saya dan melakukan yang lainnya, kami dalam kondisi sangat baik. Saya punya cukup waktu untuk menginisialisasi ujung pena dan melakukan hal-hal lain dan kami berada dalam kondisi yang cukup baik.

Jadi sekarang kita sudah membahasnya, mari kita bicara tentang apa yang harus kita ketahui jika ini benar-benar panjang dan cukup padat. Sekarang kita sudah membahasnya, mari kita bicara tentang apa yang harus kita ketahui jika yang ini sangat panjang dan padat.

Yang pertama adalah silakan gunakan statistik cetak dyld untuk mengukur waktu Anda, menambahkannya ke rangkaian kinerja atau agresi Anda. Yang pertama adalah silakan gunakan dyld untuk mencetak statistik untuk mengukur waktu Anda, tambahkan ini ke rangkaian kinerja atau serangan Anda.

Jadi Anda dapat melacak bagaimana kinerja aplikasi Anda dari waktu ke waktu, sehingga saat Anda aktif melakukan sesuatu, Anda tidak menemukannya beberapa bulan kemudian dan mengalami kesulitan saat melakukan debug. Jadi Anda dapat melacak kinerja aplikasi Anda dari waktu ke waktu, jadi saat Anda sedang aktif mengerjakan sesuatu, Anda kehilangan jejaknya beberapa bulan kemudian dan sulit untuk melakukan debug.

Anda dapat meningkatkan waktu peluncuran aplikasi dengan mengurangi jumlah dylib yang Anda miliki, mengurangi jumlah kelas ObjC yang Anda miliki, dan menghilangkan inisialisasi statis. Anda dapat meningkatkan waktu startup aplikasi Anda dengan mengurangi jumlah dylib, mengurangi jumlah kelas ObjC, dan menghilangkan inisialisasi statis.

Dan Anda dapat meningkatkannya secara umum dengan menggunakan lebih banyak Swift karena Swift melakukan hal yang benar. Seringkali, Anda dapat meningkatkan kemampuan dengan menggunakan kecepatan yang lebih tinggi karena itu adalah hal yang benar untuk dilakukan.

Terakhir, penggunaan dlopen tidak disarankan, hal ini menyebabkan masalah kinerja halus yang sulit didiagnosis. Terakhir, penggunaan dlopen tidak disarankan dan dapat menyebabkan masalah kinerja halus yang sulit didiagnosis.

Untuk informasi lebih lanjut Anda dapat melihat URL di layar. Lihat URL di layar untuk informasi lebih lanjut.

Ada beberapa sesi terkait di akhir minggu ini dan sekali lagi, ada sesi kinerja aplikasi dari tahun 2012 yang membahas bagian lain peluncuran aplikasi, yang sangat disarankan untuk Anda tonton, jika Anda tertarik. Akan ada beberapa sesi terkait akhir minggu ini, sesi Kinerja Aplikasi 2012 akan mencakup bagian lain dari penerbitan aplikasi dan sangat disarankan jika Anda tertarik.

Terima kasih sudah datang semuanya, semoga minggumu menyenangkan. Terima kasih telah datang dan semoga minggu Anda menyenangkan.