Inflasi perangkat lunak dalam hal sumber daya prosesor - mengapa versi aplikasi yang lebih baru terkadang jauh lebih lambat daripada yang lebih lama?

Pendahuluan


Itu Kamis malam biasa. Saya kembali dari kantor, duduk di depan laptop, menyalakannya, memulai Skype dan mulai terbiasa menunggu sampai akhirnya boot sepenuhnya dan sepenuhnya. Dan kemudian saya tiba-tiba berpikir - mengapa butuh waktu lama untuk memuat, dan bahkan sistem ini jelas sulit untuk menahan proses ini?

Saya memutuskan untuk melihat Manajer Tugas untuk memperkirakan berapa banyak sumber daya yang dikonsumsi Skype di latar belakang. Tapi pertama-tama, sedikit perhitungan pendahuluan. Dan berapa banyak yang harus dikonsumsi sumber daya ini? Saya sedang berbicara tentang latar belakang sekarang. Itu ketika tidak ada koneksi video, saya bahkan tidak berbicara ke mikrofon dengan siapa pun. Semua itu adalah daftar kontak, yang ditampilkan dalam bentuk ikon dan nama, dan menu di mana Anda dapat memilih sesuatu.

Itu ini adalah salah satu bentuk, dari mana Anda dapat meluncurkan menu tambahan. Ada satu daftar di formulir ini. Dan kotak teks untuk memasukkan pesan ke seseorang, beberapa tombol. Sekitar 15 tahun yang lalu, ketika saya menulis dalam Delphi, aplikasi seperti itu (dengan satu bentuk) akan berbobot beberapa ratus kilobyte. Tentu saja, sejak saat itu lingkungan pengembangan mulai mengkonsumsi lebih banyak sumber daya, komponen visual menjadi lebih kaya. Namun, bahkan dengan kemajuan ini, Skype di latar belakang harus memiliki berat sekitar 10 megabyte maksimum. Lagi pula, saya tidak berbicara dengan atau memanggil siapa pun, apa lagi yang bisa saya habiskan begitu banyak di sana?

Anda dapat melihat masalah ini dan, di sisi lain, seperti yang dikatakan ahli matematika, kesetaraan. Tanpa panggilan video dan percakapan mikrofon, Skype memberikan kesempatan untuk melihat lawan bicara mana yang saat ini ada di jaringan, serta mengiriminya pesan teks, dan menerima pesan teks sebagai respons dari seseorang. Itu ini pada dasarnya ICQ - jadi, yah, mungkin di latar belakang, kemungkinan besar, haruskah Skype mengambil sebanyak ICQ dalam memori? Sekarang mari kita periksa praktek perhitungan ini. Kami melihat konsumsi memori di TaskManager:

gambar

Apakah Skype membutuhkan 158 MB memori? Apakah Anda serius mengingat QIP adalah 35 MB? Oke, 35 MB mungkin terlalu banyak, dan ini harus diselesaikan, tetapi catatan saya bukan tentang itu. Kita sekarang tentang Skype. Mengapa dibutuhkan banyak sumber daya - hampir 5 kali lebih banyak dari QIP? Agak terlalu banyak untuk satu formulir dengan daftar kontak, bukan?

Menariknya, masalah ini tidak hanya menjadi perhatian saya, jika Anda masuk ke Google " Mengapa skype menghabiskan begitu banyak memori ", maka hanya akan terjatuh sehelai alas kaki dari berbagai diskusi di forum-forum mengapa versi baru Skype begitu berat. Jawabannya sangat menyenangkan. Misalnya, jawaban nyata di forum komunitas Skype (saya kutip terjemahan gratis jawabannya):

, ? 4-8 . 140 , .


Ya, ya Tentu saja. Jika demikian semua pengembang perangkat lunak akan beralasan, maka dengan cara itu " tidak ada volume tidak cukup ." Pertanyaannya bukan saya minta maaf untuk memori Skype (dan saya juga minta maaf). Pertanyaannya adalah, fungsionalitas apa yang begitu baru ditambahkan dalam versi baru Skype (dibandingkan dengan yang lama), sehingga mereka membutuhkan begitu banyak memori?

Tapi tidak apa-apa, saya lebih tertarik pada pertanyaan lain - prosesor dengan latar belakang Skype juga tidak benar-benar santai dan secara berkala menunjukkan muatan penuh. Muncul pertanyaan, “Mengapa dan bagaimana cara menyingkirkan ini?”. Bahkan, pertanyaannya seharusnya terdengar seperti ini - bagaimana pengembang mengatur untuk membuat aplikasi besar seperti itu? Dan apa hubungannya dengan itu?

Sedikit sejarah


