我意识到这在很大程度上取决于所讨论的过程,但是有经验法则吗?
假设我有一个名为progX
的多线程程序,它提供了一个命令行开关(--cpu
)来控制它可以使用的CPU数量。使用每个CPU(progX --cpu 1
)启动40个并行实例或启动单个实例,告诉它使用40个CPU(progX --cpu 40
)会更快吗?
答案 0 :(得分:2)
在很大程度上取决于操作系统,但通常线程比进程更轻量级(事实上每个进程至少由一个线程组成)所以通过启动一个进程有40个线程你会减少压力(特别是关于系统上的内存消耗。
还要记住,线程与进程在根本上不同,因为它们在共享地址空间上运行。但是,如果你们彼此沟通,这是无关紧要的。
答案 1 :(得分:2)
答案 2 :(得分:1)
最精确的答案是执行一项小任务,并使用各种设置为您的应用程序计时。您可以通过
启动每个M cpus的N个进程#!/bin/bash
M=$1
N=$2
for ((i=0; i<$N; i++)) ; do ( echo $i && time progX --cpu $M & ) ; done
重要的时间是打印的最后一个(所有进程应该或多或少同时并行)。
答案 3 :(得分:1)
一般规则是:在您的任务之间没有任何关系,多进程版本的性能将倾向于多线程版本(某些OS实现具有进程的线程,因此性能将严格等效)。
您需要支付更多费用来初始化您的流程,特别是如果您正在使用某些托管环境(例如Java或.Net),但是这些初始启动费用会随着时间的推移而变得微不足道。
因此,如果您的任务很小,差异可能会很大,但如果您在几小时内完成任务,则可以忽略不计。
当您的线程之间存在某些交互时,事情变得有趣:
共享数据:在流程之间共享内存比线程之间更复杂,成本更高
同步:同步过程过于繁琐,尤其是如果您可以使用语言构造进行透明线程同步
性能不适合多进程,但还有其他很好的理由可以使用它,如可靠性:如果你使用某些组件可能会破坏并崩溃进程,如果你有一个多线程应用程序失败将导致丢失所有任务,而使用多进程应用程序时,只有一个失败。