2008-08-27 3 views
3

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

ответ

3

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

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

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

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

0

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

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

2

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

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

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

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

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

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

0

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

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

0

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

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

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

1

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

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

0

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

Смежные вопросы