4

我想创建一个简单的http 代理服务器,它对http 标头进行一些非常基本的处理(即,如果标头x == y,则执行z)。服务器可能需要支持数百个用户。我可以用 C#(很容易)或 C++(更难)编写服务器。但是,C# 版本的性能是否与 C++ 版本一样好?如果不是,性能差异是否足够大以至于用 C# 编写它没有意义?

4

7 回答 7

4

您可以在关键瓶颈点使用不安全的C# 代码和指针,以使其运行得更快。那些行为很像 C++ 代码,我相信它的执行速度一样快

但大多数时候,C# 已经是 JIT-ted 到 uber-fast 了,我相信不会像大家所说的那样有太大的不同。

但是您可能要考虑的一件事是:与在 C++ 中有效使用指针相比,托管代码 (C#) 字符串操作相当慢。与 CLR 字符串相比,C++ 指针的优化技巧更多。

我想我以前做过一些基准测试,但不记得我把它们放在哪里了。

于 2008-08-27T18:12:53.773 回答
2

为什么您期望 C++ 应用程序具有更高的性能?

当您正确执行时,C# 应用程序不会增加固有的减速。(没有太多丢弃的引用,每次调用频繁创建/丢弃对象等)

只有当您可以执行(非常)低级操作时,C++ 应用程序才能真正胜过等效的 C# 应用程序。例如铸造原始内存指针、内联汇编器等。

C++ 编译器可能更擅长创建快速代码,但大多数情况下这在大多数应用程序中都被浪费了。如果您的应用程序确实有一部分必须非常快,请尝试为该热点编写 C 调用。

只有当大多数系统运行速度太慢时,您才应该考虑用 C/C++ 编写它。但是有许多陷阱可能会影响您在 C++ 代码中的性能。

(TLDR:C++ 专家可以像 C# 专家一样创建“更快”的代码,但平庸的 C++ 程序员可能会创建比平庸的 C# 更慢的代码)

于 2008-08-27T18:10:58.070 回答
1

我希望 C# 版本几乎与 C++ 版本一样快,但内存占用更小。在某些情况下,与未优化的 C++ 相比,托管代码实际上要快很多并且使用更少的内存。如果由专家编写,C++ 代码可以更快,但它很少证明努力是合理的。

作为旁注,我可以回忆起在博客圈中 Michael Kaplan (c#) 和 Raymond Chan (C++) 之间的性能“竞争”,以编写一个程序,它的作用完全相同。Raymond Chan 被认为是世界上最好的程序员之一 (Joel),经过长期努力重写大部分代码后,他成功地编写了更快的 C++。

于 2009-01-30T17:53:33.800 回答
0

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

if header x == y, do z

最慢的部分实际上可能是在做任何“z”,无论语言如何,你都必须做这项工作。

于 2008-08-27T18:10:43.873 回答
0

根据我的经验,设计和实现与性能的关系比语言/框架的选择更多(但是,通常需要注意:例如,不要用 C# 或 java 编写设备驱动程序)。

对于用托管语言(Java、C# 等)编写您描述的程序类型,我不会三思而后行。如今,您从使用较低级别的语言(就与硬件的接近程度而言)获得的性能提升通常很容易被托管环境的运行时能力所抵消。当然,这是来自 C#/python 开发人员,所以我并不是完全没有偏见......

于 2008-08-27T18:11:20.267 回答
0

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

假设您需要在一台机器上提供低于或大约 200 qps 的服务,C# 应该很容易满足您的需求——即使以速度慢而著称的语言(例如 Ruby)也可以轻松地每秒发出几百个请求。

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

于 2008-09-16T10:05:15.463 回答
0

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

于 2009-01-30T18:29:36.397 回答