Menampilkan bilah kemajuan menghasilkan waktu penyelesaian yang lebih lambat

Aug 20 2020

Saya menulis banyak skrip internal yang mengotomatiskan tugas untuk sebuah tim. Untuk mencegah mereka bertanya-tanya apakah skrip telah "dihentikan", saya menampilkan bilah kemajuan sederhana untuk tugas yang berjalan lama. Saya melakukan ini karena saya dapat mengukur jumlah yang diselesaikan karena saya tahu jumlah yang harus diselesaikan sebelum menjalankan. Untuk menghemat jumlah operasi yang sedang dilakukan, saya hanya memperbarui bilah kemajuan setiap ndetik atau saat tugas diluncurkan / selesai.

Apa yang saya temukan adalah ada pertukaran antara:

  • pengalaman pengguna (mengetahui tugas sedang berjalan)
  • waktu penyelesaian keseluruhan naskah

Dengan menambahkan langkah-langkah untuk membuat bilah kemajuan dan membuatnya tetap sadar, tugas bisa memakan waktu 2x lebih lama.

Secara umum, apakah ini tradeoff yang diharapkan (mungkin tidak dalam bahasa lain, tetapi dengan Python)?

Jawaban

1 MikeMark Aug 20 2020 at 02:55

Itu pertanyaan yang sangat bagus.

Secara umum, kami selalu mengutamakan pengalaman pengguna.

Contoh: Mesin telusur penerbangan dapat memberikan hasil secara instan tetapi pemuatannya lebih lama karena pengguna merasa lebih aman karena telah melakukan penelusuran menyeluruh.

Kalau sampai 2x lebih lambat. 2x mungkin baik-baik saja jika hanya beberapa detik dan mungkin buruk jika selama bertahun-tahun. Itu semua tergantung pada konteks pengguna Anda. Jika jenis pekerjaan di situs Anda adalah masalah hidup atau mati maka lebih cepat lebih baik, jika pengguna Anda lebih santai dengan waktu yang dibutuhkan dan lebih penting bagi mereka untuk mengetahui kapan harus memeriksa kembali kemudian memberi tahu mereka waktu yang diharapkan. pilihan terbaik.

Percepat saat

  • Waktu pemuatan terbukti berdampak negatif pada adopsi, penggunaan, keandalan, kepercayaan, dll.
  • Kecepatan adalah masalah hidup atau mati
  • Kecepatan adalah masalah menghasilkan uang (misalnya klien di telepon membutuhkan jawaban segera)

Tampilkan bilah pemuatan jika

  • Mengalikan waktu dengan dua tidak menciptakan waktu yang akan membuat pengguna benar-benar bingung
  • Anda, para pengguna, dapat menunggu sementara mungkin melakukan sesuatu yang lain

Lebih banyak hal untuk dipertimbangkan Mungkin Anda memerlukan solusi hybrid yang untuk beberapa proses Anda mendapatkan bilah pemuatan dan untuk beberapa, Anda tidak.

Mungkin Anda memerlukan opsi alternatif: misalnya menampilkan bilah pemuatan dan memberi tahu pengguna bahwa dengan menyembunyikannya mereka dapat mempercepat tugas, menanyakan pengguna apakah mereka ingin menerima pemberitahuan email saat tugas siap, dll.

Bagaimanapun, ide terbaik adalah melihat apa yang lebih disukai pengguna sesuai dengan konteks dan kebutuhan mereka.

Semoga berhasil, ini adalah tantangan yang sangat menarik. Posting kembali keputusan apa yang Anda pilih pada akhirnya. :)

1 Ángel Sep 19 2020 at 09:12

Sepele, program apa pun yang melakukan tindakan plus menampilkan bilah kemajuan (jadi dua tindakan) akan menggunakan lebih banyak cpu daripada satu yang hanya melakukan satu tindakan.

Namun, ini tidak berarti itu harus lebih lambat dalam waktu jam dinding. Faktanya, pelambatan 2x imho tampaknya berlebihan.

Beberapa strategi meliputi:

  • Tidak menampilkan bilah kemajuan (whis sebenarnya adalah default untuk sebagian besar perintah Unix, di mana Anda perlu menambahkan opsi verbose)
  • Menyediakan opsi senyap untuk menonaktifkan bilah kemajuan. Ini sebenarnya harus disediakan untuk UI (mis. Misalkan pengguna akan menjalankannya dari cron, atau mengarahkan output ke file), tetapi akan memiliki efek samping melewati pelambatan progressbar.
  • Menampilkan kemajuan melalui utas yang berbeda. Mungkin rumit untuk dilakukan dengan python, tetapi normal dengan bahasa lain. Anda memiliki utas GUI yang menunjukkan beberapa kemajuan, dan seorang pekerja yang melakukan pekerjaan sebenarnya.
  • Mengurangi interval pembaruan bilah kemajuan / ukuran langkah.
    • Jika Anda menyalin file byte-by-byte (demi argumen, ini jelas tidak efisien), daripada menggambar ulang progress bar setiap byte, Anda mungkin ingin memperbaruinya hanya setelah setiap MB disalin.
    • Atau dengan waktu yang dihabiskan, seperti menyetel pengatur waktu yang akan memperbarui status setiap X detik (sekali lagi, sebaiknya asinkron dengan tindakan utama, atau pada utas yang berbeda).
  • Dengan membuat bilah kemajuan semurah mungkin. Ini dapat berubah dari hanya titik keluaran daripada bilah kemajuan lengkap menjadi bilah kemajuan "digambar", dan menghindari menghitungnya lagi pada setiap langkah (Anda harus melakukan pemrosesan penuh pada SIGWINCH, meskipun)

Secara umum, apakah ini trade-off yang diharapkan

Secara umum, saya pikir itu tergantung apakah mungkin untuk menghindarinya atau tidak. Jika kami mengunduh satu file besar dari internet, Anda hampir selalu dapat memasukkan bilah kemajuan yang tepat, karena unduhan akan menggunakan sumber daya yang berbeda. Jika Anda ingin menyalin file dari sistem file yang jauh dan lambat (seperti smartphone), menjelajahi semua pohon direktori yang harus disalin sehingga bilah kemajuan yang ditampilkan mungkin membutuhkan sumber daya (bandwidth koneksi). dengan telepon) yang dapat dilewati jika file ditemukan dan disalin "seperti yang muncul".