Tentu saja, setiap pengunjung ke situs ini mungkin setidaknya pernah mendengar tentang hukum Moore tentang peningkatan kinerja sistem. Artikel Makan siang gratis sudah selesai memberikan gambaran yang aneh:

gambar

Seperti yang Anda lihat, di suatu tempat pada tahun 2004, prosesor mencapai batas tertinggi dalam hal frekuensi clock. Dan 10 tahun terakhir, frekuensi ini tidak terlalu meningkat. Apakah karena ini hukum Moore tidak lagi dipenuhi? Sebenarnya, tidak, dan artikelnya dengan jelas dan jelas menjelaskan alasannya. Sederhananya, kinerja komputer kita sekarang tumbuh karena faktor-faktor lain (cache dan multicore). Namun, tangkapannya adalah bahwa aplikasi single-threaded yang normal tidak akan dapat mempercepat faktor-faktor ini. Dan inilah masalahnya. Faktanya adalah bahwa banyak produsen perangkat lunak saat ini berperilaku seolah-olah halaman masih tahun 80-an atau 90-an, dan mengoptimalkan perangkat lunak dalam hal mengurangi jumlah siklus jam tidak menimbulkan masalah tertentu - Anda hanya bisa menunggu sedikit dan prosesor akan lebih cepat.

Ini benar tidak hanya untuk Microsoft, tetapi saya akan fokus pada contoh spesifik untuk itu. Joel Spolsky dalam artikelnya menyebutkan bahwa Microsoft berhasil menang atas Lotus di tahun 80-an dalam pertempuran antara Excel dan 123 karena fakta bahwa manajer Lotus membuat satu kesalahan kritis - mereka mencoba untuk mengoptimalkan aplikasi. Secara khusus, mereka mencoba mengecilkan aplikasi sehingga selalu dijamin sesuai dengan 640 KB RAM. Mereka membunuhnya selama satu setengah tahun, dan selama waktu ini Redmond merebut pasar menggunakan Excel, karena pada saat itu komputer dengan jumlah RAM yang jauh lebih besar sedang beroperasi. Solusi ini sangat merugikan Lotus.

Namun, inilah yang menarik - akhir-akhir ini, strategi semacam itu mungkin bisa menjadi kemenangan - karena sumber daya sistem desktop standar tidak lagi tumbuh dengan kecepatan yang luar biasa seperti 20-30 tahun yang lalu. Masalahnya adalah sebagai akibat dari persaingan sengit periode itu, perusahaan yang mengembangkan fungsionalitas aplikasi adalah pemenang, sementara mengabaikan kinerja dan optimisasi. Perusahaan-perusahaan inilah yang telah membentuk ideologi pengembangan ini, yang buahnya masih kita tuai.

Inflasi


Apa yang menyebabkan ini? Untuk fenomena yang sangat aneh. Saya tidak akan pernah menyerah pada peningkatan perangkat keras, tetapi tiba-tiba saya mulai menghindari peningkatan perangkat lunak yang tidak perlu, karena kemungkinan inflasi . Dengan istilah ini, maksud saya bahwa set fungsional yang sama yang saya miliki di versi lama, di yang baru, saya mendapatkan harga yang bagus dalam hal sumber daya prosesor dan RAM.

Ada idiom tetap dalam bahasa Inggris, yang dalam bahasa Rusia terdengar seperti "berusaha memperbaiki sesuatu yang belum rusak." Situasi dengan perangkat lunak selama 10 tahun terakhir sangat mengingatkan pada idiom ini. Skype adalah salah satu contoh utama dari ini. Dilihat oleh forum, masalah memori ini tidak ada di versi Skype yang lebih lama, misalnya, dalam versi 3.x. Apa yang telah diperbaiki dalam produk sejak itu sehingga menjadi begitu mahal dalam hal RAM?

Hal yang sama, omong-omong, berlaku untuk berbagai aplikasi obrolan. Sekitar 15 tahun yang lalu, obrolan, yang pada saat itu memakan 30 MB RAM, tampak seperti omong kosong. Namun, sekarang ini sudah menjadi norma, meskipun apa yang disediakan ruang obrolan saat ini dengan kami, yang tidak disediakan pada saat itu?

Jangan lupa Microsoft Office. Menurut pendapat saya, versi untuk XP memuaskan semua orang. Tentu saja, seperti produk apa pun, ia memiliki kekurangan. Tetapi apakah mereka begitu kritis sehingga mereka perlu merilis versi 2007, 2010, dll? Saya membuat dokumen yang sama di dalamnya, tetapi sekarang saya harus menunggu lebih lama sampai sistem ini boot.

Dalam pembenaran, kami mendengar bahwa versi baru berisi fitur baru. Ya, saya tidak menyangkalnya, tetapi tidakkah aneh bahwa dalam melakukan hal itu peluang lama memerlukan lebih banyak sumber daya?

