Aplikasi modern memiliki banyak persyaratan non-fungsional: ukuran aplikasi, lalu lintas yang dikonsumsi, aksesibilitas untuk penyandang cacat, stabilitas, startup dan kecepatan operasi. Aplikasi kami mulai untuk waktu yang sangat lama, puluhan detik. Hari ini pembaruan dirilis di mana aplikasi iOS mulai berjalan berkali-kali lebih cepat. Saya memberi tahu Anda bagaimana itu terjadi dan mengapa baru sekarang.

Itu dimulai untuk waktu yang lama
Aplikasi ini memiliki banyak kode, banyak kelas dan mereka entah bagaimana terhubung. Untuk mengelola hubungan ini, kami menggunakan
Dip (baca: Swinject atau kerangka kerja DI lainnya tanpa pembuatan kode).
Ini bekerja seperti ini: pada awal aplikasi, semua dependensi dijejalkan ke dalam "wadah", dan kemudian kelas yang diinginkan diekstraksi darinya dengan semua dependensi diletakkan. Dibutuhkan waktu untuk memulai, dibutuhkan waktu untuk membuka layar apa pun.
Tapi gambar-gambarnya indah
Untuk waktu yang lama, itu bahkan tidak membuat kami takut: kami hanya menggambar screensaver cantik dengan pizza baru dan tidak mengukus. Screensaver pizza harus dihapus ketika kami mulai di beberapa negara, karena bermacam-macam berbeda di mana-mana. Gambarannya menjadi tidak begitu menarik, menunggu peluncurannya menjadi lebih membosankan, tetapi kami melewatkan poin ini.
Ini adalah percikan kami. Cantik, tetapi menyembunyikan masalah yang bahkan tidak kami coba pecahkan.

Setelah rilis berikutnya, kami mulai memperlambat pergantian kartu di halaman controller. Profiler waktu menunjukkan bahwa ketergantungan dihapus untuk waktu yang lama ketika layar baru muncul. Kenapa begitu Tidak mungkin dimengerti. Dip sangat sulit untuk di-debug karena panggilan abstrak yang sama. Kami mencoba memecah satu wadah umum menjadi banyak wadah kecil, tetapi hanya memburuk. Akibatnya, kami mematikan kartu membalik dan melanjutkan pembaruan Tahun Baru.
Ini adalah bagaimana Dip terlihat di profiler. Di akhir daftar adalah batas tumpukan panggilan tercapai. Tidak mungkin untuk melakukan sesuatu yang masuk akal dengan ini.

Terbang ke 4S? Perbaiki nanti
Pada saat ini, bug "tidak memulai rilis build on 4S" tergeletak di tumpukan, meskipun yang debug diluncurkan. Tidak ada yang memperhatikan koneksi masalah, menaikkan versi minimum iOS menjadi 10 dan juga menunda perubahan. Ada beberapa pengguna di 4S, kan?
Kami melihat Dip: bukan pada awalnya, tetapi pada kompilasi
Namun, menjadi jelas bahwa Dip perlu dipotong. Dan apa yang harus diubah? Sangat tepat waktu, kami menemukan
Injeksi Ketergantungan dalam artikel
Swift .
Ini hanya bekerja: kita menulis banyak fungsi
resolve()
dengan tipe yang berbeda (kompiler akan mengetahuinya). Jadi komunikasi akan berhenti dihitung di awal, dan kompiler bahkan akan dapat mengoptimalkan kode. Ini juga berguna untuk pengembangan: jika Anda menggambarkan dependensi secara tidak benar, Anda akan mengetahuinya saat startup, dan bukan ketika Anda membuka layar. Tentu saja, ada masalah: jika fungsi
resolve()
tidak memahami tipe, maka akan menghasilkan kesalahan yang tidak berguna dengan seratus kandidat:

Kami melakukan ini kembali pada bulan November. Ada perubahan SANGAT BANYAK, dan pada saat itu kami meluncurkan produk Combo baru dan bersiap untuk perubahan terbaru sebelum Tahun Baru. Kode baru muncul di proyek sebelum Tahun Baru, tetapi kami tidak merilisnya sampai Januari karena pembekuan kode liburan. Untuk ini, selama tiga minggu, kami menggunakan program dalam mode uji, menemukan masalah dan memperbaikinya.
Ini adalah bagaimana kode ketergantungan terlihat sekarang. Kotor tapi berhasil. 450 tempat dengan registrasi dan 1400 tempat dengan ekstraksi.

Secara fungsional, kodenya sama, hanya saja cara kerjanya berbeda. Perbedaan kecepatan terlihat pada semua model. Di XS - dua kali lebih cepat, dan di SE lihat sendiri:
Jadi kami mempercepat tidak hanya start, tetapi juga pembukaan layar. Sebelum perubahan, setiap layar hanya membutuhkan 0,3β1 detik pada ketergantungan.
Tahun Baru tanpa pizza
Pada bulan Desember, mereka mulai menulis kepada kami bahwa aplikasi macet saat startup, tidak dimulai, dan setelah restart, instal ulang tidak membantu. Sebelumnya, hanya ada satu alasan untuk ini - migrasi basis data, tetapi kami menyingkirkannya, dan kami tidak melihat keberangkatan baru di Crashlytics. Apa yang salah?

Hipotesis: iOS ini menghapus aplikasi jika berjalan untuk waktu yang lama. Versi ini dikonfirmasi oleh fakta bahwa semua ulasan berasal dari perangkat lama: 5, 5S, 6. Jumlah ulasan tersebut meningkat secara signifikan, karena pizza adalah hari libur, orang sering memesannya untuk Tahun Baru. Tim khawatir, produk khawatir, tetapi kami meluncurkan versi baru pada bulan Januari.
Kami beruntung solusinya ditulis dan hanya bisa diuji. Dalam skenario lain, berbulan-bulan bisa dihabiskan untuk mencari penyebab dan memperbaikinya.
Terkadang sulit untuk menyampaikan pentingnya tugas teknis untuk bisnis: tidak ada metrik, pentingnya tidak jelas, bahayanya tidak diprediksi. Bisnis dapat menyelesaikan masalah dengan berbagai cara: ini adalah cara kami melukis gambar yang indah, bukan mempercepat aplikasi. Tetapi kinerja penting bagi setiap pengguna. Ini sangat mempengaruhi:
- Menunggu Jika aplikasi dimulai untuk waktu yang lama, berapa lama mereka akan makan pizza?
- Kesenangan menggunakan. Kenapa bodoh di setiap layar?
- Dan bahkan untuk stabilitas. βAplikasi tidak berjalan !!! Pengembang, apakah Anda menguji di sana sama sekali? β(C).
Dan memotong Dip, Swinject dan kerangka kerja lain yang bekerja dengan kontainer secara real time jika Anda memiliki proyek besar dan banyak dependensi.
Agar tidak ketinggalan artikel berikutnya, berlangganan saluran Dodo Pizza Mobile.