Java Android上常见的性能陷阱?

Java Android上常见的性能陷阱?,java,android,performance,optimization,dalvik,Java,Android,Performance,Optimization,Dalvik,Android上最容易犯的错误是什么 文档中提到“一些浮点操作”可以是“毫秒级的”——有人对此进行过测试吗 为了便于讨论,让我们假设它在G1/类似设备上运行。有关呈现特定性能提示,请参阅以下Google I/O 2009讲座: 他们希望您避免使用float的原因是,它很少在手机cpu(可能是arm)上实现,而且必须在速度较慢的软件中实现。虽然固定点在硬件上得到了普遍的支持 有些手机确实在硬件上实现了浮点运算,但由于你不知道你的应用程序可能部署在什么手机上,所以他们不会冒这个风险 许多人还说

Android上最容易犯的错误是什么

文档中提到“一些浮点操作”可以是“毫秒级的”——有人对此进行过测试吗


为了便于讨论,让我们假设它在G1/类似设备上运行。

有关呈现特定性能提示,请参阅以下Google I/O 2009讲座:


    • 他们希望您避免使用float的原因是,它很少在手机cpu(可能是arm)上实现,而且必须在速度较慢的软件中实现。虽然固定点在硬件上得到了普遍的支持

      有些手机确实在硬件上实现了浮点运算,但由于你不知道你的应用程序可能部署在什么手机上,所以他们不会冒这个风险


      许多人还说,要避免使用对象,回到手机速度非常慢的时代,java me的人们习惯于用静态函数按程序编写java。不过,我现在不建议这样做。

      在知道代码存在重大问题之前,不要担心性能。小的调整(整数而不是浮点数,使用迭代器而不是显式数组枚举)往往非常小,最好在应用程序关闭时查看它们。让5%的慢代码变得更复杂,而不是让整个应用程序更复杂。

      根据安卓用户的说法,你应该避免在集合中使用接口名称。例如,标准Java的标准最佳实践是

      List<String> strings = new ArrayList<String>();
      
      List strings=new ArrayList();
      
      而在Android中,他们说最好用运行时类型声明它

      ArrayList<String> strings = new ArrayList<String>();
      
      ArrayList strings=new ArrayList();
      
      wrt浮点:

      在G1上,添加两个浮点数大约需要400ns。添加两个整数大约需要250ns

      在运行eclair(预JIT)的NexusOne上,这两个操作都需要大约120ns的时间。(整数稍微快一点,但你必须在微基准上才能注意到。)整数和long、float和double之间有一个小的百分比差异,但基本上如果你买得起一个,你可能买得起另一个

      其他当前设备将介于这两个极端之间。(其他操作也会有所不同。乘法比加法/减法更昂贵,除法更昂贵。目前没有任何设备具有硬件整数除法。)

      但是,在你遇到问题之前,不要为这些事烦恼。很有可能,您的性能问题会归结为对算法或数据结构的糟糕选择,就像每个人的性能问题一样

      大多数当前(eclair)性能文档都不正确。在您关心的设备上,自己进行基准测试



      但如果你真的问“桌面/服务器java程序员应该注意什么?”我建议:不必要的分配。您没有像在桌面/服务器上那样的备用内核来执行GC,也没有像在桌面/服务器上那样的千兆字节堆。如果你在做GC,你就没有做真正的工作,你的堆在当前设备上最多是24MiB。因此,您可能希望避免在内部循环中进行不必要的分配。

      我发现AppInventor emulator对于浮点运算非常慢,即使在2014 i3/4Gb机器上也是如此。我编写了一个分形生成器来对模拟器进行基准测试,发现计算一个像素到10次迭代只需两秒钟——是的,2000毫秒。我还没有完全解开它,以找出哪些特定的操作是如此缓慢,但我会很快这样做

      每次迭代涉及四次乘法,两次加法和一次减法,五个变量。每次迭代后的测试包括两次乘法、一次加法和两次比较——大约30次失败。我还没有通过存储下一次迭代的结果来优化代码


      显然,如果有一种方法可以强制使用不动点或仅使用整数,这会有所帮助,但我在这个小项目中面临的问题的严重性并不是一个好兆头。

      虽然我同意不提前优化等,但这不是问题所在。例如,如果所有浮点运算都需要1ms,所有int运算都需要1ns,那么从一开始就为定点设计所有数据结构只是常识。如果你有50ms的预算来做这项工作,是需要1ms还是1ns并不重要。让代码正常工作,然后再考虑细节。在定点和浮动之间转换最多需要一两天的时间。让你的应用程序运行高效的算法,然后如果你需要做这些优化。在我看过的几乎每一个应用程序中,最大的性能赢家从来都不是微优化。他们是在确保你没有做愚蠢的事情(画对象2x,排序时,它是不需要的,…)。在某些情况下,微优化是正确的。当它发生时,你会知道的。注意——尽管在文档中——这实际上不是真的。我已经在froyo的文档中更正了这一点。(特别是,froyo版本的文档不会包含任何未经基准证实的声明。)但在遇到问题之前,不要沉迷于这些。很有可能,您的性能问题会归结为对算法或数据结构的糟糕选择,就像每个人的性能问题一样。这是巨大的。我能给你一个拥抱吗?