python - 基于真实时间、用户时间和系统时间比较两个不同的进程

标签 python linux node.js time

我已经完成了关于真实时间、用户时间和系统时间的其他答案。在这个问题中,除了理论之外,我有兴趣了解两个不同进程报告的时间的实际含义,以完成相同的任务。

我有一个python程序和一个nodejs程序https://github.com/rnanwani/vips_performance .两者都处理一组输入图像并处理它们以获得不同的输出。两者都使用 libvips 实现。 这是两人的时间

python

真实 1m17.253s
用户 1m54.766s
系统 0m2.988s

NodeJS

真实 1m3.616s
用户 3m25.097s
系统 0m8.494s

NodeJS 的实时时间(根据其他答案的挂钟时间较少,根据我的理解,这意味着从输入到输出的整个过程在 NodeJS 上完成得更快。但是用户和系统时间非常高与 Python 相比。同样使用 htop 实用程序,我看到 NodeJS 进程在整个过程中的 CPU 使用率约为 360%,最大程度地使用了 4 个内核。另一方面,Python 的 CPU 使用率从 250% 到 120%整个过程。

我想了解一些事情

  1. 较小的实时时间和较高的用户+系统时间是否意味着进程(在本例中为 Node )更有效地利用 CPU 来更快地完成任务?
  2. 这些时间的实际含义是什么 - 随着请求数量的增加,哪个更快/更好/会很好地扩展?

最佳答案

我的猜测是 node 一次运行多个 vips 管道,而 python 严格地一个接一个地运行。管道的启动和关闭大多是单线程的,因此如果 Node 同时启动多个管道,它可能会节省一些时间,正如您观察到的那样。

您以随机访问模式加载 JPEG 图像,因此整个图像将使用 libjpeg 解压缩到内存中。这是一个单线程库,因此您永远不会看到 CPU 使用率超过 100%。

接下来,您执行调整大小/旋转/裁剪/jpegsave。跑完这些操作,resize会很好的线程化,CPU负载随着reduction的平方增加,rotate太简单了,对runtime影响不大,crop是即时的。虽然 jpegsave 是单线程的(当然),但 vips 在一个单独的后台线程中运行它,而不是一个后写缓冲区,所以你可以免费获得它。

我在我的台式电脑上试过你的程序(6 个超线程核心,所以 12 个硬件线程)。我明白了:

$ time ./rahul.py indir outdir
clearing output directory - outdir
real    0m2.907s
user    0m9.744s
sys 0m0.784s

看起来我们看到的是 9.7/2.9,或者大约 3.4 倍的线程加速,但这是非常具有误导性的。如果我将 vips 线程池大小设置为 1,您会看到更接近真正的单线程性能(尽管它仍然使用 jpegsave 后写线程):

$ export VIPS_CONCURRENCY=1
$ time ./rahul.py indir outdir
clearing output directory - outdir
real    0m18.160s
user    0m18.364s
sys 0m0.204s

所以我们实际上得到了 18.1/2.97,或 6.1 倍的加速。

基准测试很困难,real/user/sys 很难解释。您需要考虑很多因素:

  • 内核数和硬件线程数
  • SpeedStep 和 TurboBoost 等 CPU 功能,可根据热负载为内核提供时钟频率
  • 程序的哪些部分是单线程的
  • IO 负载
  • 内核调度程序设置

而且我敢肯定还有很多我已经忘记了。

如果您好奇,libvips 有它自己的分析器,可以帮助您更深入地了解运行时行为。它可以向您显示各种工作线程的图表,它们在同步上花费了多长时间,在管理上花费了多长时间,实际处理像素多长时间,分配内存的时间以及最终再次释放内存的时间。这里有一篇关于它的博客文章:

http://libvips.blogspot.co.uk/2013/11/profiling-libvips.html

关于python - 基于真实时间、用户时间和系统时间比较两个不同的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37382402/

相关文章:

c - 我们如何区分控制终端和非控制终端的文件描述符?

c++ - Qt 多线程信号量和条件变量

c - 进程和线程如何选择

javascript - D3.js 未定义,快速提供静态文件

node.js - 匹配 Mongoose 填充中的特定值

python - 如何在 python-django 中水平查看元素

Python: "FOR"循环打印基于行的列字段匹配

javascript - Node.js 子进程 fork : CPU affinity

python - Neo4j 使用 py2neo 从 pandas dataframe 创建节点和关系

python - 在 python Google Cloud Dataflow 中通过 bigquery reader 读取行时出现 AssertError