2015-05-13 72 views
0

所以我一直在玩Java的线程,我做了一个测试。我制作了一个大约10^9的乘法程序,然后输出所需的毫秒数。Java多线程性能

程序有2种模式,其中一种不打印任何东西,但只需要几毫秒。然而,其他模式每打印一个数字就会打印出“完成”。

第一种模式的结果是好的1线程我得到了8270毫秒的结果,当我使用8个线程时,我得到了2237毫秒(我正在测试一个8核心计算机)的结果。

在第二种模式下,1线程的结果为94 054毫秒,8线程的结果为96 430毫秒。

我的问题是为什么在第二种模式下,使用8个线程的性能比使用1更好?我猜这是因为你不能在终端同时打印两件东西,所以有一个阙,这就是原因,但这只是一个猜测。

+0

打印/写入'System.out'会被同步并阻塞直到完成。在生产环境中,输出* anything *到'System.out'是不被接受的。 – GiantTree

回答

2

这类问题的关键分析工具是Amdahl's Law,它基于严格串行工作的分数为并行性提供了加速上限。如果n为线程使用n个线程的数目,B的工作的一小部分即严格序号和T(n)的时间:

T(n) = T(1)(B + (1-B)/n) 

假设大部分的增幅在时间从将输出是串行,我们有B约0.9。

T(8) = 94054(0.9 + 0.1/8) 
    = 85824.275 

这是时间的下限。在实践中,8个线程为了同一个锁而互相绊倒可以浪费与烹饪一个盘子的同一小厨房中的8个厨师相同的时间。

2

我猜这是因为你不能在终端同时打印2件东西,所以有一个阙,这就是原因,但这只是一个猜测。

是。我不知道具体情况,这取决于你如何打印(system.out.println与日志库等),但无论你在做什么,代码都需要确保两个线程不写同时或输出会变得乱码。所以必须使用某种互斥,阻塞队列等。这意味着当你添加更多的线程时,你不会增加更多的并行性(因为它们都阻塞在同一个互斥体上),但是你增加了更多的锁争用,所以更多的线程==更慢。