Apa pengalaman pengguna yang lebih baik: Menunggu satu kali pada saat startup untuk waktu yang lama atau sering menunggu untuk waktu yang singkat? [Tutup]

8

Saat ini saya merancang aplikasi yang melibatkan banyak perhitungan. Sekarang saya secara umum memiliki dua kemungkinan yang telah saya uji:

1) Selama memulai aplikasi saya hanya menghitung nilai yang paling penting dan nilai-nilai ini yang menghabiskan banyak waktu. Jadi pengguna harus menunggu sekitar 15 detik saat startup. Tetapi di sisi lain banyak interaksi pengguna memerlukan perhitungan ulang sehingga pengguna sering harus menunggu 2-3 detik setelah mengklik di suatu tempat sampai aplikasi telah menghitung dan memuat semua nilai

2) Saya memuat semuanya saat startup. Ini membutuhkan waktu 90 hingga 120 detik ... Ini waktu yang cukup lama, tetapi keuntungan besar adalah semua interaksi pengguna dieksekusi segera.

Jadi, apa yang biasanya Anda anggap sebagai pendekatan yang lebih baik? Memuat semua operasi yang memakan waktu selama startup atau saat dibutuhkan?

RoflcoptrException
sumber
1
Apa yang kamu hitung? Apakah perhitungan ini optimal?
dbasnett
Menghitung @dbasnett mungkin bukan kata yang optimal ... lebih seperti campuran permintaan basis data, suara dan pemuatan grafik, beberapa ratusan permintaan http dll dll ... dan optimal ... saya tidak berpikir itu adalah 100 % optimal tapi saya tidak bisa melihat kesalahan yang sangat besar
RoflcoptrException

Jawaban:

20

Mulai secepat mungkin, gunakan utas untuk melakukan perhitungan paling penting. Jadi pengguna mendapat umpan balik segera, dan dapat mulai bekerja setelah 15 detik. Di latar belakang, biarkan utas lain menghitung semuanya, jadi setelah dua menit, waktu respons 2-3 detik itu juga hilang.

pengguna281377
sumber
2
Startup cepat, digulingkan dengan mengantisipasi permintaan mahal bila memungkinkan, atau memberikan umpan balik yang anggun, adalah cara yang harus dilakukan.
Filip Dupanović
Entah bagaimana juga memberi tahu pengguna bahwa tugas latar belakang sedang melakukan perhitungan selama 2 menit itu.
TheLQ
@TheLQ: benar, bilah status dapat dimasukkan ke tugas ini.
Matthieu M.
Tentu saja thread tidak secara teknis diperlukan, selama pekerjaan itu dilakukan bersamaan di latar belakang. Apa pun yang ditawarkan oleh bahasa / lingkungan pemrograman Anda.
Waquo
@ Woquo: karena penasaran, jika tidak menggunakan utas lain, bagaimana pekerjaan akan dilakukan di latar belakang?
Wonko the Sane
6

Gunakan utas terpisah dari GUI untuk melakukan perhitungan apa pun yang Anda butuhkan. Mintalah formulir Anda berlangganan ke suatu acara dan ketika Anda selesai menghitung api acara itu sehingga formulir Anda bertindak sesuai.

Jangan mengunci GUI, itu sangat, sangat menjengkelkan bagi pengguna akhir dan dapat dianggap sebagai tanda produk yang buruk.

Dalam kasus Anda, tampilkan sesuatu kepada pengguna secepat mungkin dan lakukan semua perhitungan di latar belakang.


sumber
1
Bukan itu yang diminta poster asli.
Mavrik
@ Malav: Diedit jawaban saya menjadi sedikit lebih jelas.
4

Pasti tidak pernah mengunci utas UI untuk satu, punya umpan balik jika Anda akan membuat pengguna menunggu dalam situasi yang tidak dapat dihindari.

Saya akan mengatakan tidak pernah menghitung atau mengambil "keseluruhan" dari sesuatu dalam suatu aplikasi kecuali jika Anda benar-benar yakin bahwa setiap kali mereka menggunakan aplikasi tersebut, Anda yakin bahwa mereka akan sepenuhnya memanfaatkan semua data tersebut.

Itu juga sangat tergantung pada seberapa volatile data tersebut. Jika sulit diubah, mengapa Anda harus menghitung ulang setiap kali aplikasi dimulai? Saya yakin tidak ada yang signifikan tentang permulaan aplikasi, jadi bisakah penghitungan itu di-cache dan hanya di-refresh ketika nilai-nilai dasar dari data berubah?

Menunggu 1-2 menit untuk memuat aplikasi adalah mustahil untuk situasi PALING. Seperti yang saya katakan sebelumnya, apakah semua data itu harus tersedia untuk semua fungsi aplikasi?

Tetap responsif sebanyak yang Anda bisa dengan menjaga perhitungan data kapan dan ketika Anda membutuhkannya. Letakkan kalkulasi di utas latar jika benar-benar selalu dibutuhkan data secara global. Pertimbangkan beberapa bagian dari data yang dimuat / dihitung dengan malas.

Saya tidak berpikir apa yang Anda nyatakan dapat membantu kami memberikan jawaban yang tepat karena kami tidak tahu sifat data yang mendasari atau menggunakan kasus aplikasi.

Martin Blore
sumber
2

