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

StackOverflow https://stackoverflow.com/questions/30729

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

if header x == y, do z

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top