如何在java中测量一个线程从新线程到结束所需的时间
问题:如何在java中测量一个线程从新线程到结束所需的时间,java,java-threads,Java,Java Threads,问题: public void process2(){ final long start = System.currentTimeMillis(); Thread newT = new Thread(new Runnable() { @Override public void run() { // long end = System.currentTimeMillis(); // System.out
public void process2(){
final long start = System.currentTimeMillis();
Thread newT = new Thread(new Runnable() {
@Override
public void run() {
// long end = System.currentTimeMillis();
// System.out.println((end-start));
for (int i = 1, sum = 0; i < 1000; i++) {
sum += i;
}
}
});
long end1 = System.currentTimeMillis();
System.out.println("new thread time took :" + (end1 - start));
newT.start();
int i = 0;
while (newT.isAlive()) {
i++;
}
long end = System.currentTimeMillis();
System.out.println("total time:" + (end - start));
System.out.println("judge count:" + i);
}
public void process2(){
final long start = System.currentTimeMillis();
Thread newT = new Thread(new Runnable() {
@Override
public void run() {
// long end = System.currentTimeMillis();
// System.out.println((end-start));
for (int i = 1, sum = 0; i < 1000; i++) {
sum += i;
}
}
});
long end1 = System.currentTimeMillis();
System.out.println("new thread time took :" + (end1 - start));
newT.start();
int i = 0;
while (newT.isAlive()) {
i++;
}
long end = System.currentTimeMillis();
System.out.println("total time:" + (end - start));
System.out.println("judge count:" + i);
}
public void process2(){
最终长启动=System.currentTimeMillis();
线程newT=新线程(新可运行(){
@凌驾
公开募捐{
//long end=System.currentTimeMillis();
//System.out.println((结束-开始));
对于(int i=1,sum=0;i<1000;i++){
总和+=i;
}
}
});
long-end1=System.currentTimeMillis();
println(“新线程花费的时间:”+(end1-start));
newT.start();
int i=0;
while(newT.isAlive()){
i++;
}
long end=System.currentTimeMillis();
System.out.println(“总时间:+(结束-开始));
System.out.println(“判断计数:+i”);
}
run()
方法所花费的时间。这段时间在不同的运行之间通常是相似的线程
对象上的创建成本相当高,并且取决于系统当前可用的资源,这就是为什么线程
创建和执行之间的时间会有很大差异的原因。更重要的是,在销毁线程之前,有一个清理过程也可能占用大量时间优化线程管理时间(创建/销毁)的一种方法是使用
ThreadPool
或ExecutorService
。有关更多详细信息,请参见Oracle。您为测量编造了一个非常糟糕的示例
首先,用new创建一个新线程非常便宜(这是一个普通的java对象)。但您实际上包括了匿名Runnable的类加载时间。这将涉及I/O,因此预计执行时间会有很大变化,特别是在第一次运行时
然后,以毫秒为单位测量时间。但是系统时间不一定有实际的毫秒分辨率(请阅读system.currentTimeMillis的javadocs)。此外,您试图测量的内容在大多数情况下都会在不到一毫秒的时间内执行
您的Runnable没有明显的副作用,因此JIT可能会在短暂的预热后优化整个代码。运行几次之后,runnable实际上可能根本不需要任何时间
您正在轮询以确定其他线程何时结束。这使得CPU(如果有多个CPU,则为一个内核)忙着不做任何有用的事情。对于单核机器来说,这意味着平均有50%的时间是用来检查线程是否处于活动状态的。根据操作系统调度程序运行线程的方式,这是另一个变化源
总而言之,您已经创建了一个微基准,并且您已经涉足了微基准在java中可能遇到的所有最常见的陷阱。java中的基准测试需要一定的谨慎,否则您将度量任何东西,而不是您真正想要度量的代码的性能。这里有基准测试框架,也有关于如何正确使用java进行基准测试的优秀文章,以及大量相关问题。利用这些资源。尝试谷歌搜索“上下文切换”和“软件线程”您也在测量主线程时间,而不断检查is live的While循环会窃取CPU周期,您可以使用joindeep分析,谢谢