¿Por qué «queda 1 segundo» tarda tanto? — Cómo funcionan las barras de progreso y las estimaciones de tiempo

· Actualizado el: · · Windows, Barras de progreso, Tiempo restante, UI, Rendimiento

Lleva 30 segundos viendo «queda 1 segundo». Justo cuando espera que termine, cambia a «quedan 2 minutos».

Copias de archivos, instalaciones de aplicaciones, exportaciones de vídeo: las barras de progreso son útiles, pero a veces parecen funcionar en un mundo distinto del reloj.

En realidad, una barra de progreso no es un reloj. El porcentaje describe cuánto trabajo se ha completado; la estimación de tiempo predice cuánto podría tardar el trabajo restante; el término significa que las operaciones necesarias han tenido éxito. Separar esas tres ideas cambia cómo se lee una tarea que no acaba al 99 %.

Este artículo explica los mecanismos generales usando la documentación de las API y la interfaz de Windows. No aplica ingeniería inversa al algoritmo interno de una versión concreta del Explorador de archivos. Los ejemplos numéricos y la demo comparativa usan cargas de trabajo ficticias, no mediciones en un PC o una conexión de red.

1. Pregunte primero: ¿100 % de qué?

Imagine que revisa 100 documentos. Si 99 son notas breves y el último un contrato extenso, «99 documentos terminados» puede ser correcto sin significar «ha transcurrido el 99 % del tiempo».

Un indicador de progreso también cambia de significado según su denominador.

Base de medición Qué significa el 50 % Qué no dice esa cifra por sí sola
Número de archivos Se ha procesado la mitad de los archivos previstos El tamaño o el tiempo de proceso de los archivos restantes
Volumen de datos Se ha procesado la mitad de los bytes previstos La velocidad futura o las fases posteriores a la transferencia
Fases ponderadas Se ha completado la mitad de los pesos asignados Si esos pesos se corresponden con la duración real de esta ejecución

Por ejemplo, la devolución de llamada de progreso que usa la API de Windows CopyFileEx recibe el tamaño total del archivo y los bytes transferidos. Esos valores describen trabajo, no segundos futuros. 1

Porcentaje de progreso, tiempo restante y términoEl diagrama separa una proporción calculada a partir del trabajo realizado, una estimación de tiempo basada en una velocidad supuesta y un término acreditado por resultados correctos.Trabajo realizado y trabajo totalPorcentaje de progresoTrabajo restante y velocidad previstaTiempo restante estimadoLas operaciones necesarias tienen éxitoTarea completa terminada

Figura 1: Una proporción, una predicción y un resultado no son tres nombres para la misma información.

A lo largo de este artículo, porcentaje de progreso significa la fracción de trabajo medible completada, barra de progreso su indicador visual, y tiempo restante estimado la duración prevista. No poder hacer una predicción fiable no borra el progreso ya medido.

En el diagrama, una línea continua marca una relación que siempre se cumple y una línea discontinua una relación condicional (las condiciones están en la explicación de cada relación en la página de detalle). La lista completa de relaciones (9 en total, con evidencia y grado de certeza) y las definiciones de los conceptos principales están reunidas en la página de detalle del mapa de conocimiento (en japonés). Datos: JSON-LD / Turtle

2. Cómo 10 segundos restantes se convierten en 79

La estimación más sencilla usa esta ecuación:

Tiempo restante ≈ trabajo restante ÷ velocidad de procesamiento futura estimada

Lo difícil no es la división. Es que la velocidad futura todavía no se ha observado. Por eso usamos la velocidad pasada para predecirla. En una explicación de 2004 sobre las estimaciones de tiempo de copia, Raymond Chen, de Microsoft, describió esa dificultad de predecir el futuro. Aquel artículo no es una especificación del cálculo que usa el Windows actual. 2

Considere una copia ficticia de 1.000 MiB. Un MiB son 1.048.576 bytes. Suponga que primero avanza a 80 MiB/s constantes durante 2,5 segundos y luego baja a 10 MiB/s durante el segundo siguiente.

