首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程应用程序性能

多线程应用程序性能
EN

Stack Overflow用户
提问于 2012-05-14 16:08:21
回答 2查看 403关注 0票数 2

我的Java应用程序本质上是这样做的:

  • 从文件(1MB字节arryas)中读取nThread缓冲区,
  • 创建nThread线程来处理缓冲区
  • 等待线程处理数据
  • 将处理的数据写入另一个文件

这是一个应用程序,应该实现一个理论上100%的提速每个核心,但相反,更多的线程处理信息,它得到的速度越慢!

示例:

  • 1线程: 4800 ms
  • 2线程: 10200 ms
  • 3线程: 13400 ms
  • 4线程: 18560 ms

H 119H 220F 221

EN

回答 2

Stack Overflow用户

发布于 2012-05-14 16:18:37

在添加线程时获得这样的性能意味着您正在做一些非常错误的事情。通常,添加线程不会提供任何速度改进,有时可能会对您造成一些处罚,但是添加另一个线程并使程序运行时间翻倍是非常不寻常的。

下面是一些要调查的事情:

正如评论中所提到的

  • ,您应该从单个线程读取输入文件,然后将工作分配给工作线程。
  • 应该考虑使用ExecutorService而不是自己管理线程。这通常会删除大量的用户代码和相关的bug。看到Executors.newFixedThreadPool(numThread).
  • Are你确定你正在启动你的线程,对吗?您应该在启动下一个线程之前调用new Thread(...).start()而不是调用run() run()您调用join()吗?您应该对所有线程进行start(),将行分派给它们,然后在它们的末尾进行join()
  • 是否有可能意外地将所有输入行发送到所有线程?不过,我认为这不会显示性能数字,除非您也增加了输出IO。

如果您在问题中向我们展示了您的一些线程代码,我们可以提供更多帮助。

票数 1
EN

Stack Overflow用户

发布于 2012-05-14 19:09:45

没有经过充分优化的代码通常会耗尽整个内存带宽。在多核处理器上添加使用相同的未优化代码的另一个线程,它们将在多核处理器之间分配带宽,此外,它们还会经常相遇,进一步减慢速度。

格雷说:“.程序运行时间翻倍是非常不寻常的。”我不同意。这通常发生在C代码中,然后才开始优化内存访问。我想说,从一开始就没有看到经济放缓是非常不寻常的。

我不知道Java是否可以使用抽样,但这是一个显而易见的起点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10587059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档