python - C 或 Python 用于创建套接字连接的性能和可伸缩性?

标签 python c performance sockets scalability

<分区>

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

我的任务是创建一个可以基于套接字创建数千个连接的应用程序。我可以在 Python 中执行此操作,但我希望有性能改进的空间。由于我过去的项目,我知道这在 Python 中是可能的,但我很好奇如果我用 C(而不是 C++)来做这个项目会有多少性能改进?

最佳答案

这实际上取决于您对套接字的处理方式。

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

创建和连接套接字所花费的时间开销是最小的,读取和写入也不会差很多。但这并不重要,无论如何,这几乎从来没有花费任何重要的时间。

适用于 Python 的 react 器和前摄器与适用于 C 的通用 react 器和前摄器一样好(并且一半的 C 库具有 Python 绑定(bind))。如果您在套接字之外没有做太多重要的工作,那么这通常是您的主要瓶颈。如果你有一个非常具体的使用模式和/或非常严格指定的硬件,你可能能够编写一个自定义的 react 器或前摄器来击败任何通用的东西。在那种情况下,您几乎必须使用 C,而不是 Python。

但通常,除了操纵套接字之外,您还有大量工作要做。

如果这项工作大部分是独立的并且高度可并行化,那么 C 显然胜过 Python(因为 GIL),除非这些工作足够繁重以至于您可以对它们进行多处理(请记住“足够繁重”可以很漂亮在 Windows 平台上很重)。当然,除了编写多线程 C 代码非常容易搞砸性能(更不用说稳定性)之外;实际上,与 C 或 Python 相比,Erlang 或 Haskell 之类的东西在这里可能是更好的选择。 (如果你要说,“但我们有一些人在 C 方面有经验,但他们不会学习 Haskell”,那么这些人可能不够优秀,无法编写多线程代码。)

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

但是,如果它主要是典型的事情,例如在磁盘上等待或序列化计算,那么您如何编写套接字内容几乎无关紧要,因为它最终将等待真正的代码。

因此,在没有任何更多信息的情况下,我会选择 Python,因为与 C 相比,您节省的启动、运行和调试时间可以用于优化或改进任何重要的事情。

关于python - C 或 Python 用于创建套接字连接的性能和可伸缩性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521751/

相关文章:

c - 如何检查 `malloc.h` 在 C 中是否可用?

c - 指针如何在 C 中工作 "under the hood"?

java - 如何将特定 JRE 版本设置为 JBoss 上运行的 Java 应用程序的默认版本

c++ - 性能问题 C++ - 搜索数组

sql - 数据库(最大)字段长度会影响性能吗?

python - 如何安装带有诗歌的 python 包?

python - 获取一个基类的所有子类作为基类的class属性

python - 将 .lua 表转换为 python 字典

Python:在切换键和值时创建新字典

php - 为什么 PHP 浮点除法和 POW 会给出错误的结果和意想不到的结果?