Actualmente estoy diseñando una aplicación que involucra muchos cálculos. Ahora tengo generalmente dos posibilidades que he probado:
1) Durante el inicio de la aplicación, calculé solo los valores más importantes y estos valores que consumen mucho tiempo. Por lo tanto, el usuario tiene que esperar aproximadamente 15 segundos durante el inicio. Pero, por otro lado, muchas interacciones del usuario requieren un nuevo cálculo, por lo que el usuario a menudo tiene que esperar 2-3 segundos después de hacer clic en algún lugar hasta que la aplicación haya calculado y cargado todos los valores
2) Cargo todo durante el inicio. Esto lleva de 90 a 120 segundos ... Esto es bastante tiempo, pero la gran ventaja es que todas las interacciones del usuario se ejecutan de inmediato.
Entonces, ¿qué consideraría generalmente el mejor enfoque? ¿Carga todas las operaciones que requieren mucho tiempo durante el inicio o cuando es necesario?
fuente
Respuestas:
Inicie lo más rápido posible, use un hilo para hacer los cálculos más importantes. Por lo tanto, el usuario recibe un comentario de inmediato y puede comenzar a trabajar después de 15 segundos. En el fondo, deje que otro hilo calcule todo, así que después de dos minutos, esos tiempos de respuesta de 2-3 segundos también desaparecen.
fuente
Use un hilo separado de la GUI para hacer los cálculos que necesite. Haga que su formulario se suscriba a un evento y, cuando haya terminado de calcular ese evento, su formulario actuará en consecuencia.
No bloquee la GUI, es muy, muy molesto para los usuarios finales y puede tomarse como un signo de un producto deficiente.
En su caso, muestre algo al usuario lo más rápido posible y haga todos los cálculos en segundo plano.
fuente
Definitivamente nunca bloquee el hilo de la interfaz de usuario para uno, reciba comentarios si va a mantener al usuario esperando en situaciones inevitables.
Yo diría que nunca calcule ni busque el "todo" de algo en una aplicación a menos que esté absolutamente seguro de que cada vez que usan la aplicación, está seguro de que utilizarán todos esos datos.
Realmente también depende de cuán volátiles sean los datos. Si apenas cambia, ¿por qué necesita recalcular cada vez que se inicia la aplicación? Estoy seguro de que no hay nada significativo sobre el inicio de una aplicación, entonces, ¿puede ese cálculo almacenarse en caché y actualizarse solo cuando cambian los valores subyacentes de los datos?
Esperar 1-2 minutos para que se cargue una aplicación está fuera de discusión para la mayoría de las situaciones. Como dije antes, ¿todos esos datos deben estar disponibles para todas las funciones de la aplicación?
Mantenga la capacidad de respuesta lo más que pueda manteniendo los cálculos de datos cuando los necesite. Realice cálculos en subprocesos en segundo plano si realmente siempre se necesitan datos a nivel mundial. Considere que algunas partes de los datos se cargan / calculan de forma diferida.
No creo que lo que haya dicho pueda ayudarnos a darle una respuesta exacta porque no conocemos la naturaleza de los datos subyacentes o los casos de uso de la aplicación.
fuente
No explica demasiado cuál es su aplicación y por qué es necesario calcular algo, por lo que es difícil responder algo preciso. En todos los casos, usted dice que puede elegir entre dejar que el usuario espere 15 segundos o 90 segundos . En ambos casos, hay un problema . Cada aplicación que utilicé se cargó en menos de diez segundos, excepto en algunas circunstancias muy específicas (por ejemplo, Visual Studio puede demorar entre 30 y 40 segundos cuando se carga por primera vez después de una instalación limpia).
En general, el usuario no tiene que esperar ni al inicio ni durante el flujo de trabajo. Si la aplicación tarda 15 segundos en iniciarse, la mayoría de los usuarios intentará nunca cerrarla o iniciarla cuando salga a tomar una taza de café. En todos los casos, probablemente pensarán: "Debería invertir más en comprar un software correcto en lugar de perder mi valioso tiempo".
Los casos en los que realmente necesita muchos cálculos de inmediato son extremadamente raros y se pueden eliminar fácilmente. Por ejemplo, Adobe Lightroom, al comenzar, debe mostrar el último catálogo con las miniaturas de las fotos. Cuando lo comienzo con un catálogo que contiene varios cientos de fotos, 20 MB en disco por foto , se requiere una gran cantidad de disco duro y CPU para cargar esas fotos, leerlas, realizar transformaciones (incluida la distorsión de perspectiva, etc.) y generar una miniatura . En realidad, Lightroom gasta menos de cinco segundos para cargar en una PC no tan nueva, porque los datos se almacenan en caché de manera inteligente y porque no muestran cada uno de esos cientos de miniaturas inmediatamente después del inicio, sino una por una una vez que aparece la ventana principal Ya se muestra.
Entonces, en su caso, probablemente debería pensar menos en cuándo debe esperar el usuario y más en cómo evitar que sus usuarios pierdan su tiempo.
Editar: por supuesto, he olvidado un grupo de aplicaciones que pueden comportarse de manera diferente: los videojuegos . En un videojuego, puede dejar que el usuario espere un minuto para cargar gráficos. Esto se hace porque el renderizado 2D / 3D puede ser intensivo en CPU, y no puede permitirse el desperdicio de recursos de la máquina cargando y calculando cosas durante el juego: el rendimiento visual debe ser el mejor posible y la experiencia del juego debe ser extremadamente fluida.
Pero incluso en este caso, creo que esas aplicaciones intentan gastar menos de un minuto cargando cosas. O cargan trozos pequeños , lo que permite al usuario comenzar el juego muy rápido, jugar sin problemas, pero esperar de forma gratuita a cinco segundos al pasar de un nivel a otro (eso es lo que he visto en la serie Half Life, por ejemplo).
fuente
Estos valores que necesita para calcular cómo los usa? ¿Simplemente quieres mostrarlos?
Menciona que puede calcularlos todos a la vez, ¿no puede almacenarlos en algún lugar para que no tengan que volver a calcularse?
Si esto no es una opción, optaría por usar subprocesos múltiples y mostrar una animación de "cálculo" donde desea mostrar los valores. Una vez que se han calculado los valores, se pueden mostrar.
De esta manera, la GUI no se bloquea, lo cual es extremadamente molesto. El usuario aún puede elegir abortar e ir a otra pantalla, etc.
fuente
¿No puede calcularlos a medida que los necesita y luego almacenarlos para que no tengan que calcularse nuevamente?
Entonces, cuando necesite un número, verifique si está almacenado, si no, calcúlelo y guárdelo.
fuente
La percepción es más o menos la realidad. Esperar en la cola parece tomar mucho más tiempo que cuando en realidad estamos siendo servicios. Es natural desarrollar una mentalidad de que su aplicación es lenta (y siempre será lenta en todo lo que hace) si tenemos que esperar demasiado para que se cargue al principio.
Rompe los cálculos si puedes. Idealmente, muchos de ellos se ejecutarían en segundo plano o se realizarían según sea necesario.
fuente
Si esas son mis dos únicas opciones, tomaré el tiempo de inicio lento. No me importa esperar un poco para que comience algo, pero odio cuando mi sistema se atrasa mientras trato de hacer algo de trabajo.
Por supuesto, ningún tipo de espera es una buena experiencia para el usuario, y estoy de acuerdo con sus otros encuestados en que debe investigar los subprocesos múltiples. Obviamente, si su aplicación está casi terminada, es probable que no pueda "agregar" múltiples subprocesos fácilmente, así que tal vez mire para la próxima versión.
fuente