如何忽略等待其他线程的时间来为程序计时



假设我有以下程序:

public class ProgramA {
  public void doSomething(ProgramC c) {
    c.doSomething();
    // Do something else that takes 5 seconds.
  }
}
public class ProgramB {
  public void doSomething(ProgramC c) {
    c.doSomething();
    // Do something else that takes 2 seconds.
  }
}
public class ProgramC {
  public synchronized void doSomething() {
    // Do something that takes 10 seconds
  }
}

我想计时程序A和程序B,以了解它们需要多长时间(使用Guava的秒表或类似的东西)。当串行运行时,我得到了预期的15秒和12秒。然而,当并行运行时,我得到例如15秒和22秒,因为程序B花时间等待程序C上的锁定。

有没有一种方法可以忽略以这种方式阻塞的时间,并获得与串行运行时相同的时间?更有用的是分解,例如"程序B占用了22秒,其中10秒在其他线程上阻塞"

如果要在线程级别监视此情况,可以将getState()调用为Thread对象,以查看与RUNNABLE状态相比,每个Thread具有BLOCKED state的时间。

最新更新