Domanda

Voglio creare un semplice server proxy http che esegua alcune elaborazioni di base sulle intestazioni http (ad es.se l'intestazione x == y, fai z).Potrebbe essere necessario che il server supporti centinaia di utenti.Posso scrivere il server in C# (abbastanza semplice) o C++ (molto più difficile).Tuttavia, una versione C# avrebbe prestazioni altrettanto buone di una versione C++?In caso contrario, la differenza di prestazioni sarebbe abbastanza grande da non avere senso scriverla in C#?

È stato utile?

Soluzione

Puoi usare pericoloso Codice C# e puntatori nei punti critici dei colli di bottiglia per farlo funzionare più velocemente.Quelli si comportano in modo molto simile al codice C++ e credo che venga eseguito veloce come.

Ma la maggior parte delle volte, C# è già dotato di JIT per essere super veloce, non credo che ci saranno molte differenze rispetto a ciò che tutti hanno detto.

Ma una cosa che potresti prendere in considerazione è: Le operazioni sulle stringhe di codice gestito (C#) sono piuttosto lente rispetto all'uso efficace dei puntatori in C++. Esistono più trucchi di ottimizzazione con i puntatori C++ che con le stringhe CLR.

Penso di aver già fatto alcuni benchmark, ma non ricordo dove li ho messi.

Altri suggerimenti

Perché ti aspetti prestazioni molto più elevate dall'applicazione C++?

Non vi è alcun rallentamento intrinseco aggiunto da un'applicazione C# quando lo si esegue correttamente.(non troppi riferimenti eliminati, creazione/eliminazione frequente di oggetti per chiamata, ecc.)

L'unica volta in cui un'applicazione C++ supera davvero un'applicazione C# equivalente è quando puoi eseguire operazioni di livello (molto) basso.Per esempio.lanciare puntatori di memoria grezzi, assemblatore in linea, ecc.

Il compilatore C++ potrebbe essere migliore nel creare codice veloce, ma nella maggior parte delle applicazioni questo viene sprecato.Se una parte della tua applicazione deve essere davvero incredibilmente veloce, prova a scrivere una chiamata C per quell'hot spot.

Solo se la maggior parte del sistema si comporta troppo lentamente dovresti considerare di scriverlo in C/C++.Ma ci sono molte insidie ​​che potrebbero compromettere le tue prestazioni nel codice C++.

(TLDR:Un esperto C++ può creare codice "più veloce" come un esperto C#, ma un programmatore C++ mediocre può creare codice più lento di uno C# mediocre)

Mi aspetterei che la versione C# fosse veloce quasi quanto quella C++ ma con un ingombro di memoria inferiore.In alcuni casi il codice gestito è in realtà MOLTO più veloce e utilizza meno memoria rispetto al C++ non ottimizzato.Il codice C++ può essere più veloce se scritto da esperti, ma raramente giustifica lo sforzo.

Come nota a margine posso ricordare una "competizione" di performance nella blogosfera tra Michael Kaplan (c#) e Raymond Chan (C++) per scrivere un programma che faccia esattamente la stessa cosa.Raymond Chan, considerato uno dei migliori programmatori al mondo (Joel), è riuscito a scrivere C++ più velocemente dopo una lunga lotta per riscrivere la maggior parte del codice.

Il server proxy che descrivi si occuperebbe principalmente di dati di stringa e penso che sia ragionevole implementarlo in C#.Nel tuo esempio,

if header x == y, do z

la parte più lenta potrebbe effettivamente fare qualunque sia la "z" e dovrai farlo indipendentemente dalla lingua.

Nella mia esperienza, la progettazione e l'implementazione hanno molto più a che fare con le prestazioni che con la scelta del linguaggio/framework (tuttavia, si applicano le solite avvertenze:ad esempio, non scrivere un driver di dispositivo in C# o Java).

Non ci penserei due volte prima di scrivere il tipo di programma che descrivi in ​​un linguaggio gestito (che sia Java, C#, ecc.).Al giorno d'oggi, i miglioramenti in termini di prestazioni ottenuti utilizzando un linguaggio di livello inferiore (in termini di vicinanza all'hardware) sono spesso facilmente compensati dalle capacità di runtime di un ambiente gestito.Ovviamente questo proviene da uno sviluppatore C#/python quindi non sono esattamente imparziale...

Se hai bisogno di un server proxy veloce e affidabile, potrebbe avere senso provare alcuni di quelli già esistenti.Ma se sono necessarie funzionalità personalizzate, potrebbe essere necessario crearne di proprie.Potresti voler raccogliere qualche informazione in più sul carico previsto:centinaia di utenti potrebbero avere poche richieste al minuto o cento richieste al secondo.

Supponendo che tu debba servire meno di 200 qps o circa su una singola macchina, C# dovrebbe facilmente soddisfare le tue esigenze, anche i linguaggi noti per essere lenti (ad es.Ruby) può facilmente inviare alcune centinaia di richieste al secondo.

A parte le prestazioni, ci sono altri motivi per scegliere C#, ad es.è molto più semplice scrivere buffer overflow in C++ che in C#.

Il tuo server http funzionerà su un computer dedicato?Se sì, direi di andare con C# se è più facile per te.Se devi eseguire altre applicazioni sulla stessa macchina, dovrai prendere in considerazione l'impronta di memoria della tua applicazione e il fatto che GC verrà eseguito a orari "casuali".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top