Производительность C# для прокси-сервера (по сравнению с C++)

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


person NotDan    schedule 27.08.2008    source источник


Ответы (7)


Вы можете использовать небезопасный код C# и указатели в критических узких местах, чтобы ускорить его работу. Они ведут себя так же, как код C++, и я считаю, что он выполняется так же быстро.

Но в большинстве случаев C# уже JIT-ориентирован на сверхбыстрый, я не думаю, что будут большие различия, как с тем, что все говорили.

Но есть одна вещь, которую вы, возможно, захотите принять во внимание: Операции со строками в управляемом коде (C#) выполняются довольно медленно по сравнению с эффективным использованием указателей в C++. С указателями C++ существует больше приемов оптимизации, чем со строками CLR.

Я думаю, что я сделал некоторые тесты раньше, но не могу вспомнить, где я их поместил.

person chakrit    schedule 27.08.2008

Почему вы ожидаете гораздо более высокой производительности от приложения C++?

При правильном выполнении приложения на C# не возникает присущего ему замедления. (не слишком много отброшенных ссылок, частое создание/удаление объекта за вызов и т. д.)

Единственный случай, когда приложение C++ действительно превосходит эквивалентное приложение C#, — это когда вы можете выполнять операции (очень) низкого уровня. Например. приведение необработанных указателей памяти, встроенный ассемблер и т. д.

Компилятор C++ может лучше создавать быстрый код, но в большинстве приложений он тратится впустую. Если у вас действительно есть часть вашего приложения, которая должна быть невероятно быстрой, попробуйте написать вызов C для этой горячей точки.

Только если большая часть системы работает слишком медленно, вам следует подумать о написании ее на C/C++. Но есть много подводных камней, которые могут снизить вашу производительность в коде C++.

(TLDR: эксперт по C++ может создавать «более быстрый» код, как эксперт по C#, но посредственный программист на C++ может создавать более медленный код, чем посредственный программист на C#)

person Christopher    schedule 27.08.2008

Я ожидаю, что версия C# будет почти такой же быстрой, как версия C++, но с меньшим объемом памяти. В некоторых случаях управляемый код на самом деле НАМНОГО быстрее и использует меньше памяти по сравнению с неоптимизированным C++. Код C++ может быть быстрее, если написан экспертом, но он редко оправдывает усилия.

В качестве примечания я могу вспомнить «соревнование» производительности в блогосфере между Майклом Капланом (C#) и Рэймондом Ченом (C++) за написание программы, которая делает то же самое. Рэймонду Чану, который считается одним из лучших программистов в мире (Джоэл), удалось написать более быстрый C++ после долгой борьбы с переписыванием большей части кода.

person devdimi    schedule 30.01.2009

Прокси-сервер, который вы описываете, будет иметь дело в основном со строковыми данными, и я думаю, что его разумно реализовать на С#. В вашем примере

if header x == y, do z

самая медленная часть может на самом деле делать то, что есть «z», и вам придется выполнять эту работу независимо от языка.

person Brian Ensink    schedule 27.08.2008

По моему опыту, дизайн и реализация гораздо больше связаны с производительностью, чем с выбором языка/фреймворка (однако применяются обычные предостережения: например, не пишите драйвер устройства на C# или java).

Я бы не стал дважды думать о написании описанной вами программы на управляемом языке (будь то Java, C# и т. д.). В наши дни прирост производительности, который вы получаете от использования языка более низкого уровня (с точки зрения близости к оборудованию), часто легко компенсируется возможностями управляемой среды во время выполнения. Конечно, это исходит от разработчика С#/python, поэтому я не совсем беспристрастен...

person akmad    schedule 27.08.2008

Если вам нужен быстрый и надежный прокси-сервер, возможно, имеет смысл попробовать некоторые из уже существующих. Но если у вас есть пользовательские функции, которые необходимы, вам, возможно, придется создать свои собственные. Возможно, вы захотите собрать дополнительную информацию об ожидаемой нагрузке: сотни пользователей могут иметь несколько запросов в минуту или сотню запросов в секунду.

Предполагая, что вам нужно обслуживать менее или около 200 запросов в секунду на одной машине, C# должен легко удовлетворить ваши потребности — даже языки, известные своей медленностью (например, Ruby), могут легко выдавать несколько сотен запросов в секунду.

Помимо производительности, есть и другие причины для выбора C#, например. гораздо проще написать переполнение буфера на C++, чем на C#.

person 0124816    schedule 16.09.2008

Будет ли ваш http-сервер работать на выделенной машине? Если да, я бы сказал, перейдите на С#, если вам это проще. Если вам нужно запускать другие приложения на том же компьютере, вам необходимо принять во внимание объем памяти вашего приложения и тот факт, что GC будет запускаться в «случайное» время.

person Nemanja Trifunovic    schedule 30.01.2009