代理服务器的C#性能(vs C ++)
我想创建一个简单的http代理服务器,该服务器对http标头进行一些非常基本的处理(即如果标头x == y,请执行z)。服务器可能需要支持数百个用户。我可以用C(非常容易)或者c ++(难得多)来编写服务器。但是,Cversion是否具有与C ++版本一样好的性能?如果不是,那么性能差异是否足够大,以至于用C#编写它就没有意义了?
解决方案
回答
我们描述的代理服务器将主要处理字符串数据,我认为在C#中实现它是合理的。在示例中
if header x == y, do z
最慢的部分实际上可能在执行" z",无论语言如何,我们都必须执行该工作。
回答
我们为什么期望C ++应用程序具有更高的性能?
正确执行操作时,C应用程序不会增加任何固有的速度降低。 (没有太多丢弃的引用,频繁的对象创建/每次调用丢弃等)
只有当我们可以执行(非常)低级操作时,C ++应用程序才能真正胜过等效的C应用程序。例如。转换原始内存指针,内联汇编程序等。
C ++编译器在创建快速代码方面可能会更好,但是大多数情况下,这在大多数应用程序中都是浪费的。如果我们确实有一部分应用程序必须非常快,那么请尝试为该热点编写C调用。
仅当大多数系统的运行速度过慢时,才应考虑使用C / C ++编写它。但是有很多陷阱可能会破坏C ++代码的性能。
(TLDR:C ++专家可以像Cexpert一样创建"更快"的代码,但是平庸的C ++程序员所创建的代码可能比平庸的Cone慢)
回答
以我的经验,设计和实现与性能的关系比语言/框架的选择要重要得多(但是,通常需要注意的是:例如,不要在Cor Java中编写设备驱动程序)。
对于使用托管语言(例如Java,C#等)描述的程序类型,我不会三思而后行。如今,使用低级语言(从与硬件的紧密性方面)获得的性能提升通常很容易被托管环境的运行时能力所抵消。当然,这是来自C#/ python开发人员的,所以我并不是没有偏见。
回答
我们可以在关键瓶颈点使用不安全的Ccode和指针,以使其运行更快。它们的行为很像C ++代码,我相信它的执行速度也一样快。
但是在大多数情况下,Cis JIT都非常快,我不相信每个人都说过会有多少差异。
但是我们可能要考虑的一件事是:与在C ++中有效使用指针相比,托管代码(C#)字符串操作相当慢。使用C ++指针比使用CLR字符串有更多的优化技巧。
我想我以前做过一些基准测试,但不记得我把它们放在哪里了。
回答
如果我们需要快速且可靠的代理服务器,则可以尝试一些已经存在的代理服务器。但是,如果我们具有必需的自定义功能,则可能必须构建自己的功能。我们可能希望收集有关预期负载的更多信息:数百个用户可能是一分钟几个请求,或者每秒一百个请求。
假设我们在一台机器上需要以200 qps左右的速度运行,那么C应该可以轻松满足需求-即使以慢速运行而闻名的语言(例如Ruby)也可以轻松地每秒发出数百个请求。
除了性能外,还有其他选择C#的原因,例如与C#相比,用C ++编写缓冲区溢出要容易得多。
回答
我希望Cversion与C ++几乎一样快,但占用的内存更少。
在某些情况下,与未优化的C ++相比,托管代码实际上快很多,并且使用的内存更少。如果由专家编写,C ++代码可能会更快,但很少能证明这样做的合理性。
附带说明一下,我可以回想起在Michael Kaplan(c#)和Raymond Chan(C ++)之间的博客圈中的性能"竞争",它编写的程序完全相同。经过长时间的努力重写了大部分代码之后,被认为是世界上最好的程序员之一(乔尔)的Raymond Chan成功地编写了更快的C ++。
回答
http服务器要在专用计算机上运行吗?如果是的话,我想说Cif对我们来说更容易。如果需要在同一台计算机上运行其他应用程序,则需要考虑应用程序的内存占用以及GC将在"随机"时间运行的事实。