Mengapa Adakah Bar Kemajuan Jadi Tidak tepat?
Pada pemikiran pertama, nampaknya menjana anggaran masa tepat haruslah agak mudah. Lagipun, algoritma yang menghasilkan bar kemajuan tahu semua tugas yang perlu dilakukan sebelum masa ... betul?
Untuk sebahagian besar, memang benar bahawa algoritma sumber tahu apa yang perlu dilakukan terlebih dahulu. Walau bagaimanapun, penempaan masa yang diperlukan untuk melaksanakan setiap langkah adalah sangat sukar, jika tidak hampir mustahil, tugas.
Semua Tugas Tidak Diciptakan Sama
Cara paling mudah untuk melaksanakan bar kemajuan adalah dengan menggunakan perwakilan grafik kaunter tugas. Di mana peratus selesai hanya dihitung sebagai Tugas Selesai / Jumlah Tugas. Walaupun ini membuat rasa logik pada pemikiran pertama, adalah penting untuk mengingati bahawa (jelas) beberapa tugas mengambil masa yang lebih lama untuk diselesaikan.
Pertimbangkan tugas-tugas berikut yang dilakukan oleh pemasang:
- Buat struktur folder.
- Turunkan kompres dan menyalin fail bernilai 1 GB.
- Buat entri pendaftaran.
- Buat entri menu permulaan.
Dalam contoh ini, langkah 1, 3, dan 4 akan selesai dengan cepat manakala langkah 2 akan mengambil sedikit masa. Jadi bar kemajuan yang bekerja pada kiraan mudah akan melompat ke 25% sangat cepat, gerai untuk sedikit sementara langkah 2 berfungsi, dan kemudian melompat ke 100% hampir serta-merta.
Pelaksanaan jenis ini sebenarnya agak biasa di kalangan bar kemajuan kerana, seperti yang dinyatakan di atas, mudah dilaksanakan. Walau bagaimanapun, seperti yang anda lihat, ia adalah tertakluk kepada tugas-tugas yang tidak seimbang yang merosakkan sebenarnya peratusan kemajuan kerana ia berkaitan dengan baki masa.
Untuk mengatasi masalah ini, sesetengah bar kemajuan mungkin menggunakan pelaksanaan di mana langkah-langkah dibimbangkan. Pertimbangkan langkah-langkah di atas di mana berat relatif diberikan kepada setiap langkah:
- Buat struktur folder. [Berat = 1]
- Turunkan kompres dan menyalin fail bernilai 1 GB. [Berat = 7]
- Buat entri pendaftaran. [Berat = 1]
- Buat entri menu permulaan. [Berat = 1]
Dengan menggunakan kaedah ini, bar kemajuan akan bergerak dalam kenaikan 10% (kerana jumlah berat adalah 10) dengan langkah 1, 3, dan 4 menggerakkan bar 10% setelah selesai dan langkah 2 menggerakkannya 70%. Walaupun sudah tentu tidak sempurna, kaedah seperti ini adalah cara mudah untuk menambahkan sedikit ketepatan kepada peratusan bar kemajuan.
Hasil Akhir Jangan Jaminan Prestasi Masa Depan
Pertimbangkan contoh mudah saya meminta anda mengira hingga 50 ketika saya menggunakan jam randik kepada masa anda. Katakan anda mengira hingga 25 dalam 10 saat. Adalah munasabah untuk mengandaikan anda akan mengira nombor yang tinggal dalam tambahan 10 saat, sehingga pengesanan bar perkembangan ini akan menunjukkan 50% lengkap dengan 10 saat lagi.
Sebaik sahaja kiraan anda mencapai 25, bagaimanapun, saya mula membuang bola tenis pada anda. Mungkin ini akan memecahkan irama anda kerana kepekatan anda telah bergerak dari menghitung angka yang ketat untuk menghindari bola yang dilemparkan dengan cara anda. Dengan andaian anda dapat terus mengira, kadar anda sudah pasti perlahan. Jadi sekarang bar kemajuan masih bergerak, tetapi pada kadar yang lebih perlahan dengan anggaran masa yang tinggal sama ada pada keadaan terhenti atau sebenarnya memanjat yang lebih tinggi.
Untuk contoh yang lebih praktikal, pertimbangkan muat turun fail. Pada masa ini anda memuat turun fail 100 MB pada kadar 1 MB / s. Ini sangat mudah untuk menentukan anggaran masa siap. Tetapi 75% jalan di sana, beberapa kesesakan rangkaian mencecah dan kadar muat turun anda turun kepada 500 KB / s.
Bergantung kepada bagaimana pelayar mengira masa yang tinggal, ETA anda boleh dengan serta-merta pergi dari 25 saat hingga 50 saat (menggunakan keadaan sekarang sahaja: Saiz Reman / Kelajuan Muat turun) atau, kemungkinan besar, pelayar menggunakan algoritma purata rolling yang akan menyesuaikan untuk turun naik dalam kelajuan pemindahan tanpa memaparkan melompat dramatik kepada pengguna.
Contoh algoritma rolling berkaitan dengan memuat turun fail mungkin berfungsi seperti ini:
- Kelajuan pemindahan untuk 60 saat sebelumnya diingat dengan nilai terbaru menggantikan yang tertua (mis. Nilai ke-61 menggantikan yang pertama).
- Kadar pemindahan berkesan untuk tujuan perhitungan adalah purata pengukuran ini.
- Baki masa dikira sebagai: Saiz Kekal / Kelajuan Muat turun Berkesan
Oleh itu, menggunakan senario kami di atas (demi kesederhanaan, kita akan menggunakan 1 MB = 1,000 KB):
- Pada 75 saat ke muat turun, 60 nilai yang kami kenal akan menjadi 1,000 KB. Kadar pemindahan berkesan ialah 1,000 KB (60,000 KB / 60) yang menghasilkan masa yang tinggal 25 saat (25,000 KB / 1,000 KB).
- Pada 76 saat (di mana kelajuan pemindahan jatuh ke 500 KB), kelajuan muat turun yang berkesan menjadi ~ 992 KB (59,500 KB / 60) yang menghasilkan masa selama 24.7 saat (24,500 KB / 992 KB).
- Pada 77 saat: Kelajuan berkesan = ~ 983 KB (59,000 KB / 60) memberi masa selebihnya ~ 24.4 saat (24,000 KB / 983 KB).
- Pada 78 saat: Kelajuan berkesan = 975 KB (58,500 KB / 60) memberi masa selebihnya ~ 24.1 saat (23,500 KB / 975 KB).
Anda boleh melihat corak yang muncul di sini kerana penurunan dalam kelajuan muat turun perlahan-lahan dimasukkan ke dalam purata yang digunakan untuk menganggarkan masa yang tinggal. Di bawah kaedah ini, jika kedalaman hanya berlangsung selama 10 saat dan kemudian dikembalikan kepada 1 MB / s pengguna tidak dapat melihat perbezaan (simpan untuk gerai yang sangat kecil dalam undur masa anggaran).
Mendapat ke tacks tembaga - ini hanya metodologi untuk menyampaikan maklumat kepada pengguna akhir untuk sebab sebenar ...
Anda Tidak Dapat Tentukan dengan tepat Sesuatu yang Nondeterministic
Akhirnya, ketidaktepatan bar perkembangan berakar kepada kenyataan bahawa ia sedang berusaha untuk menentukan masa untuk sesuatu yang tidak bersifat nondeterministik. Kerana komputer memproses tugas baik pada permintaan dan di latar belakang, hampir tidak mungkin untuk mengetahui sumber sistem apa pun akan tersedia pada bila-bila masa - dan ketersediaan sumber sistem yang diperlukan untuk tugas apa pun untuk menyelesaikannya.
Menggunakan contoh lain, katakan anda menjalankan peningkatan program pada pelayan yang melakukan pembaruan pangkalan data yang cukup intensif. Semasa proses kemas kini ini, pengguna kemudian menghantar permintaan yang diminta kepada pangkalan data lain yang dijalankan pada sistem ini. Sekarang sumber-sumber pelayan, khusus untuk pangkalan data, perlu memproses permintaan untuk kedua-dua peningkatan anda serta pertanyaan yang dimulakan oleh pengguna - senario yang pasti akan merugikan waktu pelaksanaan. Secara bergantian, pengguna boleh memulakan permintaan pemindahan fail yang besar yang akan mengecilkan storan penyimpanan yang akan merosot dari prestasi juga. Atau tugas yang dijadualkan dapat dijalankan yang melakukan proses intensif ingatan. Anda mendapat idea itu.
Sebagai, mungkin, contoh yang lebih realistik untuk pengguna setiap hari - pertimbangkan untuk menjalankan Windows Update atau imbasan virus. Kedua-dua operasi ini melaksanakan operasi intensif sumber di latar belakang. Akibatnya, kemajuan setiap membuat bergantung pada apa yang dilakukan oleh pengguna pada masa itu. Jika anda membaca e-mel anda semasa ini berjalan, kemungkinan permintaan terhadap sumber sistem akan menjadi rendah dan bar kemajuan akan bergerak secara konsisten. Sebaliknya, jika anda melakukan penyuntingan grafik maka permintaan anda terhadap sumber sistem akan menjadi lebih besar yang akan menyebabkan pergerakan bar perkembangan menjadi skizofrenik.
Secara keseluruhannya, tidak ada bola kristal. Bahkan sistem itu sendiri tidak tahu apakah bebannya akan di bawah pada setiap titik di masa depan.
Akhirnya, Ia Tidak Benar
Tujuan bar kemajuan adalah, dengan baik, menunjukkan bahawa kemajuan sedang dibuat dan proses masing-masing tidak digantung. Ia bagus apabila penunjuk kemajuan adalah tepat, tetapi biasanya ia hanya gangguan kecil apabila tidak. Untuk sebahagian besar, pemaju tidak akan menumpukan banyak masa dan usaha ke dalam algoritma bar progres kerana, terus terang, ada tugas yang lebih penting untuk menghabiskan waktu di.
Sudah tentu, anda mempunyai hak untuk diganggu apabila bar kemajuan melompat hingga 99% lengkap serta kemudian membuat anda menunggu 5 minit untuk satu peratus lagi. Tetapi jika program masing-masing berfungsi dengan baik, hanya ingatkan diri anda bahawa pemaju mempunyai keutamaan mereka secara lurus.