Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取运行方法所需的时间_Java - Fatal编程技术网

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;

答案有三个部分

  • 永远不要减去值非常接近的浮点数。您将严重失去精度,甚至变得毫无用处。在这种情况下,减去整数并转换为double仅用于显示结果

  • 从我看到的代码来看,它看起来是瞬时的——在微秒或更低的范围内——而时间函数并没有提供那个级别的分辨率。这样做无法获得有用的结果

  • 基准计时是微妙的、复杂的和令人困惑的(即使它的行为是正确的!)。请仔细阅读提供的参考资料和计划。你想测量什么?你怎么能做到?你将如何处理结果


  • 参考:

    打印持续时间您可以插入一个线程。在运行时调用sleep(1000)来检查计时代码是否有效。。。毕竟,这可能只是一个快速的电话,对我来说并不复杂……你应该读一下这篇文章:到底为什么一个有潜在副作用的电话会被删除?这将是一个巨大的JVM bug。