Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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 使用currentTimeMillis测量经过的时间返回0_Java_Android_Performance_Time_Elapsedtime - Fatal编程技术网

Java 使用currentTimeMillis测量经过的时间返回0

Java 使用currentTimeMillis测量经过的时间返回0,java,android,performance,time,elapsedtime,Java,Android,Performance,Time,Elapsedtime,我对Java/Android编程有点陌生,我只是想做一个简单的时间度量来计算我正在调用的方法的运行时间 现在,我的代码如下所示: startTime = System.currentTimeMillis(); java_doubleinterp(args, ans); endTime = System.currentTimeMillis(); elapsed = endTime - startTime; setTex

我对Java/Android编程有点陌生,我只是想做一个简单的时间度量来计算我正在调用的方法的运行时间

现在,我的代码如下所示:

        startTime = System.currentTimeMillis();
        java_doubleinterp(args, ans);
        endTime = System.currentTimeMillis();
        elapsed = endTime - startTime;
        setTextview(ans);
方法java\u doubleinterp包含for循环,它是纯数学的,工作正常。输入为args,输出为ans。我没有返回任何内容,因为我试图将它的性能与使用C/C++(NDK)实现的类似函数进行比较,该函数是用MatLab自动生成的,具有这种结构

对于C/C++函数,我尝试以相同的方式测量时间,并得到相同的错误

在后面的代码中,我有以下内容:

Toast elapsedTime = Toast.makeText(getApplicationContext(), 
            "Elapsed time for " + lang + " code: \n" + (elapsed*1000)+ "\u03BCs", 
            Toast.LENGTH_LONG);
朗只是一根弦

这个祝酒词告诉我经过的时间是0秒(微秒)

在调试这个问题时,我显示了startTime和endTime,它们都显示了相同的值。为什么会这样


Obs:我尝试使用nanoTime()来获得时间和更高的精度,但结果是:

  • 模拟器:大约50美元
  • 电话(Nexus 4):0us或30us[没有意义]

编辑:

我在代码中做了一些更改,现在java方法看起来是这样的:

startTime = System.nanoTime();
java_doubleinterp(args, ans);
setTextview(ans);
endTime = System.nanoTime();
elapsed = endTime - startTime;
这是c函数(JNI)的一部分:

他们现在工作得很好。由于setTextview对于这两部分代码是相同的方法,所以绝对执行时间可能是错误的,但相对执行时间(java实现和JNI实现之间)是正常的

现在我得到的平均执行时间更有意义:

  • 模拟器:3.75毫秒(Java)/6.59毫秒(JNI)
  • Nexus4:1.11ms(Java)/0.82ms(JNI)

您试图测量一个伪例程的性能:很可能编译器只是简单地使整个过程消失,这就是为什么得到0微秒的原因。

确保变量startTime和endTime都很长

例程似乎完成得很快,因此开始时间和结束时间之间的差值为0。据我所知,当我们衡量性能时,nanoTime()比currentTimeMillis()好得多。尝试增加输入的大小

确保
java\u doubleinterp
有副作用。副作用是什么意思?如果我将setTextview(ans)放在endTime之前,我会得到正确的值还是setTextview()的运行时间?它不是一个伪例程。它实际上是在做一些稍后显示的事情。我需要衡量这一点,因为我使用Java和C/C++(使用NDK)实现了这个例程。我想比较一下他们的表现。
startTime = System.nanoTime();
doubleinterp(args, ans);
setTextview(ans);
endTime = System.nanoTime();
elapsed = endTime - startTime;