Trải nghiệm người dùng tốt hơn là gì: Chờ một lần khi khởi động trong một thời gian dài hoặc chờ đợi thường xuyên trong một thời gian ngắn? [đóng cửa]


8

Tôi hiện đang thiết kế một ứng dụng liên quan đến nhiều tính toán. Bây giờ tôi có hai khả năng chung mà tôi đã thử nghiệm:

1) Trong quá trình khởi động ứng dụng, tôi chỉ tính các giá trị quan trọng nhất và các giá trị này tiêu tốn rất nhiều thời gian. Vì vậy, người dùng phải chờ khoảng 15 giây trong khi khởi động. Nhưng mặt khác, rất nhiều tương tác của người dùng yêu cầu tính toán lại để người dùng thường phải chờ 2-3 giây sau khi nhấp vào đâu đó cho đến khi ứng dụng đã tính toán và tải tất cả các giá trị

2) Tôi tải mọi thứ trong khi khởi động. Quá trình này mất từ ​​90 đến 120 giây ... Đây là một khoảng thời gian khá dài, nhưng lợi thế lớn là tất cả các tương tác của người dùng được thực hiện ngay lập tức.

Vì vậy, những gì bạn thường xem xét cách tiếp cận tốt hơn? Tải tất cả các hoạt động tốn thời gian trong khi khởi động hoặc khi cần thiết?


1
Bạn đang tính toán gì? Tính toán này có tối ưu không?
dbasnett

@dbasnett tính toán có thể không phải là từ tối ưu ... nó giống như một hỗn hợp truy vấn cơ sở dữ liệu, tải âm thanh và đồ họa, một số hàng trăm yêu cầu http, v.v .... và tối ưu ... Tôi không nghĩ rằng đó là 100 % tối ưu nhưng tôi không thể thấy một lỗi thực sự lớn
RoflcoptrException

Câu trả lời:


20

Khởi động càng nhanh càng tốt, sử dụng một luồng để thực hiện các phép tính quan trọng nhất. Vì vậy, người dùng nhận được phản hồi ngay lập tức và có thể bắt đầu làm việc sau 15 giây. Trong nền, hãy để một luồng khác tính toán mọi thứ, vì vậy sau hai phút, thời gian phản hồi 2-3 giây đó cũng biến mất.


2
Khởi nghiệp nhanh, kết hợp với dự đoán các yêu cầu đắt tiền khi có thể, hoặc cung cấp phản hồi duyên dáng ít nhất, là cách để đi.
Filip Dupanović

Ngoài ra bằng cách nào đó thông báo cho người dùng rằng một tác vụ nền đang thực hiện các phép tính trong 2 phút đó.
TheLQ

@TheLQ: đúng, thanh trạng thái có thể được đặt cho nhiệm vụ này.
Matthieu M.

Tất nhiên một chủ đề không cần thiết về mặt kỹ thuật, miễn là công việc đó được thực hiện đồng thời trong nền. Bất cứ điều gì ngôn ngữ lập trình / môi trường của bạn cung cấp cho bạn.
Waquo

@Waquo: vì tò mò, nếu không sử dụng một chủ đề khác, công việc sẽ được thực hiện trong nền như thế nào?
Wonko the Sane

6

Sử dụng một luồng riêng biệt từ GUI để thực hiện bất kỳ tính toán nào bạn cần. Có biểu mẫu của bạn đăng ký một sự kiện và khi bạn hoàn thành tính toán sự kiện đó để biểu mẫu của bạn hoạt động tương ứng.

Đừng khóa GUI, nó rất, rất khó chịu cho người dùng cuối và có thể được coi là dấu hiệu của một sản phẩm kém.

Trong trường hợp của bạn, hiển thị một cái gì đó cho người dùng càng nhanh càng tốt và thực hiện tất cả các tính toán trong nền.


1
Đó không phải là những gì người đăng ban đầu đang yêu cầu.
Mavrik