Observación Transferido Restante Velocidad usada para la estimación Tiempo restante
2,5 segundos tras el inicio 200 MiB 800 MiB 80 MiB/s 800 ÷ 80 = 10 segundos
3,5 segundos tras el inicio 210 MiB 790 MiB 10 MiB/s 790 ÷ 10 = 79 segundos

La tarea ha avanzado durante ese segundo. Aun así, la velocidad estimada para el trabajo restante ha caído a una octava parte de su valor anterior, de modo que la duración prevista aumenta. Este ejemplo usa directamente la velocidad del último intervalo de observación.

Por qué el tiempo restante puede subir mientras el trabajo avanzaSi la velocidad prevista cae lo suficiente, su efecto supera la reducción del trabajo restante y el tiempo restante calculado aumenta.10 MiB completados en un segundoQueda menos trabajoLa velocidad prevista cae bruscamenteEl tiempo restante puede aumentar

Figura 2: Un aumento de la estimación de tiempo no significa que la operación haya retrocedido.

Lo mismo vale para «queda 1 segundo». Una cantidad que a la velocidad anterior tardaría un segundo tardará más si la siguiente operación es más lenta. Los intervalos de observación y el redondeo también afectan a la pantalla. Ahora bien, una cifra que nunca cambia no debe darse por normal sin más: distinga, como se explica abajo, fases de procesamiento, actualizaciones de interfaz y atascos reales.

3. ¿Haría exacta la estimación promediar?

Refleje cada breve cambio de velocidad y la estimación salta arriba y abajo. Use solo la media desde el inicio y un periodo inicialmente rápido puede mantener la estimación optimista mucho después de una ralentización sostenida.

Esto se deriva de cómo se combinan las observaciones. Supongamos que damos el mismo peso a una velocidad previa de 80 y a una nueva de 10. La velocidad prevista pasa a ser 45. Cambia de forma menos abrupta que una estimación basada solo en el último valor de 10, pero si la velocidad realmente se mantiene en 10, sigue siendo optimista un tiempo. La suavidad y la capacidad de reacción al cambio son objetivos distintos.

El compromiso al suavizar las estimaciones de velocidadDar más peso a las observaciones recientes hace la estimación reactiva pero variable, mientras que dar más peso al historial la hace más suave pero más lenta en adaptarse.Observaciones de velocidadMás peso a los datos recientesMás peso al historialReactiva pero variableSuave pero más lenta en adaptarse

Figura 3: Una cifra de apariencia estable no es necesariamente una predicción exacta.

Este es un ejemplo para razonar sobre la estimación, no la descripción de un producto concreto. Mi recomendación de diseño es evitar forzar una cuenta atrás justo después del arranque o de un cambio de fase. Espere a tener observaciones útiles y presente después una estimación como «alrededor de un minuto». Decir que se está recalculando la estimación puede inducir menos a error que mantener un «queda 1 segundo» sin fundamento.

4. 99 archivos terminados, pero solo el 9,9 % de los datos

Considere ahora la unidad que se cuenta en lugar de la velocidad. Hay 100 archivos: los primeros 99 de 1 MiB cada uno y el último de 901 MiB. El total son 1.000 MiB.

Tras los primeros 99 archivos, el número de archivos da 99 ÷ 100 = 99 %. El volumen de datos da 99 ÷ 1.000 = 9,9 %. Solo queda un archivo, pero contiene el 90,1 % de los datos. Ambos cálculos son correctos: miden cosas distintas.

Cuando el último archivo es grandeUn archivo final grande tras 99 archivos pequeños hace que el progreso por número difiera mucho del progreso por bytes.99 archivos pequeñosCasi terminado por número de archivosQueda un archivo grandeQueda gran parte de los datosVistas distintas de una misma tarea

Figura 4: El 99 % por número de archivos no promete que solo quede el 1 % del tiempo.

