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

有帮助吗?

解决方案

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

但大多数时候,C# 已经通过 JIT 实现了超快,我不相信会像大家所说的那样有太大差异。

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

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

其他提示

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

当您做得正确时,C# 应用程序不会增加固有的速度减慢。(不要太多删除的引用、每次调用频繁创建/删除对象等)

C++ 应用程序真正优于同等 C# 应用程序的唯一时间是当您可以执行(非常)低级操作时。例如。转换原始内存指针、内联汇编器等。

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

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

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

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

附带说明一下,我记得 Michael Kaplan (c#) 和 Raymond Chan (C++) 在博客圈中进行过一次性能“竞赛”,目的是编写一个程序,该程序执行完全相同的操作。Raymond Chan 被认为是世界上最好的程序员之一(Joel),经过长期努力重写大部分代码后,成功编写了更快的 C++。

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

if header x == y, do z

最慢的部分实际上可能是在执行“z”是什么,无论使用哪种语言,您都必须完成这项工作。

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

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

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

假设您需要在单台机器上提供低于或大约 200 qps 的服务,C# 应该可以轻松满足您的需求 - 即使是已知速度慢的语言(例如Ruby)每秒可以轻松发出数百个请求。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top