Я хочу создать простой прокси-сервер http, который выполняет очень простую обработку заголовков http (т.е. если заголовок x == y, выполните z). Возможно, серверу потребуется поддерживать сотни пользователей. Я могу написать сервер на C# (довольно просто) или на C++ (намного сложнее). Однако будет ли версия C# иметь такую же производительность, как версия C++? Если нет, будет ли разница в производительности достаточно большой, чтобы не было смысла писать ее на C#?





Описанный вами прокси-сервер будет иметь дело в основном со строковыми данными, и я думаю, что его разумно реализовать на C#. В вашем примере
if header x == y, do z
самая медленная часть может на самом деле делать то, что есть 'z', и вам придется выполнять эту работу независимо от языка.
Почему вы ожидаете гораздо более высокой производительности от приложения C++?
Когда вы все делаете правильно, приложение C# не замедляет работу. (не слишком много отброшенных ссылок, частое создание / удаление объекта за вызов и т. д.)
Единственный раз, когда приложение C++ действительно превосходит эквивалентное приложение C#, - это когда вы можете выполнять (очень) низкоуровневые операции. Например. приведение указателей на исходную память, встроенного ассемблера и т. д.
Компилятор C++ может лучше создавать быстрый код, но в большинстве приложений он тратится впустую. Если у вас действительно есть часть вашего приложения, которая должна быть невероятно быстрой, попробуйте написать вызов C для этой горячей точки.
Только если большая часть системы ведет себя слишком медленно, вам следует подумать о написании ее на C / C++. Но есть много подводных камней, которые могут убить вашу производительность в вашем коде C++.
(TL; DR: эксперт C++ может создавать «более быстрый» код как эксперт C#, но посредственный программист на C++ может создавать более медленный код, чем посредственный C#)
По моему опыту, дизайн и реализация гораздо больше связаны с производительностью, чем с выбором языка / фреймворка (однако применяются обычные предостережения: например, не пишите драйвер устройства на C# или java).
Я бы не стал дважды думать о написании описываемой вами программы на управляемом языке (будь то Java, C# и т. д.). В наши дни прирост производительности, который вы получаете от использования языка более низкого уровня (с точки зрения близости к оборудованию), часто легко компенсируется возможностями управляемой среды во время выполнения. Конечно, это исходит от разработчика C# / python, поэтому я не совсем беспристрастен ...
Вы можете использовать код C# небезопасно и указатели в критических узких местах, чтобы заставить его работать быстрее. Они ведут себя так же, как код C++, и я считаю, что он выполняет настолько быстро.
Но в большинстве случаев C# уже настроен на сверхбыстрый JIT, я не верю, что будет много отличий от того, что все говорят.
Но вы можете подумать об одном: Строковые операции управляемого кода (C#) выполняются довольно медленно по сравнению с эффективным использованием указателей в C++. С указателями C++ существует больше приемов оптимизации, чем со строками CLR.
Я думаю, что уже проводил несколько тестов, но не могу вспомнить, где я их поставил.
Если вам нужен быстрый и надежный прокси-сервер, имеет смысл попробовать некоторые из уже существующих. Но если у вас есть необходимые настраиваемые функции, возможно, вам придется создать свои собственные. Возможно, вы захотите собрать дополнительную информацию об ожидаемой нагрузке: сотни пользователей могут делать несколько запросов в минуту или сотню запросов в секунду.
Предполагая, что вам нужно обслуживать менее или около 200 запросов в секунду на одной машине, C# должен легко удовлетворить ваши потребности - даже языки, известные своей медлительностью (например, Ruby), могут легко перекачивать несколько сотен запросов в секунду.
Помимо производительности, есть и другие причины выбрать C#, например На C++ гораздо проще писать о переполнении буфера, чем на C#.
Я ожидал, что версия C# будет почти такой же быстрой, как версия C++, но с меньшим объемом памяти. В некоторых случаях управляемый код на самом деле намного быстрее и использует меньше памяти по сравнению с неоптимизированным C++. Код C++ может быть быстрее, если он написан экспертом, но он редко оправдывает усилия.
В качестве примечания я могу вспомнить «соревнование» производительности в блогосфере между Майклом Капланом (C#) и Раймондом Чаном (C++) за написание программы, которая делает то же самое. Раймонду Чану, который считается одним из лучших программистов в мире (Джоэл), удалось написать более быстрый C++ после долгой борьбы за переписывание большей части кода.
Будет ли ваш http-сервер работать на выделенной машине? Если да, я бы посоветовал перейти на C#, если вам так удобнее. Если вам нужно запускать другие приложения на том же компьютере, вам необходимо принять во внимание объем памяти, занимаемый вашим приложением, и тот факт, что сборщик мусора будет запускаться в «случайное» время.