2017-09-15 67 views
-2

我想对多线程函数进行性能测试,结果显示单线程函数的运行速度更快,这是我的代码。hello world如何在没有线程的情况下工作得更快

package jollyDay; 

public class JollyDay implements Runnable 
{ 
    public void run() { 
      System.out.println("Hello from a thread!"); 
     } 

     public static void main(String args[]) 
     { 
      int i=0; 
      while(true) 
      // {new JollyDay().run();i++;System.out.println(i);} 
      {(new Thread(new JollyDay())).start();i++;System.out.println(i);} 
     } 

} 

在螺纹函数,i是等于150000但在功能,而不螺纹i被等于400000在10秒那么为什么螺纹较慢,不应该它更快?

。我的CPU有8个线程

+1

产生新的线程有性能上的开销 - 使用它们,这样一个小任务将意味着大部分工作是在开销中完成的,而不是在实际的代码中完成。此外,通过生成无限数量的线程,您将使操作系统难以调度线程(更多开销)。当只使用一个线程时,您也不会经历很多的上下文切换,但有许多您可能会遇到更多。 – hnefatl

+0

线程这样的任务没有意义。线程并不是“更快”,它是管理CPU执行的一种方式。电脑有点笨,他们一次只能做一件事。所以线程帮助我们按照所需的顺序执行我们的任务。这要求你的线程有一个优先权(即,我应该先做什么)。如果您为自己的主题添加了优先级,则可以看到您的预期行为。另外你的CPU没有8个线程,它有8个内核。 – DoesData

+0

System.out.println()代价也很高。高性能打印应使用不同的方法 –

回答

2

创建Thread是一个代价高昂的操作。

在你的例子中,你创建了大量的线程,每个循环迭代一个线程。因此,您只需花费大量时间创建线程,而不是进行实际工作。

如果您执行足够大的任务并将其分解为可同时执行的较小任务,并使用合理数量的线程执行它们,则多线程化可能会更快(例如,与CPU /内核的数量有或只有它的一小部分)。

0

你正在创建在每个循环一个新的线程,线程数超过你的CPU内核的数量。由于CPU试图对每个具有150000个线程的实例公平,这意味着每个线程只会在切换到新线程的后台之前执行一段时间。

尝试改为创建2个线程或8个线程,这会产生更好的结果。

+0

您的建议是“尝试创建2个线程或8线程“听起来很简单,但真的哟你要求OP改变程序的体系结构来使用_thread pool_,而不是为每个任务创建一个新的线程。这对新手来说是一大步,它值得一些解释。 –

0

要求你去这个源位置:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Thread.java

这是一个Thread类是如何在OpenJDK的6实现还有很多的工作,你的程序在每个循环做不产生任何可见的结果,并在此之后实际上闲置。在尝试并行化一段代码时必须小心,因为Thread实例的创建和调度程序的努力也将被考虑。另外还有一些叫Amadahl的法则。如果并行化的成本比使用它的成本节约更多,则不应该这样做。

如果您是使用多线程进一步感兴趣的性能提高,我建议这个文章在这里的快速阅读:

http://tutorials.jenkov.com/java-concurrency/amdahls-law.html

相关问题