C或Python在创建套接字连接时的性能和可伸缩性?

2 c python sockets performance scalability

我确实看到了这篇文章,但它没有回答我的问题:C/Python Socket Performance?

我的任务是创建一个可以基于套接字创建数千个连接的应用程序.我可以用Python做到这一点,但我希望有改进性能的空间.我知道在Python中我可以使用过去的项目,但是我很好奇如果我用C(而不是C++)做这个项目会有多大的性能提升?

aba*_*ert 5

这真的取决于你使用套接字做什么.

最好的通用答案是:通常Python足够好,无关紧要,但有时并非如此.

创建和连接套接字所花费的时间很少,阅读和写入也不会太差.但这并不重要,无论如何,这几乎不会花费任何重要的时间.

Python的反应器和反应器与C可用的通用器件一样好(并且有一半的C库具有Python绑定).如果你在插座之外没有做太多重要的工作,这通常是你的主要瓶颈.如果您有一个非常具体的使用模式和/或非常严格指定的硬件,您可能能够编写一个自定义反应器或proactor来击败任何通用目的.在这种情况下,你几乎不得不使用C,而不是Python.

但通常情况下,除了操纵套接字之外,还有很多工作要做.

如果这项工作大多是独立的并且可高度并行化,那么C显然胜过Python(因为GIL),除非作业足够重,你可以对它们进行多处理(并且请记住,在Windows上"足够重"可能非常重要平台).当然,除了编写多线程C代码的性能(更不用说稳定性)非常容易之外; 实际上,像Erlang或Haskell这样的东西可能比C或Python更好.(如果你要说,"但是我们有经验丰富的人但是他们无法学习Haskell",那么这些人可能不是编写多线程代码的程序员.)

如果这项工作主要是在套接字缓冲区之间进行内存复制,并且您可以处理一个严格指定的系统,那么您可以编写优化零拷贝的C代码,并且在Python中无法做到这一点.

但是,如果它主要是典型的东西,比如等待磁盘或序列化计算,那么你编写套接字的方式几乎不重要,因为它最终会等待真正的代码.

因此,在没有任何更多信息的情况下,我会使用Python,因为您节省了启动和运行以及调试C与C的时间可以用于优化或以其他方式改进无关紧要的事情.