¿Bastan entonces los recuentos de bytes? No. Transferir muchos archivos pequeños por SMB acarrea repetidamente el coste de crear archivos y de los viajes de ida y vuelta de las peticiones. El mismo número total de bytes no tiene por qué tardar lo mismo que un único archivo grande. 3

En consecuencia, «quedan 500 MiB» puede ser una medición exacta mientras el tiempo necesario varía con el contenido de esos 500 MiB. Mostrar tanto archivos como bytes es útil no porque una cifra sea errónea, sino porque cada una revela algo que la otra deja fuera.

5. «Preparando» puede significar: se está averiguando el denominador

Un porcentaje necesita un total como denominador. Pero pedirle a una aplicación que procese una carpeta entera no significa necesariamente que ya haya enumerado todos los archivos que contiene.

Suponga que la aplicación cree que hay 100 elementos, procesa 80 y luego descubre otros 100. Esos mismos 80 elementos completados representan ahora 80/200 en lugar de 80/100. La pantalla baja del 80 % al 40 %, pero el trabajo realizado no se ha esfumado. Presentar un total provisional como definitivo creó el desajuste con la expectativa de quien lee.

Mostrar el progreso antes de conocer el totalMientras se descubren los objetivos, evite un porcentaje definitivo; una vez conocido el total, combínelo con el trabajo realizado para mostrar una proporción.Todavía noDescubrir los objetivos¿Se conoce el total?Mostrar la fase y el número descubiertoMostrar un porcentaje

Figura 5: Un denominador desconocido no es lo mismo que un progreso del 0 %.

Windows ofrece controles de progreso tanto para valores determinados como para actividad indeterminada. 4 Para esta situación recomiendo mostrar algo como «Buscando elementos: 1.200 descubiertos» y, una vez conocido el total, un porcentaje. La ausencia de una cuenta atrás no es prueba de que no esté ocurriendo nada.

6. «Transferencia 100 %» y «todo terminado» marcan fronteras distintas

6.1 Al final puede quedar otra operación

A modo de ilustración, dividamos el trabajo de una aplicación en tres fases: transferencia, verificación y finalización del resultado. Si el diseño exige una verificación tras la transferencia, la tarea completa no ha terminado cuando acaba la transferencia. Es un ejemplo de diseño de aplicación, no la afirmación de que toda copia o instalación siga estas fases.

Fin de la transferencia frente a término generalEsta aplicación ficticia verifica y finaliza el resultado tras la transferencia, de modo que los bytes transferidos por sí solos no pueden acreditar el éxito general.TransferenciaVerificaciónFinalizar el resultadoÉxito generalLa transferencia al 100 % acaba aquí

Figura 6: Un alcance explícito hace posible explicar por qué tras el 100 % sigue otra fase.

En lugar de mantener una barra general al 99 % con «queda 1 segundo», resulta más coherente cambiar el estado a «Transferencia completada; verificando». Las recomendaciones de interfaz de Microsoft para aplicaciones de escritorio también desaconsejan mostrar un término general antes de que la operación haya acabado realmente. 5

6.2 Las escrituras también tienen más de una frontera

Windows normalmente usa caché para las escrituras de archivos. Según los ajustes y los contratos de las API, escribir desde la aplicación y confirmar los datos en el almacenamiento son fronteras distintas. 6 FlushFileBuffers es una API para enviar al dispositivo la información almacenada en búfer de un archivo determinado. 7

Una visión conceptual de las escrituras en búferCon el uso de búfer, la escritura aceptada por la aplicación y la posterior escritura del lado del almacenamiento no deben tratarse como el mismo evento.La aplicación escribeRetenido en un búferEscrito en el almacenamiento

Figura 7: Este es un diagrama conceptual de las escrituras en búfer, no el contrato de término de un producto concreto.

