2010-07-31 57 views
9

几年前,在Windows环境中,我做了一些测试,让CPU计算密集型+内存访问密集型+ I/O访问密集型应用程序运行多个实例。我开发了两个版本:一个在多处理下运行,另一个在多线程下运行。多线程和多进程的性能差异

我发现多处理的性能要好得多。我读过其他地方(但我不记得该网站)。

其中规定,原因是在多线程,他们是“打”为一个单一的存储管道和I/O管道,相较于多处理

但是这使得性能差,我找不到那篇文章了。我想知道,直到今天,下面的情况是否仍然如此?

在Windows中,具有多处理下的算法 代码运行,有一个高 机会,表现会比 多线程更好。

回答

5

这取决于有多少不同的线程或进程(我将使用通用术语“任务”对他们俩的),需要沟通,特别是通过共享内存:这很容易,廉价和快速的线程,但并不是所有的流程,所以,如果有很多事情正在进行,我敢打赌流程的表现是,而不是打败线程。

而且,过程(特别是在Windows上)是“重”上手,所以如果有很多的“任务启动”出现,再一次线程可以在性能方面轻松击败过程。接下来,你可以让CPU拥有“超线程”,它可以非常快速地在内核上运行(至少)两个线程 - 但不是进程(因为“超线程”线程不能使用不同的地址空间) - 线程可以赢得性能的另一种情况。

如果这些考虑都不适用,那么比赛无论如何都不应该比平局更好。

1

我不确定报价甚至意味着什么。这非常接近废话。

进程内线程共享的主要内容是虚拟内存地址空间。

0

我不相信这是真的。一般来说,多线程应用程序的运行速度要比Windows下多个进程设计的应用程序快。有多种原因可以说明你的测试在多进程情况下可能表现更好。

首先想到的是虚假分享。在您的多线程测试中,这些线程可能会不经意地共享缓存线。当不同的线程访问物理接近的不同内存位置(几个字节内)时会发生这种情况。这导致两个CPU连续在同一缓存线上竞争,并且这严重地降低了性能。这在多进程情况下不会发生,因为进程有完全独立的地址空间。

+0

只是因为虚拟地址空间是沙盒,并不能告诉你他们在物理内存中的布局。这取决于VirtualAlloc(或其他)请求的大小以及进程/线程是否在所述块的边界附近进行加载存储操作。 – 2010-07-31 03:30:43

-2

我发现这也是如此。但我认为这与调度有关。因为如果你足够长的运行时间,多进程就像多线程一样快。这个数字大概是10秒。如果算法需要运行10秒。多进程与多线程一样快。但是如果它只需要运行少于1秒。多进程比多线程快得多,速度要快得多。