Java 获取多线程程序的执行时间

Java 获取多线程程序的执行时间,java,Java,我试图在java中使用多线程对数组进行排序,并记录其执行时间。我正在使用System.nanoTime()进行同样的操作 下面是代码的模板 start = System.nanoTime(); sort(); // calls different threads to completely sort the array end = System.nanoTime() 我想问的是,上面的内容是在主线程中,所以如果我没有放置main.sleep(),它会给我错误的时间结果吗??或者它是由JVM

我试图在java中使用多线程对数组进行排序,并记录其执行时间。我正在使用System.nanoTime()进行同样的操作

下面是代码的模板

start = System.nanoTime();
sort();   // calls different threads to completely sort the array
end = System.nanoTime()
我想问的是,上面的内容是在主线程中,所以如果我没有放置main.sleep(),它会给我错误的时间结果吗??或者它是由JVM处理的。另外,如果我需要快速执行,是否有什么可以提高上述代码在执行时间方面的性能

我想问的是,上面的内容是在主线程中,所以如果我没有放置main.sleep(),它会给我错误的时间结果吗??或者它是由JVM处理的

System.nanoTime()
应该可以为您提供最佳(最精确)的已用时间度量。注:

  • 这不是所用CPU时间的度量,并且
  • 在某些版本的Java/OS平台上,
    System.nanoTime()
    使用的硬件时钟在不同的内核之间不同步,因此(显然)可能会非常不准确
就我个人而言,我会使用
System.currentTimeMillis()
,并确保我对大型数组或集合的排序进行了基准测试。。。并做了其他各种事情来确保我的基准是有效的

编辑-如果您想知道每个线程使用了多少CPU时间,请查看API。)

另外,如果我需要快速执行,是否有什么可以提高上述代码在执行时间方面的性能


这是一个过于笼统的问题,除了说“可能是”。。。或者“profile it”。

您可以使用JVisualVM探查器(或其他探查器)查找每个方法的执行速度


您只需要在开始时暂停,以便附加它,然后在结束时暂停,以便查看和/或保存结果。

嘿,您能告诉我更多关于如何使用它的信息吗。我有jdk 6和eclipseYou可以通过打开命令行并键入jvisualvm来打开它(我在linux和os x中尝试过,但在windows中没有)。(我认为)您需要在应用程序启动前添加一个暂停,然后转到jvisualvm,进入profiling选项卡,然后单击CPU或内存。您还应该在应用程序终止之前添加暂停,以便对结果进行良好的“快照”。我建议使用(newscanner(System.in)).nextLine()或类似的工具。如果你把你的应用程序分解成更小的方法,你可以更容易地发现瓶颈。@user506710:你需要的是统计时间度量。在一个示例中,您可能“运气不好”,例如,操作系统调度您的应用程序,或者JVM调度您的排序线程。你要做的是重复测量几次,然后取平均值或中位数周围90%的采样平均值(在这种情况下,挑剔使用平均值或中位数不太可能产生任何差异)。@user506710:btw。。。单线程排序算法在今天的四核/八核世界中确实非常糟糕,我很确定您的sort()是单线程排序。如果有大量数据需要排序,用多线程排序替换它将大大提高上述代码的性能(遗憾的是,默认的JavaAPI没有提供任何数据)。