Sin embargo, una pausa al 99 % no siempre se debe al vaciado de una caché. Si la tarea está verificando, vaciando o esperando otra cosa hay que determinarlo a partir de su diseño o de sus registros. No deduzca de un mero número de progreso que sea seguro desconectar un dispositivo USB o cortar la alimentación.

7. ¿Se ha parado la tarea o solo la pantalla?

En una aplicación WPF de Windows, el Dispatcher del subproceso de interfaz procesa el trabajo de interfaz. Ocupar ese subproceso mucho tiempo retrasa las actualizaciones y las respuestas a la entrada. Distinga la operación subyacente del trabajo que pone sus resultados en pantalla. 8

El camino del procesamiento a la visualización del progresoAunque la operación informe de su progreso, la pantalla no puede reflejarlo hasta que la interfaz procesa la actualización.Procesamiento realInformar del progresoProcesar la actualización de interfazActualizar la pantallaSubproceso de interfaz bloqueado

Figura 8: Una pantalla congelada no significa necesariamente que la operación en sí esté congelada.

A la inversa, una animación diseñada para funcionar con independencia del trabajo real puede seguir girando mientras ese trabajo espera. «Se mueve, luego está bien; está quieto, luego está roto» no es una distinción suficiente.

Qué observar Qué puede indicarle Qué no acredita por sí solo
Cambios en elementos, bytes o fase completados El avance notificado del trabajo Si la tarea completa tendrá éxito
Horas, objetivos y errores en los registros Qué se registró como ocurrido y dónde Si hay trabajo sin registrar que esté atascado
Uso de CPU, disco y red del proceso implicado El uso de recursos en ese momento Avance sano frente a espera o repetición inútil
Un aviso en otra ventana Si se requiere una respuesta del usuario Todas las causas posibles de un atasco

Recomiendo registrar primero la pantalla y la hora de inicio, comprobar si hay avisos a la espera de respuesta y comparar contadores o registros a lo largo del tiempo. Trate las lecturas del Administrador de tareas como pruebas de apoyo. Antes de plantearse terminar el proceso, compruebe el procedimiento de cancelación de la aplicación y qué ocurre con la salida parcial.

La cancelación en .NET también es cooperativa: solicitar la cancelación no detiene por sí mismo la operación de inmediato; la operación debe responder. 9 Por eso «cancelando» y «cancelado» deberían ser estados distintos. Una pantalla de progreso por sí sola no puede ofrecer un número universal de minutos tras el cual forzar el cierre de la aplicación resulte seguro.

8. Comparar tres presentaciones de la misma operación

Abrir la demo comparativa de barras de progreso

La demo avanza por observaciones de una carga de trabajo ficticia cuando se pulsa un botón. No hay que esperar, y no lee, escribe ni sube archivos. El primer caso contiene 99 archivos pequeños y uno grande. Para cada observación muestra en paralelo una barra por número de archivos, otra por datos transferidos y el estado general de la tarea.

Mientras se transfiere el último archivo grande, la barra por número se mantiene al 99 % aunque la barra de volumen de datos crezca. Cuando los datos transferidos llegan al 100 %, el estado general sigue siendo «verificando». Solo la siguiente observación marca el éxito. Puede verse cómo un mismo trabajo puede parecer atascado o activo únicamente por la forma de mostrarlo.

Cómo leer la demo comparativaUna sola observación de una operación ficticia alimenta tres presentaciones: número de archivos, datos transferidos y estado general.Una operación ficticiaLa misma observaciónPorcentaje por número de archivosPorcentaje por datos transferidosEstado general de la tarea

Figura 9: La demo compara tres vistas de una operación, no tres operaciones distintas.

El segundo caso reproduce la ralentización de la sección 2 y muestra el cálculo que convierte 10 segundos en 79. Usa el cálculo siguiente. Es una estimación didáctica deliberadamente sencilla, no una implementación de producción con reintentos, procesamiento paralelo o predicción por fases.

