【问题标题】:Getting Execution time in Multithreaded program在多线程程序中获取执行时间
【发布时间】:2010-11-14 08:54:33
【问题描述】:

我正在尝试在 java 中使用多线程对数组进行排序并注意其执行时间。我也在使用 System.nanoTime()。

这是代码模板

start = System.nanoTime();
sort();   // calls different threads to completely sort the array
end = System.nanoTime()

我想问的是,上面是在主线程中,所以它会给我不正确的时间结果,因为我没有放 main.sleep() ?还是由 JVM 处理。另外,如果我需要快速执行,是否可以在时间执行方面提高上述代码的性能??

【问题讨论】:

  • @user506710:您需要的是统计时间测量。在单个示例中,您可能会“不走运”,例如,操作系统会调度您的应用程序或 JVM 调度您的排序线程。您想要的是多次重复测量,并取 90% 的样本平均值或中位数附近的平均值(在这种情况下,挑剔使用均值或中位数不太可能产生任何影响)。
  • @user506710: 顺便说一句...在当今的四核/八核世界中,单线程排序算法确实很糟糕,我很确定你的 sort()是单线程排序。如果您有任何大量数据要排序,将其替换为多线程排序将大大提高上述代码的性能(遗憾的是,默认的 Java API 不提供任何数据)。

标签: java


【解决方案1】:

我想问的是,上面是在主线程中,所以它会给我不正确的时间结果,因为我没有放 main.sleep() ?还是由 JVM 处理。

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

  • 这不是对所用 CPU 时间的衡量,并且
  • 在某些版本的 Java / OS 平台上,System.nanoTime() 使用的硬件时钟在不同内核之间不同步,因此(显然)可能相当不准确。

就个人而言,我会使用System.currentTimeMillis(),并确保我对大型数组或集合的排序进行了基准测试......并做了各种其他事情来确保我的基准测试有效。

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

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

这个问题太笼统了,无法回答,除了说“可能是”……或“分析一下”。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您好,您能多谈谈如何使用它吗?我有 jdk 6 和 eclipse
    • 您可以通过打开命令行并输入 jvisualvm 来打开它(我在 linux 和 os x 中尝试过,但在 windows 中没有尝试过)。 (我认为)您需要在应用程序启动之前添加一个暂停,然后转到 jvisualvm,到分析选项卡,然后单击 CPU 或内存。您还应该在您的应用程序终止之前添加一个暂停,以便对结果进行良好的“快照”。我建议使用 (new Scanner(System.in)).nextLine() 或类似的东西。如果您将应用程序分解为更小的方法,您也可以更轻松地找到瓶颈。
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多