Modularitas dan Optimasi


Tetap saja, mengapa lebih banyak sumber daya? Di sini semuanya dijelaskan oleh fakta bahwa sebagian besar aplikasi agak monolitik. Tidak, dalam hal mengatur kode, mereka mungkin dipecah menjadi modul dengan pembagian tanggung jawab yang benar. Namun, saya menyebutnya monolitik dalam arti bahwa ketika memuat aplikasi, semua modulnya biasanya dimuat segera, meskipun ini sering tidak diperlukan.

Kami akan kembali lagi ke Skype. Sekarang jelas dibuat sehingga dengan login sederhana, banyak modul yang segera dimuat ke dalam RAM, yang secara langsung bertanggung jawab untuk suara, video, dll. Ini terlepas dari kenyataan bahwa input biasa hanya memerlukan daftar pengguna dan kemampuan untuk bertukar teks. Sistem ini dapat dilakukan secara berbeda, hanya memuat yang paling diperlukan. Dan hanya ketika pengguna ingin benar-benar memulai pertukaran video, yang lainnya dimuat.

Optimasi juga penting, karena fakta bahwa pengembang secara fisik tidak dapat mengembangkan semua kode dari awal, tetapi dipaksa untuk menggunakan perpustakaan yang ada yang ditulis tanpa banyak tekanan pada optimasi.

Bayangkan bahwa pengembang setiap perpustakaan membuat perpustakaannya 5% lebih lambat dari yang seharusnya jika dia menghabiskan upaya tambahan untuk optimasi. Biarkan pustaka 1 dalam pekerjaannya menggunakan pustaka 2, dan pustaka 3 itu, dan pustaka itu 4. Dalam hal ini, rantai 15 pustaka dalam hal akumulasi keterlambatan mendapatkan hasil 1,05 ^ 15 = 2,07, mis. dalam kasus terburuk, aplikasi akan berjalan dua kali lebih lambat dari komponen mana pun.

Saya sangat mengenal ungkapan bahwa optimasi prematur adalah akar dari semua kejahatan. Namun, ini adalah optimasi prematur, bukan optimasi sama sekali. Slogan ini luar biasa pada saat prosesor semakin cepat dan lebih cepat di depan mata kita. Setelah mencapai langit-langit, slogan ini mulai berbalik ke samping, ketika versi aplikasi yang lama, yang ditulis sekitar 15 tahun yang lalu, tiba-tiba mulai terlihat lebih disukai daripada versi yang dirilis minggu lalu. Ngomong-ngomong, orang tidak dapat gagal untuk mencatat fakta bahwa seringkali produsen perangkat lunak mencoba memaksa pengguna untuk memperbarui perangkat lunak, justru karena tidak ada motif khusus untuk keuntungan bagi konsumen dalam kasus ini.

Contoh alternatif


Pada prinsipnya, industri perangkat lunak mengharapkan hal yang sama dengan industri otomotif setelah krisis minyak tahun 70-an, ketika menjadi jelas bahwa bensin menjadi sumber daya yang sangat mahal. Sejak itu, perusahaan mobil telah mampu mengurangi konsumsi mesin sekitar sepertiga, jika saya tidak salah.

Di dunia peranti lunak, ada juga contohnya. Pada suatu waktu, saya sangat menyukai Erlang, yang didasarkan pada konsep banyak proses ringan independen yang hanya disatukan oleh pesan umum (ini memungkinkan Anda memanfaatkan multicore secara maksimal). Selain itu, ada prinsip dalam lingkungan ini yang secara eksplisit dipinjam dari penterjemah LISP - bahwa setiap modul dan fungsi dapat dimuat dan dimuat ulang saat bepergian jika perlu (dan hal yang sama berlaku untuk proses apa pun).

Sebagai perbandingan, pada Glassfish, jika Anda mengubah satu dari beberapa ratus atau ribuan kelas, Anda perlu menginstal ulang seluruh modul (war / ear / jar). Hot swapping fungsi atau kelas saat bepergian ada di sana, tetapi ini diterapkan dengan sangat buruk dibandingkan dengan Erlang.

Masa depan industri terletak pada aplikasi yang dapat sepenuhnya memanfaatkan teknologi multi-core dan tidak akan segera mengunduh semua modul yang mungkin untuk semua fitur yang ada dalam produk ini. Itu program ini akan dapat memuat dalam konfigurasi dasar dan mengkonsumsi sumber daya sebanyak pendahulunya dikonsumsi 15 tahun yang lalu, dan jika perlu, unduh semua yang dibutuhkan pengguna saat bepergian.

All Articles