Suponiendo que hay algún código que lee archivos para múltiples consumidores, y los archivos son de cualquier tamaño arbitrario: ¿A qué tamaño se vuelve más eficiente leer el archivo de forma asincrónica? O para decirlo de otra manera, ¿qué tan pequeño debe ser un archivo para que sea más rápido solo para leerlo sincrónicamente?
Me he dado cuenta (y tal vez soy incorrecto) de que al leer archivos muy pequeños, lleva más tiempo leerlos de forma asincrónica que sincrónica (en particular con .NET). Supongo que esto tiene que ver con el tiempo de configuración para cosas como puertos de finalización de E / S, hilos, etc.
¿Hay alguna regla general para ayudar aquí? ¿O depende del sistema y del entorno?
efficiency
async
io
carne
fuente
fuente
Respuestas:
Lamentablemente, la respuesta es "depende". Sería fácil para usted escribir un pequeño programa para determinar empíricamente los tiempos de las lecturas asíncronas y sincronizadas.
Dependerá de muchos factores. ¿Se almacenan en discos giratorios, SSD o una unidad de red? ¿Qué tipo de CPU estás usando? ¿Cuántos enchufes / núcleos? ¿Está ejecutando en una máquina virtual o metal desnudo? ¿Estás ejecutando un sistema operativo antiguo o moderno?
fuente
Async tiene 3 ventajas principales:
Creo que la principal ventaja de la lectura asincrónica es cuando está trabajando con muchos archivos o necesita mucha potencia de CPU.
fuente
blocked waiting for I/O
(0% CPU) acontinue normal processing
(> 0% CPU).Depende
Una cosa a tener en cuenta es lo costoso que es un cambio de contexto entre procesos. Node.JS está diseñado de la manera en que está porque asume que hacer un cambio de contexto es muy costoso y de lo contrario tendrás muchos procesos esperando en IE, lo que atascará la computadora.
Por otro lado, Erlang hace que un cambio de contexto de proceso sea muy barato, por lo que todo puede ser sincrónico y el tiempo de ejecución de Erlang puede realizar un seguimiento de todo.
Entonces los factores a considerar:
Y estoy seguro de que estoy dejando de lado media docena de factores
fuente
No estoy seguro de que haya un "punto" particular, pero tiene más sentido cuando tienes muchos subprocesos funcionando, ya que te permite superponer tu E / S con otro trabajo. Si tiene hilos de repuesto inactivos, leer de forma asincrónica no le dará ninguna ventaja. Es solo cuando tiene que completar las colas de trabajo y su hilo podría estar haciendo otro trabajo útilmente en lugar de esperar E / S que el acceso asíncrono a los archivos ofrece alguna ventaja.
fuente
Creo que el problema aquí no es tanto la velocidad de lectura como la latencia.
Si está leyendo desde una unidad de red, o desde una unidad de disco duro mecánica lenta con largas colas, el rendimiento caerá en picada para la lectura. Y si su aplicación también está leyendo en el hilo de la GUI, en cuyo caso es una aplicación muy mala, entonces será horrible para el usuario.
fuente