代理服务器的 C# 性能(与 C++ 相比)
Posted
技术标签:
【中文标题】代理服务器的 C# 性能(与 C++ 相比)【英文标题】:C# Performance For Proxy Server (vs C++) 【发布时间】:2010-09-07 00:58:46 【问题描述】:我想创建一个简单的 http 代理服务器,它对 http 标头进行一些非常基本的处理(即,如果标头 x == y,则执行 z)。服务器可能需要支持数百个用户。我可以用 C#(很容易)或 C++(更难)编写服务器。但是,C# 版本的性能是否与 C++ 版本一样好?如果不是,性能上的差异是否会大到用 C# 编写它没有意义?
【问题讨论】:
【参考方案1】:您可以在关键瓶颈点使用不安全 C# 代码和指针,使其运行得更快。这些行为很像 C++ 代码,我相信它的执行速度一样快。
但大多数时候,C# 已经是 JIT-ted 到 uber-fast,我相信不会像大家所说的那样有太大的不同。
但您可能需要考虑的一件事是:与在 C++ 中有效使用指针相比,托管代码 (C#) 字符串操作相当慢。 与 CLR 字符串相比,使用 C++ 指针的优化技巧更多.
我想我以前做过一些基准测试,但不记得我把它们放在哪里了。
【讨论】:
【参考方案2】:您为什么期望 C++ 应用程序具有更高的性能?
如果你做得对,C# 应用程序不会增加固有的减速。 (没有太多丢弃的引用,每次调用频繁创建/丢弃对象等)
C++ 应用程序真正优于等效 C# 应用程序的唯一情况是您可以执行(非常)低级操作。例如。转换原始内存指针、内联汇编器等。
C++ 编译器可能更擅长创建快速代码,但大多数情况下这在大多数应用程序中都被浪费了。如果您的应用程序确实有一部分必须非常快,请尝试为该热点编写 C 调用。
只有当大部分系统运行速度太慢时,您才应该考虑用 C/C++ 编写它。但是有许多陷阱可能会影响您在 C++ 代码中的性能。
(TLDR:C++ 专家可以像 C# 专家一样创建“更快”的代码,但平庸的 C++ 程序员可能会创建比平庸的 C# 更慢的代码)
【讨论】:
【参考方案3】:我希望 C# 版本几乎与 C++ 版本一样快,但内存占用更小。 在某些情况下,与未优化的 C++ 相比,托管代码实际上要快很多并且使用更少的内存。如果由专家编写 C++ 代码可以更快,但它很少证明努力是合理的。
作为旁注,我记得在博客圈中,Michael Kaplan (c#) 和 Raymond Chan (C++) 之间的一场表演“比赛”是为了编写一个程序,它的作用完全相同。 Raymond Chan 被认为是世界上最好的程序员之一 (Joel),经过长期努力重写大部分代码后,他成功地编写了更快的 C++。
【讨论】:
【参考方案4】:您描述的代理服务器主要处理字符串数据,我认为在 C# 中实现它是合理的。在你的例子中,
if header x == y, do z
最慢的部分实际上可能是在做任何 'z' 的工作,无论语言如何,您都必须做这项工作。
【讨论】:
【参考方案5】:根据我的经验,设计和实现与性能的关系比语言/框架的选择更多(但是,通常需要注意:例如,不要用 C# 或 java 编写设备驱动程序)。
对于用托管语言(Java、C# 等)编写您描述的程序类型,我不会三思而后行。如今,您从使用较低级别的语言(就与硬件的接近程度而言)获得的性能提升通常很容易被托管环境的运行时能力所抵消。当然,这是来自 C#/python 开发人员,所以我并不完全公正......
【讨论】:
【参考方案6】:如果您需要一个快速可靠的代理服务器,尝试一些已经存在的代理服务器可能是有意义的。但是,如果您有所需的自定义功能,那么您可能必须构建自己的功能。您可能希望收集有关预期负载的更多信息:数百个用户可能是每分钟几个请求或每秒一百个请求。
假设您需要在单台机器上提供低于或大约 200 qps 的服务,C# 应该可以轻松满足您的需求 - 即使以速度慢而著称的语言(例如 Ruby)也可以轻松地每秒发出几百个请求。
除了性能之外,还有其他选择 C# 的原因,例如在 C++ 中编写缓冲区溢出比在 C# 中容易得多。
【讨论】:
【参考方案7】:您的 http 服务器会在专用机器上运行吗?如果是的话,如果对你来说更容易的话,我会说选择 C#。如果您需要在同一台机器上运行其他应用程序,则需要考虑应用程序的内存占用以及 GC 将在“随机”时间运行的事实。
【讨论】:
以上是关于代理服务器的 C# 性能(与 C++ 相比)的主要内容,如果未能解决你的问题,请参考以下文章