我目前正在研究某种数据库基准测试应用程序。基本上,我试图做的是模拟使用线程一定数量的客户端,这些客户端在一段时间内对数据库重复相同的操作(例如:读取操作)。
在此期间,我希望在每个线程中测量从数据库获取答案的平均延迟。我的第一选择是依赖于ThreadMXBean的getThreadCpuTime()方法(http://docs.oracle.com/javase/7/docs/api/java/lang/management/ThreadMXBean.html),但重点是操作太快而无法测量(操作之前的getThreadCpuTime()等于getThreadCpuTime())。 。测量java短时间运行的线程执行时间
我做了一个小实验,了解和说明问题:
public class ExampleClass {
class LongRunningThread extends Thread {
private int n;
public LongRunningThread(int n) {
this.n = n;
}
public void run() {
ArrayList l = new ArrayList();
for (int i = 0; i < n; i++) {
l.add(new Object());
}
long time = ManagementFactory.getThreadMXBean().getThreadCpuTime(this.getId());
System.out.println("Long running thread " + this.getId() + " execution time: " + time);
}
}
class MyThread extends Thread {
int n;
public MyThread(int n) {
this.n = n;
}
public void run() {
ArrayList l = new ArrayList();
for (int i = 0; i < n; i++) {
l.add(new Object());
}
long time = ManagementFactory.getThreadMXBean().getThreadCpuTime(this.getId());
System.out.println("My thread " + this.getId() + " execution time: " + time);
}
}
public static void main(String [] args) {
System.out.println("Cpu time supported? " + ManagementFactory.getThreadMXBean().isThreadCpuTimeSupported());
System.out.println("Cpu time enabled? " + ManagementFactory.getThreadMXBean().isThreadCpuTimeEnabled());
for (int i = 1; i < 10; ++i) {
new LongRunningThread(i*1000000).start();
}
for (int i = 1; i < 10; ++i) {
new MyThread(i*100).start();
}
}
Output:
Cpu time supported? true
Cpu time enabled? true
My thread 18 execution time: 0
My thread 26 execution time: 0
My thread 20 execution time: 0
My thread 22 execution time: 0
My thread 24 execution time: 0
My thread 21 execution time: 0
My thread 25 execution time: 0
My thread 19 execution time: 0
My thread 23 execution time: 0
Long running thread 9 execution time: 15600100
Long running thread 10 execution time: 15600100
Long running thread 11 execution time: 46800300
Long running thread 12 execution time: 31200200
Long running thread 14 execution time: 78000500
Long running thread 13 execution time: 78000500
Long running thread 17 execution time: 124800800
Long running thread 15 execution time: 140400900
Long running thread 16 execution time: 109200700
我不能得到执行时间为所有MyThread
实例,但没有问题LongRunningThread
实例。就像我说的,我的假设是,第一个线程完成的操作发生得太快而无法实际测量。 有没有什么办法可以实现我想要做的事情?是否有可能测量这种短时间运行线程的执行时间?
在此先感谢您的帮助:)
你可以添加isThreadCpuTimeSupported()和isThreadCpuTimeEnabled()成日志?遵循http://docs.oracle.com/javase/7/docs/api/java/lang/management/ThreadMXBean.html - 默认情况下,Java虚拟机可能会禁用CPU时间测量。 – iMysak
另外问题 - 你需要CpuTime或每个线程的工作时间? – iMysak
我其实需要为每个线程工作的时间。但是,如果我更改getThreadUserTime()的getThreadCpuTime(),结果是相同的(即零时间完成MyThread操作) – Morro