@Mavarik: Đã chỉnh sửa câu trả lời của tôi rõ ràng hơn một chút.

4

Chắc chắn không bao giờ khóa luồng UI cho một người, có phản hồi nếu bạn sẽ khiến người dùng chờ đợi trong những tình huống không thể tránh khỏi.

Tôi nói không bao giờ tính toán hoặc tìm nạp "toàn bộ" một thứ gì đó trong một ứng dụng trừ khi bạn hoàn toàn chắc chắn rằng mỗi lần họ sử dụng ứng dụng, bạn chắc chắn rằng họ sẽ sử dụng đầy đủ tất cả dữ liệu nói trên.

Nó thực sự cũng phụ thuộc vào mức độ biến động của dữ liệu. Nếu nó hầu như không thay đổi, tại sao bạn cần tính toán lại mỗi khi ứng dụng bắt đầu? Tôi chắc chắn không có gì đáng kể về khởi động ứng dụng, vì vậy tính toán đó có thể được lưu trong bộ nhớ cache và chỉ được làm mới khi các giá trị cơ bản của dữ liệu thay đổi?

Chờ 1-2 phút để tải ứng dụng là không cần thiết cho các tình huống MOST. Như tôi đã nói trước đây, có phải tất cả dữ liệu đó cần phải có sẵn cho tất cả các chức năng của ứng dụng không?

Giữ cho nó phản hồi nhanh nhất có thể bằng cách giữ các tính toán dữ liệu khi và khi bạn cần chúng. Đặt các tính toán trên các luồng nền nếu nó thực sự luôn là dữ liệu cần thiết trên toàn cầu. Xem xét một số phần của dữ liệu được tải / tính toán lười biếng.

Tôi không nghĩ những gì bạn đã nêu có thể giúp chúng tôi cung cấp cho bạn câu trả lời chính xác vì chúng tôi không biết bản chất của dữ liệu cơ bản hoặc các trường hợp sử dụng của ứng dụng.


2

Bạn không giải thích quá nhiều ứng dụng của bạn là gì và tại sao cần phải tính toán một cái gì đó, vì vậy rất khó để trả lời chính xác. Trong mọi trường hợp, bạn nói rằng bạn có lựa chọn giữa việc để người dùng chờ trong 15 giây hoặc trong 90 giây . Trong cả hai trường hợp, có một vấn đề . Mỗi ứng dụng tôi sử dụng được tải trong chưa đầy mười giây, ngoại trừ trong một số trường hợp rất cụ thể (ví dụ: Visual Studio có thể mất tới 30 - 40 giây khi tải lần đầu tiên sau khi cài đặt sạch).

Nói chung, người dùng không phải chờ đợi khi khởi động cũng như trong quá trình làm việc. Nếu ứng dụng mất 15 giây để khởi động, hầu hết người dùng sẽ cố gắng không bao giờ đóng ứng dụng hoặc khởi động ứng dụng khi rời khỏi, hãy uống một tách cà phê. Trong mọi trường hợp, có lẽ họ sẽ nghĩ: "Tôi nên đầu tư nhiều hơn vào việc mua một phần mềm chính xác thay vì mất thời gian quý báu của mình".

Các trường hợp khi bạn thực sự cần rất nhiều tính toán ngay lập tức là cực kỳ hiếm và có thể dễ dàng loại bỏ. Ví dụ: Adobe Lightroom, khi bắt đầu, phải hiển thị danh mục cuối cùng với hình thu nhỏ của ảnh. Khi tôi khởi động nó với một danh mục chứa vài trăm bức ảnh, 20 MB trên đĩa cho mỗi bức ảnh , nó đòi hỏi rất nhiều đĩa cứng và CPU để tải những bức ảnh đó, đọc chúng, thực hiện các biến đổi (bao gồm biến dạng phối cảnh, v.v.) và tạo hình thu nhỏ . Trên thực tế, Lightroom dành ít hơn năm giây để tải trên một PC không quá mới, bởi vì dữ liệu được lưu trữ thông minh và vì nó không hiển thị mỗi hàng trăm hình thu nhỏ đó ngay sau khi khởi động, mà thay vào đó một lần một cửa sổ chính đã được hiển thị.