function estimateSeconds(remaining, rate) {
  if (!Number.isFinite(remaining) || remaining < 0) return null;
  if (remaining === 0) return 0;
  if (!Number.isFinite(rate) || rate <= 0) return null;
  const seconds = remaining / rate;
  return Number.isFinite(seconds) ? seconds : null;
}

Use unidades coherentes para remaining y rate, por ejemplo MiB y MiB/s. Un valor devuelto de cero significa que no queda nada de la carga de trabajo medida, no que la tarea completa de la aplicación haya tenido éxito. Con trabajo restante positivo, una velocidad de cero o desconocida produce null, para que una estimación desconocida no se confunda con «quedan 0 segundos».

9. El objetivo es no inducir a error, no solo parecer preciso

Para el diseño del que aquí se habla, mantendría separados la fase actual, el trabajo medido, una estimación de tiempo solo cuando esté justificada y el resultado de éxito, fallo o cancelación. Aun combinando porcentajes de fases en una sola barra, un reparto como «transferencia 80 %, verificación 20 %» representa pesos de diseño, no una garantía sobre el reparto del tiempo de esta ejecución.

Construir una pantalla de progreso a partir de observacionesMuestre la fase actual, las cantidades medidas, una estimación de tiempo cuando esté justificada y el resultado final como información separada.Información procedente de la operaciónFase actualTrabajo medido y totalEstimación cuando esté justificadaÉxito, fallo o cancelación

Figura 10: Mantenga distintas las observaciones y las predicciones también en pantalla.

«Verificando: 400 / 1.000 elementos; calculando el tiempo restante» puede ser útil sin cuenta atrás. Si muestra una marca de tiempo, distinga «último aumento del progreso» de «última comunicación correcta con la interfaz». No actualice solo la segunda de un modo que haga parecer que una tarea atascada avanza con normalidad.

El mismo principio vale para la accesibilidad. El elemento HTML progress puede representar un progreso indeterminado omitiendo su valor. 10 Para un indicador de progreso ARIA propio, omita aria-valuenow cuando el valor sea desconocido y proporcione un nombre accesible que identifique qué está progresando. 11 Tanto la presentación visual como la información leída en voz alta deberían reflejar con honestidad lo que se sabe.

10. Preguntas frecuentes

¿«Queda un segundo» sin que termine significa que algo ha fallado?

La pantalla por sí sola no puede decidirlo. Distinga una estimación inexacta, otra fase, actualizaciones de interfaz retrasadas y un atasco real. Tanto «es habitual, así que estará bien» como «ha pasado un segundo, así que está roto» sacan conclusiones precipitadas.

¿El 99 % significa que queda el 1 % del tiempo total?

No. Cuente el porcentaje archivos o bytes, el tiempo por unidad no tiene por qué ser constante. Multiplicar el tiempo transcurrido por el 1 % no da la duración restante.

¿Una animación que gira significa que la tarea va bien?

Un indicador de actividad y una prueba de que el trabajo avanza son cosas distintas. Observe conjuntamente el trabajo realizado, las fases y los registros. La animación por sí sola no garantiza que la tarea pueda llegar a completarse con éxito.

¿Puedo mostrar progreso sin conocer el tiempo restante?

Si se conocen la cantidad total y la completada, puede mostrar su proporción. Omita solo la cuenta atrás cuando la predicción no sea fiable. Cuando el propio total es desconocido, use un indicador indeterminado con la fase y el número de elementos completados.

11. Resumen: el tiempo restante es un pronóstico; el término, un resultado

«Queda un segundo» no tarda mucho porque el ordenador no sepa contar hasta uno. Tarda porque se usa el trabajo observado para estimar un tiempo de procesamiento que todavía no ha ocurrido. Las unidades de recuento, el descubrimiento de los objetivos, las fases finales y las actualizaciones de interfaz retrasadas añaden más complicaciones.

Preguntas que hacerse ante una pantalla de progreso que no acabaCompruebe qué mide el porcentaje, si ha cambiado la velocidad prevista, si queda otra fase y si lo atascado es la interfaz o la operación real.¿Porcentaje de qué?¿Ha cambiado la velocidad prevista?¿Queda otra fase?¿Atasco de la interfaz o del procesamiento?

