Производительность C # для прокси-сервера (против C ++) - PullRequest
4 голосов
/ 27 августа 2008

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

Ответы [ 7 ]

4 голосов
/ 27 августа 2008

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

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

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

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

2 голосов
/ 27 августа 2008

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

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

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

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

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

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

1 голос
/ 30 января 2009

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

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

0 голосов
/ 30 января 2009

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

0 голосов
/ 16 сентября 2008

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

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

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

0 голосов
/ 27 августа 2008

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

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

0 голосов
/ 27 августа 2008

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

if header x == y, do z

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...