@Roddy - Ya he leído los enlaces que señala, ambos se mencionan en la presentación de Paul Tyma "Miles de hilos y E/S de bloqueo - La antigua forma de escribir servidores Java es nueva nuevamente".
Algunas de las cosas que no necesariamente salen de la presentación de Paul, sin embargo, es que especificó -Xss: 48k en la JVM en el inicio, y que está asumiendo que la implementación de NIO de la JVM es eficiente para que ser una comparación válida
Indy does not especifique un tamaño de pila igualmente reducido y estrechamente restringido.No hay llamadas a BeginThread (la rutina de creación de subprocesos de Delphi RTL, que debe usar para tales situaciones) o CreateThread (la llamada de WinAPI sin formato) en la base de código de Indy.
El tamaño de pila predeterminado se almacena en el PE, y para el compilador Delphi predeterminado es 1MB de espacio de direcciones reservado (el OS almacena página por página en fragmentos 4K; de hecho, el compilador necesita generar código para tocar páginas si hay> 4K de locales en una función, porque la extensión está controlada por fallas de página, pero solo para la página más baja (de guardia) en la pila). Eso significa que se va a quedar sin espacio de direcciones después de un máximo de 2.000 subprocesos simultáneos que manejan conexiones.
Ahora, puede cambiar el tamaño de pila predeterminado en el PE utilizando el {$ M minStackSize [, maxStackSize]} Directiva, pero que afectará a todos los hilos, incluyendo el hilo principal. Espero que no hagas mucha recursión, porque 48K o (similar) no es mucho espacio.
Ahora, si Paul tiene razón sobre la falta de rendimiento de la E/S asincrónica para Windows en particular, no estoy 100% seguro, tendría que medirlo para estar seguro. Lo que sé, sin embargo, es que los argumentos sobre la programación de subprocesos son más fáciles que la programación basada en eventos asincrónicos, presentan una dicotomía falsa.
Código asíncrono no necesita basado en eventos; puede basarse en la continuación, como en .NET, y si especifica un cierre como su continuación, se le mantiene el estado de forma gratuita. Además, la conversión del código de estilo de subproceso lineal al código asincrónico de estilo de paso de continuación puede hacerse mecánica por un compilador (la transformación de CPS es mecánica), por lo que tampoco debe haber ningún costo en la claridad del código.
ICS no usa iocp –