CPU资源和时钟周期:System.out.println或递增标志

时间:2012-05-05 07:55:53

标签: java android optimization micro-optimization

为了调试我们的Android代码,我们放了System.out.println(string),它会告诉我们调用函数的次数。另一种方法是放置一个标志,并在每次函数调用后继续递增它。然后在最后按System.out.println(...)打印标志的最终值。 (实际上在我的应用程序中,该函数将被称为数千次)

我的问题是:在 CPU资源 时钟周期 方面哪一个更轻:增量操作还是System.out.println?

2 个答案:

答案 0 :(得分:3)

增量将更多,更多更高效 - 特别是如果你实际上已经获得了该输出的任何地方。考虑System.out.println与增量变量所需的所有操作。当然,影响是否实际上重要是另一回事 - 如果你的方法已经做了很多工作,那么System.out.println调用可能实际上并没有太大的区别。但是,如果你只是想知道它被调用了多少次,那么保留一个计数器比查看日志更有意义,无论如何,IMO。

我建议使用AtomicLongAtomicInteger而不是只使用原始变量,这样就可以获得简单的线程安全性。

答案 1 :(得分:0)

在时钟周期方面,增量将更快 lot 。假设增量非常接近硬件增量,则只需要几个时钟周期。这意味着你可以每秒做数百万。

另一方面,System.out.println必须调用操作系统。使用标准输出。转换字符等。每个步骤都需要很多很多个时钟周期。

回到原来的问题,如果您正在查看调用函数的次数,您可以尝试运行一个分析器 - 可以使用各种桌面和Android解决方案。这样您就不需要通过计数/打印来污染代码,并且可以保持生产代码的精简。

再次进一步思考,你为什么要知道函数被调用的确切次数?如果你担心缺陷,可以考虑编写一些单元测试来准确证明函数被调用的次数。如果您担心性能问题,可以将负载测试技术与您的分析器结合使用。