Vì vậy, trong trường hợp của bạn, có lẽ bạn nên suy nghĩ ít hơn về thời điểm người dùng phải chờ đợi và nhiều hơn về cách tránh người dùng của bạn lãng phí thời gian của họ.


Chỉnh sửa: tất nhiên, tôi đã quên một nhóm ứng dụng có thể hoạt động khác nhau: trò chơi video . Trong trò chơi video, bạn có thể để người dùng đợi trong một phút để tải đồ họa. Điều này được thực hiện vì kết xuất 2D / 3D có thể tốn nhiều CPU và bạn không thể lãng phí tài nguyên máy và tải mọi thứ trong trò chơi: hiệu suất hình ảnh phải là tốt nhất có thể và trải nghiệm trò chơi phải cực kỳ mượt mà.

Nhưng ngay cả trong trường hợp này, tôi nghĩ những ứng dụng đó cố gắng dành ít hơn một phút để tải công cụ. Hoặc họ tải các khối nhỏ , cho phép người dùng bắt đầu trò chơi rất nhanh, chơi mượt mà, nhưng chờ miễn phí đến năm giây khi đi từ cấp này sang cấp khác (ví dụ như những gì tôi đã thấy trong loạt Half Life).


1

Những giá trị bạn cần tính toán làm thế nào để bạn sử dụng chúng? Bạn chỉ đơn giản muốn hiển thị chúng?

Bạn đề cập đến việc bạn có thể tính toán tất cả chúng cùng một lúc, bạn không thể lưu trữ chúng ở đâu đó để chúng không phải tính toán lại?

Nếu đây không phải là một tùy chọn, tôi sẽ chọn sử dụng đa luồng và hiển thị hình động 'tính toán' nơi bạn muốn hiển thị các giá trị. Một khi các giá trị đã được tính toán, chúng có thể được hiển thị.

Bằng cách này, GUI không bị khóa, điều này cực kỳ khó chịu. Người dùng vẫn có thể chọn hủy bỏ và chuyển sang màn hình khác, v.v ...


1

Bạn không thể tính toán chúng khi bạn cần chúng, sau đó lưu trữ chúng để chúng không cần phải tính toán lại?

Vì vậy, khi bạn cần một số kiểm tra nếu nó được lưu trữ, nếu không tính toán nó và lưu trữ nó.


1

Nhận thức là khá nhiều thực tế. Việc xếp hàng chờ đợi dường như mất nhiều thời gian hơn so với khi chúng ta thực sự là dịch vụ. Bản chất của con người là phát triển một ý nghĩ rằng ứng dụng của bạn chậm (và sẽ luôn chậm trong mọi thứ nó làm) nếu chúng ta phải chờ quá lâu để tải nó lúc đầu.

Phá vỡ các tính toán nếu bạn có thể. Lý tưởng nhất, nhiều người trong số họ sẽ chạy trong nền hoặc thực hiện trên cơ sở khi cần thiết.


1

Nếu đó là hai lựa chọn duy nhất của tôi, tôi sẽ dành thời gian khởi động chậm. Tôi không ngại chờ đợi một chút gì đó để bắt đầu, nhưng tôi ghét nó khi hệ thống của tôi bị chậm trong khi tôi đang cố gắng hoàn thành công việc.

Tất nhiên, không có kiểu chờ đợi nào là trải nghiệm người dùng tốt và tôi đồng ý với những người trả lời khác của bạn rằng bạn nên điều tra đa luồng. Rõ ràng, nếu ứng dụng của bạn gần hoàn tất, có lẽ bạn sẽ không thể dễ dàng "thêm vào" đa luồng, vì vậy có thể xem xét nó cho phiên bản tiếp theo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.