美文网首页Android开发经验谈Android技术知识Android开发
面试官必问的Android应用性能优化问题,你知道多少?

面试官必问的Android应用性能优化问题,你知道多少?

作者: 程序老秃子 | 来源:发表于2022-05-25 19:21 被阅读0次

前言

相信大家在面试中面试官都会问到Android性能优化的问题,性能优化这一块已经成为了面试官必问的问题之一了,这里面包含了底层逻辑和所涉及到的技术广度,面试官能够清楚的了解到你对技术的了解和掌握程度,今天我就向大家分享一些关于Android应用层的性能优化的相关问题

Android应用性能优化

应用程序的性能问题是最明显、最容易体现的一类,表现形式也五花八门,举几个例子:

● 应用程序第一次启动速度慢,或者进入某一界面速度慢

● 启动某一有动画效果的界面,动画执行过程不流畅,或者动画执行前卡顿时间长

● ListView列表滑动过程中卡顿,不流畅

● 应用程序自定义的某特定界面执行速度慢,例如Launcher应用桌面左右滑动效果不平滑

● 响应某一用户事件时长时间无响应(ANR)

● 操作数据库时,执行大量数据的增删改查操作,执行速度慢

● 应用长时间运行后,随机出现卡顿现象

除了表现形式复杂,原因也很复杂;以上的问题的原因可能不只一个,并且很多情况下并不是应用本身的问题,也有可能是系统其他层次有问题,只不过体现在应用层

所以说应用层总是首当其冲,开发人员在处理性能问题时,需要做的第一件事情就是判断是否是应用自身引起的性能问题,然后再对症下药;但有些时候应用本身逻辑正常,明显是系统的硬件配置不足引起,此时就要根据产品或项目需求,采取一些更加激进的方式优化性能,以弥补硬件配置的不足

以下从几个不同的角度总结一下应用程序性能优化的一些方法

一、基本思想

应用层的性能优化通常可以从以下几个方面考虑:

● 了解编程语言的编译原理,使用高效编码方式从语法上提高程序性能

● 采用合理的数据结构和算法提高程序性能,这往往是决定程序性能的关键

● 重视界面布局优化

● 采用多线程、缓存数据、延迟加载、提前加载等手段,解决严重的性能瓶颈

● 合理配置虚拟机堆内存使用上限和使用率,减少垃圾回收频率

● 合理使用native代码

● 合理配置数据库缓存类型和优化SQL语句加快读取速度,使用事务加快写入速度

● 使用工具分析性能问题,找出性能瓶颈

当然肯定还有很多其他的性能优化方法,此处仅列出一些经常会用到的方法;限于篇幅,以下会对其中一部分内容做介绍,希望能够对大家做性能优化工作有所帮助

二、编程技巧

写出高效的代码需要遵循两条原则

● 不执行不必要的操作

● 不分配不必要的内存

两条原则分别针对CPU和内存,完成必要操作的前提下尽可能的节省CPU和内存资源,自然执行效率要高。单纯这样说听起来很虚,毕竟没有一个统一的标准判断什么是必要和不必要的,需要结合具体情况具体分析了

1、避免创建不必要的对象

● 创建太多的对象会造成性能低下,这谁都知道,可是为什么呢?首先分配内存本身需要时间,其次虚拟机运行时堆内存使用量是有上限的,当使用量到达一定程度时会触发垃圾回收,垃圾回收会使得线程甚至是整个进程暂停运行

● 可想而知,如果有对象频繁的创建和销毁,或者内存使用率很高,就会造成应用程序严重卡顿

2、合理使用static成员

主要有三点需要掌握:

● 如果一个方法不需要操作运行时的动态变量和方法,那么可以将方法设置为static的

● 常量字段要声明为“static final”,因为这样常量会被存放在dex文件的静态字段初始化器中被直接访问,否则在运行时需要通过编译时自动生成的一些函数来初始化;此规则只对基本类型和String类型有效

● 不要将视图控件声明为static,因为View对象会引用Activity对象,当Activity退出时其对象本身无法被销毁,会造成内存溢出

3.、避免内部的Getters/Setters

● 面向对象设计中,字段访问使用Getters/Setters通常是一个好的原则,但是在Android开发中限于硬件条件,除非字段需要被公开访问,否则如果只是有限范围内的内部访问(例如包内访问)则不建议使用Getters/Setters

● 在开启JIT时,直接访问的速度比间接访问要快7倍

4、使用for-each循环

● 优先使用for-each循环通常情况下会获得更高的效率;除了一种情况,即对ArrayList进行遍历时,使用手动的计数循环效率要更高

5、使用package代替private以便私有内部类高效访问外部类成员

● 私有内部类的方法访问外部类的私有成员变量和方法,在语法上是正确的,但是虚拟机在运行时并不是直接访问的,而是在编译时会在外部类中自动生成一些包级别的静态方法,执行时内部类会调用这些静态方法来访问外部类的私有成员

● 这样的话就多了一层方法调用,性能有所损耗

● 一种解决这个问题的方法就是将外部类的私有成员改为包级别的,这样内部类就可以直接访问,当然前提是设计上可接受

6、避免使用浮点类型

● 经验之谈,在Android设备中浮点型大概比整型数据处理速度慢两倍,所以如果整型可以解决的问题就不要用浮点型

● 另外,一些处理器有硬件乘法但是没有除法,这种情况下除法和取模运算是用软件实现的。为了提高效率,在写运算式时可以考虑将一些除法操作直接改写为乘法实现,例如将“x / 2”改写为“x * 0.5”

7、了解并使用库函数

● Java标准库和Android Framework中包含了大量高效且健壮的库函数,很多函数还采用了native实现,通常情况下比我们用Java实现同样功能的代码的效率要高很多

● 所以善于使用系统库函数可以节省开发时间,并且也不容易出错

《Android 高级开发面试题以及答案整理》

下面这份资料我从2019年春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案;每一道面试题都是百分百的大厂面经真题+最优解答,包知识脉络 + 诸多细节;节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

资料中包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目,熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率

有需要的同学,可以顺手给我点赞评论支持一下

内容如果对大家有用的话,可以转发分享一下

获取方式

现在点击《Android 高级开发面试题以及答案整理》

由于篇幅有限,仅展示部分内容

一、Handlar 相关知识

二、Avtivity 相关

三、Frageant 相关

四、Service 相关

五、Android布局优化之ViewStub、include、 merge

获取方式

现在点击《Android 高级开发面试题以及答案整理》

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

Android 架构师之路还很漫长,与君共勉

PS:有问题欢迎指正,可以在评论区留下你的建议和感受;

欢迎大家点赞评论,觉得内容可以的话,可以转发分享一下

相关文章

网友评论

    本文标题:面试官必问的Android应用性能优化问题,你知道多少?

    本文链接:https://www.haomeiwen.com/subject/kdcyprtx.html