返回信息流初始问题:如何在多线程的环境下,尽可能准确的测出某个方法的运行时间
线程中的run方法如下:
public void run(){
//--------其他代码----------
for(i=0;i<n;i++)
mymethod();
//--------其他代码----------
}
现在有多个线程,如何准确的测出每个线程每次执行mymethod()方法所需的时间。
这是一条镜像帖。来源:北邮人论坛 / java / #29663同步于 2014/4/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[问题]多线程,如何尽可能准确的测出线程中某个方法的运行时间
peakmuma
2014/4/29镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
好吧,其实这不是最初始的问题
明天我把问题详细写一下,手机不方便写
【 在 nuanyangyang 的大作中提到: 】
: 不可能。除非你在操作系统级别这样做。
我感觉加锁应该就可以吧?这三句执行前用一个ReentrantLock 给 lock起来,然后执行完毕后unlock
【 在 peakmuma (【意涵团】残忍的慈悲) 的大作中提到: 】
: 初始问题:如何在多线程的环境下,尽可能准确的测出某个方法的运行时间
: 线程中的run方法如下:
: [code=java]
: ...................
加锁貌似是不起作用的,因为无法保证cpu不被切换走。
如果执行了第一行得到before的值,cpu被切换到执行其他线程,在回到这个线程,after-before的值不是mymethod()方法所消耗的时间。
【 在 taoch 的大作中提到: 】
: 我感觉加锁应该就可以吧?这三句执行前用一个ReentrantLock 给 lock起来,然后执行完毕后unlock
这不就是benchmark问题嘛。最好的还是在一个基本空闲的机器上反复执行这个函数,然后计算时间平均数。尽可能取最后几次,一开始预热可能需要一些时间。
不过,有一些陷阱:
1. Intel的CPU很聪明。如果CPU温度不是很高,它会工作在1.5倍标称频率下(如你的CPU是1.8MHz,它平时会工作在2.7MHz),一旦太热了,就会开启风扇,并调低频率。这样程序执行的速度会有影响。
2. Java虚拟机会对热函数、热循环进行JIT Compiling。所以,执行的次数会影响JVM做出的决定。
3. Eclipse本身有Profiling功能,可以试试。但是,它本身会让程序速度慢10倍以上,而且不能避免上述两个问题的影响。