C#代理服务器性能(与C++相比)

4

我想创建一个简单的HTTP代理服务器,对HTTP头部进行一些基本处理(例如,如果头部x == y,则执行z)。该服务器可能需要支持数百个用户。我可以使用C#(相当容易)或C++(更难)编写服务器。然而,C#版本的性能是否与C++版本一样好?如果不是,性能差异是否足够大,使得使用C#编写它没有意义?

7个回答

4
你可以在关键瓶颈点使用不安全的C#代码和指针使其运行更快。这些行为很像C++代码,我相信它的执行速度是一样快的。
但大多数情况下,C#已经被JIT编译得非常快了,我不认为会有太大的差异,正如每个人所说的那样。
但你可能需要考虑一件事:与使用C++中的指针有效地操作相比,托管代码(C#)的字符串操作相当缓慢。使用C++指针比CLR字符串具有更多的优化技巧。
我想我以前做过一些基准测试,但不记得我把它们放在哪里了。

2

你为什么期望C++应用程序有更高的性能表现?

如果你正确使用 C# 应用程序,它不会引入任何本质的减速。例如:(不要丢弃太多引用、每次调用经常创建和释放对象等)

C++ 应用程序真正优于等效的 C# 应用程序的唯一时候是可以进行非常低级别的操作。例如:转换原始内存指针、内联汇编等操作。

C++ 编译器可能更擅长创建快速代码,但在大多数应用程序中这是浪费的。如果你确实有一个必须变得非常快速的应用程序部分,请尝试为该热点编写一个 C 函数。

只有当大多数系统表现过慢时,您才应考虑使用 C/C++ 进行编写。但是,在你的 C++ 代码中,有许多可能会使性能下降的陷阱。

(简而言之:C++ 专家可以比 C# 专家创建出更快的代码,但普通的 C++ 程序员也可能比普通的 C# 程序员创造出更慢的代码)


1

我预计C#版本的速度几乎与C++版本相同,但内存占用更小。 在某些情况下,托管代码实际上比未经优化的C++代码更快,并且使用的内存更少。如果由专家编写,C++代码可能会更快,但很少有人愿意付出这种努力。

顺便说一句,我记得在博客圈中曾经有一个性能“竞赛” ,Michael Kaplan(C#)和Raymond Chan(C++)编写了一个完全相同的程序。被认为是世界上最好的程序员之一的Raymond Chan(Joel)在长时间的重写大部分代码后成功地编写了更快的C++版本。


0

你的http服务器将在专用机器上运行吗?如果是,我建议你选择C#,如果这对你来说更容易的话。如果你需要在同一台机器上运行其他应用程序,你需要考虑你的应用程序的内存占用和GC将在“随机”时间运行的事实。


0

你所描述的代理服务器主要处理字符串数据,我认为用C#实现是合理的。在你的例子中,

if header x == y, do z

最慢的部分可能实际上是执行“z”所需的工作,而无论使用哪种语言,您都必须完成该工作。


0
在我的经验中,设计和实现与性能的关系比语言/框架的选择更为重要(然而,通常的警告适用:例如,不要使用C#或Java编写设备驱动程序)。
对于您所描述的类型的程序,我不会犹豫地使用托管语言(无论是Java、C#等)。如今,使用低级语言(就接近硬件而言)获得的性能提升往往可以轻松抵消托管环境的运行时能力。当然,这是来自一个C#/Python开发人员的观点,所以我并不完全客观……

0

如果你需要一个快速可靠的代理服务器,那么尝试一些已经存在的可能是有意义的。但是,如果您需要自定义功能,则可能必须构建自己的代理服务器。您可能希望收集更多有关预期负载的信息:数百个用户可能是每分钟几个请求或每秒钟一百个请求。

假设您需要在单台机器上提供不到200个QPS的服务,那么C#应该可以轻松满足您的需求--即使是著名缓慢的语言(例如Ruby)也可以轻松地输出几百个请求每秒。

除了性能之外,还有其他选择C#的原因,例如,在C++中编写缓冲区溢出要比C#容易得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接