我想在我的Android应用中对某些代码块进行一些性能基准测试。我的计划是在各个点测量System.nanoTime()
,然后向Logcat吐出差异。
但是,我想知道对Log.i()
本身的调用是否实际上是计算上昂贵的,因此可能会扭曲结果?
在内部我不知道Log.i(...)
实际上在做什么 - 它是直接写入USB上的某些输出流还是只是将日志消息放到队列中以便由某个异步线程拾取真正的工作?
答案 0 :(得分:4)
它可以让你知道它发生了什么,但它永远不会真正准确。你应该使用android的一个配置文件工具(你可以找到它here)。 Log。*是完全异步的,但我不知道实现细节
答案 1 :(得分:1)
首先感谢@Blackbelt的答案,你在某种程度上是正确的,但我想增加更多细节和客观测量。
我使用System.nanoTime()和Traceview进行了一些基准测试,结果非常相似。
我做了一系列测试,在紧密的for循环中执行非常简单的一行语句,同时测量行前后的时间。然后我取了平均值:
Log.i("testLogcat", message); // mean execution time: 30465ns
strings.add("test"); // mean execution time: 962ns
Object x = new Object(); // mean execution time: 1185ns
int x = 1+1; // mean execution time: 1053ns
正如您所看到的,对Log.i()
的简单调用实际上是相对较重的,例如,它比将数组添加到数组列表中的成本高出约30倍。
所以这里有2节课!
Log.i()
实际上相对较慢,如果您在纳秒范围内工作,将会影响执行时间。使用System.nanoTime()进行测量后可以使用它来吐出结果,但是如果Log.i()
调用放在了被测量的代码中,则不能使用它。