Pergunta

Eu quero criar um simples servidor de proxy http que faz bem básicas de processamento nos cabeçalhos http (por exemplo,cabeçalho if x == y, z).O servidor poderá ter de suportar centenas de usuários.Eu posso escrever o server em C# (muito fácil) ou c++ (muito mais difícil).No entanto, seria uma versão em C# tem de desempenho como uma versão de C++?Se não, a diferença de desempenho seja grande o suficiente para que não faria sentido escrever isso em C#?

Foi útil?

Solução

Você pode usar inseguro Código C# e ponteiros no estrangulamento crítico aponta para fazê-lo funcionar mais rapidamente.Aqueles que se comportam mais como o código C++ e acredito que executa tão rápido.

Mas a maior parte do tempo, C# é JIT-ted para super-rápido já, eu não acredito que haverá muito diferenças com o que todo mundo já disse.

Mas uma coisa que você pode querer considerar é: Código gerenciado (C#) operações de cadeia de caracteres são bastante lento em comparação ao uso de ponteiros efetivamente em C++. Há mais truques de otimização com C++ ponteiros do que com o CLR cadeias de caracteres.

Eu acho que eu tenho feito alguns benchmarks antes, mas não me lembro onde eu colocá-los.

Outras dicas

Por que você espera de um muito mais elevado de desempenho do aplicativo de C++?

Não há qualquer abrandamento adicionado por uma aplicação C# quando você está fazendo isso direito.(não muitas caiu referências, objeto freqüente de criação/caindo por chamada, etc.)

A única vez em que um aplicativo de C++ realmente supera um equivalente aplicação C# é quando você pode fazer (muito) baixo nível de operações.E. g.carcaça matérias de ponteiros de memória, inline assembler, etc.

O compilador do C++ pode ser melhor para criar um código, mas, principalmente, este é desperdiçado na maioria das aplicações.Se você tem realmente uma parte de sua aplicação, que deve ser extremamente rápido, tente escrever uma chamada de C para o ponto de acesso.

Só se a maioria dos sistema comporta-se muito lentamente, você deve considerar a escrita em C/C++.Mas existem muitas armadilhas que podem matar o seu desempenho no seu código C++.

(TLDR:Um C++ perito pode criar 'rápido' código como um C# especialista, mas um medíocre C++ programador pode criar mais lento do código de medíocre C# um)

Eu poderia esperar a versão em C# para ser quase tão rápido como o C++, mas com menor consumo de memória.Em alguns casos, o código gerenciado, na verdade, é MUITO mais rápido e utiliza menos memória em comparação com os não otimizado C++.Código do C++ pode ser mais rápido se escrito pelo perito, mas raramente justifica o esforço.

Como uma nota lateral, eu lembro de uma performance de "concorrência" na blogosfera entre Michael Kaplan (c#) e Raymond Chan (C++) escrever um programa, que faz exatamente a mesma coisa.Raymond Chan, que é considerado um dos melhores programadores do mundo (Joel) conseguiu escrever mais rápido do C++, depois de uma longa luta reescrever a maior parte do código.

O servidor proxy que você descrever iria lidar, principalmente, com dados de seqüência de caracteres e eu acho que é razoável para implementar em C#.No seu exemplo,

if header x == y, do z

o mais lento parte pode ser, na verdade, fazendo o que quer que 'z' é, e você vai ter para fazer esse trabalho, independentemente do idioma.

Na minha experiência, o design e a implementação tem muito mais a ver com o desempenho do que fazer a escolha da linguagem/framework (no entanto, as advertências habituais aplicar:por exemplo, não escrever um driver de dispositivo em C# ou java).

Eu não iria pensar duas vezes antes de escrever o tipo de programa que você a descreva em uma linguagem gerenciada (seja Java, C#, etc).Estes dias, os ganhos de desempenho que você começa a partir usando um nível mais baixo de idioma (em termos de proximidade com o hardware) é muitas vezes facilmente compensado pelo tempo de execução de habilidades de um ambiente gerenciado.É claro que isso está vindo de um C#/python / desenvolvedor, então eu não sou exatamente imparcial...

Se você precisa de um rápido e confiável servidor proxy, pode fazer sentido para experimentar alguns dos que já existem.Mas se você tiver personalizado os recursos que são necessários, em seguida, poderá ter de criar a sua própria.Você pode querer coletar mais algumas informações sobre a carga esperada:centenas de usuários podem ser algumas solicitações de um minuto ou centenas de solicitações por segundo.

Supondo que você precisa para servir sob ou ao redor de 200 qps em uma única máquina, o C# pode facilmente satisfazer as suas necessidades, mesmo as línguas conhecido por ser lento (por exemplo,Ruby) pode facilmente bomba de fora algumas centenas de pedidos por segundo.

Além do desempenho, há outras razões para escolher C#, por exemplo,é muito mais fácil escrever de buffer overflows em C++ do C#.

É o servidor http, indo para executar em uma máquina dedicada?Se sim, eu diria que ir com C# se for mais fácil para você.Se você precisa executar outros aplicativos na mesma máquina, você precisará levar em conta o consumo de memória do seu aplicativo e o fato de que a GC será executado em "aleatório" vezes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top