2013-02-06 21 views
0

我有一个java程序,它将一些文件提取到客户端机器上。我已经实现了4个线程来提取文件。但是线程实现几乎不影响提取时间。我已经在jvisualvm中检查了线程的执行情况,它看起来很好,我确信线程是以并行方式实现的。这里是我的系统配置...如何检查Java程序中的线程是按顺序还是并行运行?

Windows XP,Core2duo,3GB RAM。 java-vm-args:-Xmx512M -Xss2M。 我已经打印可用的处理器到正在运行的JVM ... Runtime.getRuntime()。availableProcessors()= 1(如果我没有错,它应该执行2个逻辑线程)。

我错过了什么吗?我们如何确保线程在硬件级别平行运行?

+0

瓶颈可能是磁盘IO(而不是线程中的处理时间)。你检查了吗? –

+0

你可以在你的主线程中检查.isAlive()(或者你不相信这个,使用像processexplorer这样的外部应用程序)。请记住,每个物理磁盘只能使用1个读取线程,否则您可能会创建更多开销并使用更多线程减慢进程。 – andrew

+0

感谢您的回答。 @Ignacio,我们如何检查瓶颈是磁盘IO。 – Bala

回答

0

并行执行有助于CPU出现瓶颈时。在你的情况下,瓶颈可能是I/O,而不是CPU。另外,你有一个超线程物理核心。在这种情况下,即使CPU处于瓶颈状态,并行执行也无济于事。此外,在某些情况下,双线程应用程序在单核,超线程CPU上可能比单线程应用程序慢。超线程主要是营销手段。不要依赖它。

0

您缺少的是提取时间不仅包含CPU时间,还包括HDD读取和写入。这两个时间比CPU执行的ZIP算法多花几个数量级。

+0

有没有什么办法单独检查硬盘的读/写时间,只是为了测试... – Bala

1

如何确保线程在硬件级别并行运行?

我认为这大多是一个无效的问题。在Linux下,您可以通过ps -eLfl查看线程及其状态,但这不适用于其他操作系统。线程转储将显示线程状态。通过jconsole中的Threads选项卡并单击这些线程也会显示它们的状态。

但线程执行几乎没有影响提取时间

正如其他人所提到的,这是你的程序IO约束的教科书标志。你所有的线程都在争夺相同的IO资源,并将大部分时间花费在等待队列中。

要测试此理论,请将您的应用程序移至更快的磁盘系统。固态硬盘是这里的炸弹。将文件加载到内存中首先然后用不同数量的线程运行处理也将隔离IO带宽问题。使用内存文件系统也是如此。

如果你处理的是IO绑定,那么在没有增加你的IO带宽的情况下,可能没有办法加速它。

+1

+1'SSD是这里的炸弹',特别是在标准旋转器选择低功耗和高性能耐用性的笔记本电脑上。 –

+0

谢谢格雷,我将我的应用程序移至4核心处理器,并将差异缩小了约四分之一。 – Bala

0

我不认为有一种方法来检查,除了通过外部手段;例如

  • 寻找Windows任务管理器性能图表,或
  • VisualVM的连接到JVM。

我已经印刷可用处理器来运行的JVM:

Runtime.getRuntime().availableProcessors() = 1 

这意味着,你的JVM认为它只有向它提供的1个处理器。如果您实际上有两个物理内核(或HT虚拟内核),则操作系统只允许JVM使用其中的一个。

(某种在你的代码的瓶颈不会导致availableProcessors()返回1。)


我们怎样才能保证线程在硬件级并行运行?

您需要确保操作系统允许 JVM使用多个内核。

相关问题