运算篇
1) Intro to Compute and Memory Problems
Android中的Java代码会需要经过编译优化再执行的过程。代码的不同写法会影响到Java编译器的优化效率。例如for循环的不同写法就会对编译器优化这段代码产生不同的效率,当程序中包含大量这种可优化的代码的时候,运算性能就会出现问题。想要知道如何优化代码的运算性能就需要知道代码在硬件层的执行差异。
2) Slow Function Performance
如果你写了一段代码,它的执行效率比想象中的要差很多。我们需要知道有哪些因素有可能影响到这段代码的执行效率。例如:比较两个float数值大小的执行时间是int数值的4倍左右。这是因为CPU的运算架构导致的,如下图所示:
虽然现代的CPU架构得到了很大的提升,也许并不存在上面所示的那么大的差异,但是这个例子说明了代码写法上的差异会对运算性能产生很大的影响。
通常来说有两类运行效率差的情况:第1种是相对执行时间长的方法,我们可以很轻松的找到这些方法并做一定的优化。第2种是执行时间短,但是执行频次很高的方法,因为执行次数多,累积效应下就会对性能产生很大的影响。
修复这些细节效率问题,需要使用Android SDK提供的工具,进行仔细的测量,然后再进行微调修复。
3) Traceview Walkthrough
通过Android Studio打开里面的Android Device Monitor,切换到DDMS窗口,点击左边栏上面想要跟踪的进程,再点击上面的Start Method Tracing的按钮,如下图所示:
启动跟踪之后,再操控app,做一些你想要跟踪的事件,例如滑动listview,点击某些视图进入另外一个页面等等。操作完之后,回到Android Device Monitor,再次点击Method Tracing的按钮停止跟踪。此时工具会为刚才的操作生成TraceView的详细视图。
关于TraceView中详细数据如何查看,这里不展开了,有很多文章介绍过。
4) Batching and Caching
为了提升运算性能,这里介绍2个非常重要的技术,Batching与Caching。
Batching是在真正执行运算操作之前对数据进行批量预处理,例如你需要有这样一个方法,它的作用是查找某个值是否存在与于一堆数据中。假设一个前提,我们会先对数据做排序,然后使用二分查找法来判断值是否存在。我们先看第一种情况,下图中存在着多次重复的排序操作。
在上面的那种写法下,如果数据的量级并不大的话,应该还可以接受,可是如果数据集非常大,就会有严重的效率问题。那么我们看下改进的写法,把排序的操作打包绑定只执行一次:
上面就是Batching的一种示例:把重复的操作拎出来,打包只执行一次。
Caching的理念很容易理解,在很多方面都有体现,下面举一个for循环的例子:
上面这2种基础技巧非常实用,积极恰当的使用能够显著提升运算性能。
5) Blocking the UI Thread
提升代码的运算效率是改善性能的一方面,让代码执行在哪个线程也同样很重要。我们都知道Android的Main Thread也是UI Thread,它需要承担用户的触摸事件的反馈,界面视图的渲染等操作。这就意味着,我们不能在Main Thread里面做任何非轻量级的操作,类似I/O操作会花费大量时间,这很有可能会导致界面渲染发生丢帧的现象,甚至有可能导致ANR。防止这些问题的解决办法就是把那些可能有性能问题的代码移到非UI线程进行操作。
6) Container Performance
另外一个我们需要注意的运算性能问题是基础算法的合理选择,例如冒泡排序与快速排序的性能差异:
避免我们重复造轮子,Java提供了很多现成的容器,例如Vector,ArrayList,LinkedList,HashMap等等,在Android里面还有新增加的SparseArray等,我们需要了解这些基础容器的性能差异以及适用场景。这样才能够选择合适的容器,达到最佳的性能。
相关推荐
本篇文章旨在深入探讨ARM Cortex-A 系列处理器的不同型号及其特性,并通过对比分析帮助读者更好地理解它们之间的差异,以便于在实际项目中做出合适的选择。 #### ARM Cortex-A 系列概述 ARM Cortex-A 内核与ARM ...
《深入解析Android底层代码:libcore篇》 在Android系统中,libcore是核心库的一部分,它提供了大量的Java标准库的实现,包括I/O、XML解析、加密算法等关键功能。libcore作为Android系统与Java应用程序之间的桥梁,...
本篇文章将从以下几个方面对这个源码进行详细解读: 一、Android开发基础 在Android平台上构建应用程序,主要使用Java或Kotlin语言。本例中的源码可能采用Java编写,因为Java是早期Android开发的主要语言。开发者...
ADT是Google为Android开发者提供的一款强大的工具,它包含了一系列用于构建、调试和发布Android应用的组件,极大地简化了Android应用的开发流程。 1. **创建新项目** 在Eclipse中,通过选择“File” > “New” > ...
不同Cortex-M系列处理器在性能上存在差异,主要体现在核心频率、指令执行速度等方面。例如,Cortex-M0/M0+由于采用简单的架构,性能相对较低;而Cortex-M7作为高性能成员,核心频率可达800MHz以上,并支持复杂的外设...
AES通过一系列复杂的数学运算(如替换、置换和混淆)来实现数据的加密,保证了信息的安全性。 在Android中实现AES加密,你需要遵循以下步骤: 1. **生成密钥**:使用KeyGenerator类生成AES密钥。例如: ```java ...
本篇文章将深入探讨Android平台上的JNI使用,以及如何通过NDK(Native Development Kit)来实现C++代码的调用,从而提升应用的运行效率。 ### JNI基础 1. **JNI接口定义**:JNI接口由一系列的C函数组成,这些函数...
Android NDK(Native Development Kit)是Google为Android平台提供的一套工具,允许开发者使用C、C++等原生代码编写应用程序的一部分,以提高性能或利用特定硬件功能。JNI(Java Native Interface)是Java平台的标准...
这篇文档将深入解析Android 4.0环境下指南针应用的开发源码,主要针对使用Java编程语言实现的Android应用开发者。指南针应用是Android平台上一个常见的实用工具,它能够显示设备的方向,通常基于地球磁场来指示北方...
这款处理器拥有高速运算能力,支持多种硬件加速器和多媒体编码解码,能够满足收银秤的性能需求。硬件平台还包括512MB NAND Flash存储和512MB DDR2内存,以及HDMI显示接口等丰富的外设连接选项。 在软件实现上,系统...
然而,为了获得更好的随机性,文章引用了George Marsaglia提出的高统计性质的伪随机数列生成器程序,如moa_rand函数,该函数通过一系列复杂的数学运算来生成近似随机的数值。 在Android设备上,开发者可以通过调用...
4. **Android开发环境**:包括Android SDK(软件开发工具包)、Android Studio等,它们提供了一系列工具,如模拟器、编译器、调试器,帮助开发者进行Android应用的编写、测试和打包。 5. **Android工程的重要部分**...
7. **源码分析**:博客提到的“源码”标签可能意味着作者深入解析了Matrix类的内部实现,理解了其如何进行矩阵运算和图像变换,这对于深度定制和优化性能是十分有价值的。 8. **工具**:标签中的“工具”可能指的是...
该系列是高性能系列中的佼佼者,特别适合于需要DSP功能的应用场合。其主要特性包括: - 在180MHz时钟频率下,CoreMark得分为608分,提供高达2MB的双银行Flash存储器以及256KB SRAM。 - 集成了SDRAM控制器、TFT LCD...
在Android应用开发中,后台系统通常是指服务端部分,负责处理数据、逻辑运算以及与前端交互等功能。 1. **服务端架构设计**:后台系统通常基于某种服务端架构,如MVC(模型-视图-控制器)、MVVM(模型-视图-...
《安卓虚拟机Dalvik指令...通过熟练掌握Dalvik指令集,开发者和安全研究人员能够更好地理解和优化Android应用的性能,或者分析和调试应用的行为。了解Dalvik指令集对于深入理解Android系统的内部运作机制具有重要意义。
5. **性能优化**:虽然Matrix提供了强大的功能,但频繁的矩阵运算可能导致性能下降。因此,在处理大量文本或复杂变换时,需要考虑优化策略,比如预计算变换、减少不必要的重绘等。 6. **实战应用**:MatrixText.zip...
在本篇文档中,我们将深入探讨基于ARMv8-A架构的ARM体系结构,了解其核心概念、组件以及对计算机性能的影响。 首先,ARMv8-A架构是ARM公司的第六代64位架构,它扩展了原有的32位架构,引入了AArch64状态,支持64位...
本篇文章将深入探讨Dalvik VM的字节码及其指令格式,基于Android 2.3.7源码进行解析。** 首先,我们需要理解Dalvik字节码的概念。Dalvik字节码是一种专门为Android设计的中间代码,与Java虚拟机(JVM)中的Java字节...