Java 获取运行方法所需的时间
尝试使用我通常用于获取持续时间的方法,我得到了奇怪的结果:Java 获取运行方法所需的时间,java,Java,尝试使用我通常用于获取持续时间的方法,我得到了奇怪的结果: float start = System.nanoTime(); //Do stuff float duration = System.nanoTime() - start; float durationInSeconds = duration / 1000000000.0f; 所以我尝试在这个手电筒应用程序中创建一个闪光灯: public void onClick(DialogInterface dialog, int id) {
float start = System.nanoTime();
//Do stuff
float duration = System.nanoTime() - start;
float durationInSeconds = duration / 1000000000.0f;
所以我尝试在这个手电筒应用程序中创建一个闪光灯:
public void onClick(DialogInterface dialog, int id) {
isFlashOn = true;
isStrobeActive = true;
// Perform actual strobe
strobeHandler.post(new Runnable() {
float currDuration = 0;
final float deltaTime = 1/60f;
final float deltaTimeInMil = deltaTime * 1000;
@Override
public void run() {
float strobePerSecond = 1 / currentStrobeValue;
if (!isStrobeLightOn) {
if (currDuration > strobePerSecond) {
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
currDuration -= strobePerSecond;
isStrobeLightOn = true;
}
} else {
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
isStrobeLightOn = false;
}
currDuration += deltaTime;
strobeHandler.postDelayed(this, (long) deltaTimeInMil);
}
});
}
但是,日志返回0.0或3.052E-5。我不太确定我做错了什么,但我想我需要一些帮助来解决这个问题。一如既往,谢谢
编辑:我假设开始时间和结束时间非常相似,当它们被减法和四舍五入时,它们是0。看看字节码。也许编译器只是在剥离调用。如果是这种情况,只需创建一个
公共volatile字段
,并将其分配到方法内部或作为返回值
这是调用死代码消除
。这不是可能执行的唯一优化
分解类文件并查看一下,以防万一。你可以用它来做
请参阅[1]和[2]以获取微观基准测试建议
[1]
[2] 我猜是因为如果数字太大,
float
不够准确。为什么不像你应该的那样使用long
long start = System.nanoTime();
//Do stuff
long duration = System.nanoTime() - start;
double durationInSeconds = duration / 1000000000.0d;
答案有三个部分
参考:打印持续时间您可以插入一个线程。在运行时调用sleep(1000)来检查计时代码是否有效。。。毕竟,这可能只是一个快速的电话,对我来说并不复杂……你应该读一下这篇文章:到底为什么一个有潜在副作用的电话会被删除?这将是一个巨大的JVM bug。