0

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

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

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

4

4 回答 4

1

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

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

但是线程实现几乎不影响提取时间

正如其他人所提到的,这是您的程序受 IO 限制的教科书标志。您的所有线程都在争夺相同的 IO 资源,并且大部分时间都在等待队列中。

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

如果您的进程是 IO 绑定的,那么可能没有任何方法可以在不增加 IO 带宽的情况下加速它。

于 2013-02-06T13:32:47.497 回答
0

当 CPU 成为瓶颈时,并行执行会有所帮助。在您的情况下,瓶颈可能是 I/O,而不是 CPU。此外,您有 1 个具有超线程的物理内核。在这种情况下,并行执行可能无论如何都无济于事,即使 CPU 是瓶颈。此外,在某些情况下,单核、超线程 CPU 上的双线程应用程序可能比单线程应用程序慢。超线程主要是营销技巧。不要依赖它。

于 2013-02-06T13:25:17.237 回答
0

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

于 2013-02-06T13:26:09.223 回答
0

我认为除了通过外部手段之外没有其他方法可以检查。例如

  • 查看 Windows 任务管理器性能图表,或
  • 将 VisualVM 附加到 JVM。

我已将可用处理器打印到正在运行的 JVM:

  Runtime.getRuntime().availableProcessors() = 1

这意味着您认为 JVM 认为它只有 1 个可用处理器。如果您实际上有两个物理内核(或 HT 虚拟内核),那么操作系统只会让 JVM 使用其中一个。

(代码中的某种瓶颈不会导致availableProcessors()return 1。)


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

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

于 2013-02-06T13:41:20.360 回答