Figura 11: Convierta la irritación ante una cifra en preguntas que pueda investigar.

Como usuario, fíjese en las fases y los cambios más que en las cifras solas. Como desarrollador, no mezcle trabajo medido, predicción y resultados. Más importante que acertar una y otra vez con «un segundo» es explicar qué está pasando ahora y qué sigue siendo desconocido. Ese es el cometido de una buena pantalla de progreso.

Enlaces de referencia

  1. Microsoft Learn, LPPROGRESS_ROUTINE callback function. El significado de los recuentos de bytes que proporciona una devolución de llamada de progreso de copia. 

  2. Microsoft, The Old New Thing, Why does the copy dialog give such horrible estimates?. Una explicación de 2004 sobre la dificultad de predecir la velocidad futura, no una especificación de los mecanismos internos actuales de Windows. 

  3. Microsoft Learn, Slow SMB files transfer speed. El coste repetido de crear archivos y de comunicación en las transferencias de archivos pequeños. 

  4. Microsoft Learn, Progress controls. Los controles para progreso determinado e indeterminado. 

  5. Microsoft Learn, Progress Bars. Las recomendaciones de presentación del progreso para aplicaciones de escritorio. 

  6. Microsoft Learn, File Caching. La caché de archivos y el comportamiento de las escrituras. 

  7. Microsoft Learn, FlushFileBuffers function. La API para enviar al dispositivo la información en búfer de un archivo. 

  8. Microsoft Learn, Threading model. El Dispatcher de WPF y la capacidad de respuesta del subproceso de interfaz. 

  9. Microsoft Learn, Cancellation in Managed Threads. La cancelación cooperativa en .NET. 

  10. WHATWG, The progress element. El elemento HTML progress y el estado indeterminado. 

  11. W3C, WAI-ARIA 1.2: progressbar. Las reglas de nombre y valor para información de progreso accesible. 

Artículos recientes con las mismas etiquetas para profundizar en temas cercanos.

Estas páginas sitúan el tema en un contexto más amplio de servicios y decisiones.

El artículo está directamente relacionado con los siguientes servicios.

Preguntas frecuentes

Preguntas habituales en las consultas sobre el tema del artículo.

¿Una tarea atascada en un segundo restante significa que algo ha fallado?
La pantalla por sí sola no puede decírselo. Distinga una estimación de velocidad inexacta, una fase de procesamiento final, una interfaz detenida y un atasco real. Compruebe los cambios en los contadores y los registros y busque avisos a la espera de una respuesta. No fuerce el cierre de la aplicación solo porque indique un segundo restante.
¿El 99 % significa que solo queda el 1 % del tiempo total?
No. El significado depende de si el porcentaje mide elementos, bytes o fases ponderadas, y esas unidades no tienen por qué requerir el mismo tiempo. Un porcentaje de progreso mide una fracción del trabajo, no el tiempo restante en sí.
¿Una animación que gira demuestra que la tarea va bien?
No. Cuando la animación y el procesamiento son independientes, la animación puede seguir mientras la tarea espera. Distinga la animación de las pruebas de trabajo realizado, como contadores, cambios de fase y registros.
¿Puedo mostrar una barra de progreso sin una estimación de tiempo fiable?
Sí. Cuando se conocen la cantidad total y la completada, puede mostrar su proporción y omitir la estimación de tiempo si la velocidad es inestable. Cuando el propio total es desconocido, muestre la fase o el número de elementos completados en lugar de inventar un porcentaje.

Perfil del autor

Página de presentación del autor del artículo.

Go Komura

Representante de KomuraSoft LLC

Especializado en desarrollo de software para Windows, consultoría técnica e investigación de fallos, sobre todo en proyectos con sistemas existentes y errores difíciles de reproducir.

Volver al blog