Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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 CPU资源和时钟周期:System.out.println或递增标志_Java_Android_Optimization_Micro Optimization - Fatal编程技术网

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

Java CPU资源和时钟周期:System.out.println或递增标志,java,android,optimization,micro-optimization,Java,Android,Optimization,Micro Optimization,为了调试我们的Android代码,我们放置了System.out.println(string),这将让我们知道函数被调用了多少次。另一种方法是放置一个标志,并在每次函数调用后继续递增。然后在最后通过System.out.println(…)打印标志的最终值。(实际上,在我的应用程序中,该函数将被调用数千次) 我的问题是:就CPU资源和时钟周期而言,哪一个更轻:增量操作还是System.out.println 递增将是非常非常有效的——特别是如果你真的有地方可以输出的话。想想System.out

为了调试我们的Android代码,我们放置了
System.out.println(string)
,这将让我们知道函数被调用了多少次。另一种方法是放置一个标志,并在每次函数调用后继续递增。然后在最后通过
System.out.println(…)
打印标志的最终值。(实际上,在我的应用程序中,该函数将被调用数千次)


我的问题是:就CPU资源和时钟周期而言,哪一个更轻:增量操作还是System.out.println

递增将是非常非常有效的——特别是如果你真的有地方可以输出的话。想想
System.out.println
vs递增一个变量所需的所有操作。当然,影响是否真正显著是另一回事——如果您的方法已经做了大量工作,那么调用
System.out.println
实际上可能没有多大区别。但如果你只是想知道它被调用了多少次,那么不管怎样,保持一个计数器比查看日志更有意义

我建议使用或而不是仅仅使用一个基本变量,因为这样可以获得简单的线程安全性。

在时钟周期方面,递增将快得多。假设增量相当接近硬件增量,则只需几个时钟周期。这意味着你可以每秒做数百万

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

回到你最初的问题,如果你想知道一个函数被调用了多少次,你可以试着运行一个分析器——有各种各样的桌面和android解决方案可用。这样,您就不需要用计数/打印来污染代码,并且可以保持生产代码的精简


再进一步想一想,为什么您想知道函数被调用的确切次数?如果你担心一个缺陷,请考虑编写一些单元测试来验证函数被调用的次数。如果您关心性能,也许可以将负载测试技术与您的分析器结合起来

谢谢你清晰的回复。我认为原子操作的成本会很高(我的应用程序是单线程的)…@gpuguy:你认为呢,还是你已经进行了基准测试并证明了这一点?与
System.out.println
相比,原子操作确实非常便宜。这将比非原子操作稍微贵一点,但仍然便宜。如果您真的是单线程的,那么您可能只需执行一个简单的基本操作就可以了,但是您应该非常清楚,在线程环境中,这可能会导致问题。基本上您是对的。我使用CUDA和OpenCL在多线程应用程序中测试了原子操作。原子增量操作比简单增量操作成本更高。然而,在许多情况下,原子能机构都来营救……谢谢你的回答。我同意我应该使用分析器。但问题是在Android TarceView中,没有关于本机代码的信息(我想计算我的函数)。