Anda tidak menjelaskan terlalu banyak apa aplikasi Anda dan mengapa ada kebutuhan untuk menghitung sesuatu, sehingga sulit untuk menjawab sesuatu yang tepat. Dalam semua kasus, Anda mengatakan bahwa Anda memiliki pilihan antara membiarkan pengguna menunggu selama 15 detik atau selama 90 detik . Dalam kedua kasus, ada masalah . Setiap aplikasi yang saya gunakan dimuat dalam waktu kurang dari sepuluh detik, kecuali dalam beberapa keadaan yang sangat spesifik (misalnya, Visual Studio dapat memakan waktu hingga 30 - 40 detik ketika memuat untuk pertama kalinya setelah instalasi bersih).

Secara umum, pengguna tidak harus menunggu saat startup, atau selama alur kerja. Jika aplikasi membutuhkan waktu 15 detik untuk memulai, sebagian besar pengguna akan berusaha untuk tidak pernah menutupnya, atau untuk memulainya ketika meninggalkan mengambil secangkir kopi. Dalam semua kasus, mereka mungkin akan berpikir: "Saya harus berinvestasi lebih banyak dalam membeli perangkat lunak yang benar daripada kehilangan waktu berharga saya".

Kasus-kasus ketika Anda benar-benar membutuhkan banyak perhitungan segera sangat jarang dan dapat dengan mudah dihapus. Sebagai contoh, Adobe Lightroom, ketika memulai, harus menunjukkan katalog terakhir dengan thumbnail foto. Ketika saya memulainya dengan katalog yang berisi beberapa ratus foto, 20 MB pada disk per foto , itu memerlukan banyak hard disk dan CPU untuk memuat foto-foto itu, membacanya, membuat transformasi (termasuk distorsi perspektif dll.) Dan menghasilkan thumbnail . Sebenarnya, Lightroom menghabiskan waktu kurang dari lima detik untuk memuat pada PC yang tidak terlalu baru, karena data di-cache dengan cerdas dan karena itu tidak menampilkan setiap dari ratusan thumbnail segera setelah startup, melainkan satu per satu setelah jendela utama sudah ditampilkan.

Jadi, dalam kasus Anda, Anda mungkin harus kurang memikirkan kapan pengguna harus menunggu, dan lebih banyak tentang bagaimana menghindari pengguna Anda membuang-buang waktu mereka.


Sunting: tentu saja, saya lupa sekelompok aplikasi yang dapat berperilaku berbeda: video game . Dalam permainan video, Anda dapat membiarkan pengguna menunggu satu menit untuk memuat gambar. Ini dilakukan karena rendering 2D / 3D dapat menjadi intensif CPU, dan Anda tidak dapat membuang-buang sumber daya mesin untuk memuat dan menghitung hal-hal selama permainan: kinerja visual harus menjadi yang terbaik, dan pengalaman permainan harus sangat halus.

Tetapi bahkan dalam kasus ini, saya pikir aplikasi tersebut mencoba menghabiskan kurang dari satu menit memuat barang. Atau mereka memuat bongkahan kecil , membiarkan pengguna memulai gim dengan sangat cepat, bermain dengan mulus, tetapi menunggu gratis hingga lima detik saat berpindah dari satu level ke level lainnya (itulah yang saya lihat dalam seri Half Life).

Arseni Mourzenko
sumber
1

Nilai-nilai ini Anda perlu menghitung bagaimana Anda menggunakannya? Apakah Anda hanya ingin menampilkannya?

Anda menyebutkan bahwa Anda dapat menghitung semuanya sekaligus, tidak bisakah Anda menyimpannya di suatu tempat sehingga tidak perlu dihitung ulang?

Jika ini bukan opsi, saya akan memilih untuk menggunakan multithreading, dan menunjukkan animasi 'penghitungan' di mana Anda ingin menampilkan nilai. Setelah nilai-nilai telah dihitung mereka dapat ditampilkan.

Dengan cara ini GUI tidak mengunci, yang sangat menjengkelkan. Pengguna masih dapat memilih untuk membatalkan dan pergi ke layar lain, dll ...

Steven Jeuris
sumber
1

Tidak bisakah Anda menghitungnya sesuai kebutuhan, lalu menyimpannya sehingga tidak perlu dihitung lagi?

Jadi, ketika Anda perlu memeriksa nomor apakah itu disimpan, jika tidak Hitung dan simpan.

Orang bodoh
sumber
1

Persepsi adalah kenyataan. Menunggu dalam antrean tampaknya memakan waktu jauh lebih lama daripada ketika kita benar-benar menjadi layanan. Sudah menjadi sifat manusia untuk mengembangkan pola pikir bahwa aplikasi Anda lambat (dan akan selalu lambat dalam segala hal yang dilakukannya) jika kita harus menunggu terlalu lama untuk memuatnya di awal.

Hancurkan perhitungan jika Anda bisa. Idealnya, banyak dari mereka akan berjalan di latar belakang atau dilakukan berdasarkan kebutuhan.

JeffO
sumber
1

Jika itu hanya dua pilihan saya, saya akan memulai dengan lambat. Saya tidak keberatan menunggu sedikit untuk memulai sesuatu, tetapi saya benci ketika sistem saya tertunda sementara saya mencoba untuk menyelesaikan beberapa pekerjaan.

Tentu saja, tidak ada tipe menunggu adalah pengalaman pengguna yang baik, dan saya setuju dengan responden Anda yang lain bahwa Anda harus menyelidiki multi-threading. Tentunya, jika aplikasi Anda hampir selesai, Anda mungkin tidak akan dapat dengan mudah "menambahkan" multi-threading, jadi mungkin melihatnya untuk versi berikutnya.

vjones
sumber