Rendimiento de C # para el servidor proxy (vs C ++)

Quiero crear un servidor proxy HTTP simple que realice un procesamiento muy básico en los encabezados http (es decir, si el encabezado x == y, do z). Es posible que el servidor deba admitir a cientos de usuarios. Puedo escribir el servidor en C # (bastante fácil) o c ++ (mucho más difícil). Sin embargo, ¿una versión de C # tendría tan buen desempeño como una versión de C ++? Si no, ¿la diferencia en el rendimiento sería lo suficientemente grande como para que no tuviera sentido escribirla en C #?

Puede usar el código C # inseguro y los punteros en puntos de cuello de botella críticos para que se ejecute más rápido. Se comportan como el código C ++ y creo que se ejecuta tan rápido .

Pero la mayoría de las veces, C # ya está hecho para ser súper rápido, no creo que haya muchas diferencias como con lo que todos han dicho.

Pero una cosa que debería considerar es: las operaciones de cadena de código administrado (C #) son bastante lentas en comparación con el uso efectivo de punteros en C ++. Hay más trucos de optimización con los punteros de C ++ que con las cadenas CLR.

Creo que he hecho algunos puntos de referencia antes, pero no recuerdo dónde los puse.

¿Por qué esperas un rendimiento mucho mayor de la aplicación C ++?

No hay una desaceleración inherente agregada por una aplicación de C # cuando lo está haciendo bien. (no demasiadas referencias eliminadas, creación o eliminación frecuente de objetos por llamada, etc.)

La única vez que una aplicación de C ++ realmente supera a una aplicación de C # equivalente es cuando puede realizar operaciones de (muy) bajo nivel. Ej. Casting punteros de memoria en bruto, ensamblador en línea, etc.

El comstackdor de C ++ puede ser mejor para crear código rápido, pero principalmente se desperdicia en la mayoría de las aplicaciones. Si realmente tiene una parte de su aplicación que debe ser increíblemente rápida, intente escribir una llamada C para ese punto caliente.

Solo si la mayoría del sistema se comporta con demasiada lentitud, debería considerar escribirlo en C / C ++. Pero hay muchos escollos que pueden matar su rendimiento en su código C ++.

(TLDR: un experto en C ++ puede crear un código ‘más rápido’ como experto en C #, pero un progtwigdor mediocre de C ++ puede crear un código más lento que un C # uno mediocre)

Espero que la versión de C # sea casi tan rápida como la de C ++ pero con una huella de memoria más pequeña. En algunos casos, el código administrado es mucho MUCHO más rápido y usa menos memoria en comparación con C ++ no optimizado. El código C ++ puede ser más rápido si lo escribe un experto, pero rara vez justifica el esfuerzo.

Como nota al margen, puedo recordar una “competencia” de rendimiento en la blogósfera entre Michael Kaplan (c #) y Raymond Chan (C ++) para escribir un progtwig, que hace exactamente lo mismo. Raymond Chan, que es considerado uno de los mejores progtwigdores del mundo (Joel), logró escribir C ++ más rápido después de una larga lucha al reescribir la mayor parte del código.

El servidor proxy que describe trataría principalmente con datos de cadena y creo que es razonable implementarlo en C #. En tu ejemplo,

if header x == y, do z 

la parte más lenta podría estar haciendo lo que sea ‘z’ y tendrás que hacer ese trabajo sin importar el idioma.

En mi experiencia, el diseño y la implementación tienen mucho más que ver con el rendimiento que con la elección del lenguaje / marco (sin embargo, se aplican las advertencias habituales: por ejemplo, no escriba un controlador de dispositivo en C # o java).

No lo pensaría dos veces antes de escribir el tipo de progtwig que describe en un lenguaje administrado (ya sea Java, C #, etc.). En estos días, las mejoras en el rendimiento que obtiene al utilizar un lenguaje de nivel inferior (en términos de proximidad al hardware) a menudo se compensan fácilmente con las capacidades de tiempo de ejecución de un entorno administrado. Por supuesto, esto proviene de un desarrollador de C # / python, así que no soy exactamente imparcial …

Si necesita un servidor proxy rápido y confiable, podría tener sentido probar algunos de los que ya existen. Pero si tiene características personalizadas que se requieren, entonces tendrá que crear las suyas propias. Es posible que desee recostackr más información sobre la carga esperada: cientos de usuarios pueden ser algunas solicitudes por minuto o cien solicitudes por segundo.

Suponiendo que necesite servir por debajo o alrededor de 200 qps en una sola máquina, C # debería satisfacer sus necesidades fácilmente, incluso los idiomas conocidos por ser lentos (por ejemplo, Ruby) pueden bombear fácilmente unos pocos cientos de solicitudes por segundo.

Aparte del rendimiento, hay otras razones para elegir C #, por ejemplo, es mucho más fácil escribir desbordamientos de búfer en C ++ que en C #.

¿Su servidor http se ejecutará en una máquina dedicada? Si es así, diría que ir con C # si es más fácil para ti. Si necesita ejecutar otras aplicaciones en la misma máquina, deberá tener en cuenta la huella de memoria de su aplicación y el hecho de que GC se ejecutará en tiempos “aleatorios”.