【问题标题】:4 threads or 8, thread execution time is the same4个线程还是8个,线程执行时间一样
【发布时间】:2015-07-28 10:40:27
【问题描述】:

最初我有(例如要处理的 2 000 000 行数据) 我有一个ArrayList<ArrayList<SubsData>> threads。 SubsData 是一个类。

在循环中,我根据给定的线程数填充数组; 所以如果我有更多的线程,那么每个 ArrayList 将有更少的数据来处理。

然后在这里我将数据数组传递给某个线程并运行它。 `

for (int i = 0; i < threads.size(); i++) 
{
           ArrayList<SubsData> thread = threads.get(i);
           Worker w = hlrSockets.get(i);
           DButilities db = dbSockets.get(i);
           Collation performCollation = new Collation(thread,w, db);
           new Thread(performCollation, "collateThread #" + i).start();
}

`

不过不管我跑8个还是16个线程,线程执行时间都没有变化。

  1. 好吧,假设我有 1 个 8 核处理器
  2. ArrayList 中有 100 行
    1 线程将在 1 分钟内处理数组

  3. 然后我将 100 行拆分为两个不同的 ArrayList 对象,每个对象有 50 行

  4. 将这些数组传递给不同的线程

2 个线程应在 30 秒内处理数组中的数据

我是对的吗?
如果我是对的,那为什么它在我的情况下不起作用?
如果您需要我的代码的任何部分,我会在此处发布,只需大喊 我需要摆脱它

这是分析结果。 请检查一下


最终,我在我的程序中找到了狭窄的地方。
我似乎从多个线程读取单个输出流。

当我注释 readLine() 行时,我的程序运行两次,根据线程数快四倍。

所以问题是,这条线有什么问题?
我在线程内创建 BufferedReader,难道不是每个线程都特定吗?

【问题讨论】:

  • 你有几个核心?如果所有核心都忙,添加更多线程有什么帮助?
  • 你的硬件是什么?您的机器是否有足够的内核来并行运行所有线程?
  • 我有 8 核 Corei7。
  • 这里是 2 个线程的线程执行的输出 Thread pool-1-thread-1 已启动;要处理的子程序:893 Thread pool-1-thread-2 已启动;要处理的子程序:889 线程池 1-线程 2 已完成;执行时间(秒):55 已处理:889 Thread pool-1-thread-1 已完成;执行时间(秒):56 已处理:893
  • 没有“插入/更新/删除”,它只是选择我按索引选择数据,所以它很快它只取决于我从数据库中获取信息的数组中的记录数量。

标签: java arrays multithreading memory


【解决方案1】:

我的建议是分析代码以查看大部分时间都花在了哪里。

人们在多线程应用程序中看不到太多加速的常见原因是:

  • 应用程序的一个重要部分是单线程的。

  • 多线程部分的性能取决于(例如)有效单线程或资源(例如 CPU 或 I/O)受限的外部数据库。

  • 线程争用某些东西(例如锁、对内存/缓存的访问)并降低吞吐量。

  • 您没有足够的内核来产生重大影响。

如果没有看到几乎所有代码,就无法预测其中之一是您的问题......还是其他问题。

【讨论】:

  • 我尝试使用不同的输入值多次运行我的代码。每次都没有区别。是的,我使用连接到 2 个数据库,但关键是,即使有所有锁+并发处理时间也应该有所不同,当处理 2000 或 1000 行时我是对的吗?。
  • 不,你不对(必然)。很可能数据库是瓶颈。
  • 如果我将所有正在处理的数据放入一个数组中,然后创建线程,这样就不再需要连接到数据库了?会有帮助吗?
  • 也许吧。但是现在您的应用程序在将数据从数据库加载到数组时有一个很长的单线程阶段。首先对应用程序进行概要分析会更好。 (见答案的第一句话!)除非你这样做,否则这都是猜测;即糟糕的科学和糟糕的工程。
  • Re,一个重要的部分......是单线程的。邀请 OP 到 Google 学习“阿姆达尔定律”的好机会。
【解决方案2】:

如果用例不同,多线程可能会更高效:

  • 当处理必须等待外部事件时(具有多个外部客户端的服务器)
  • 用于 CPU 绑定处理,最多内核数

在某些用例中,多线程可能会更糟:

  • 用于磁盘 IO 绑定处理(不应增加也不应显着减少)
  • 用于数据库绑定处理(锁争用风险较高可能会降低性能)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2014-10-12
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多