Optimisation des performances Optimisation du code Java (Android) (4)

Cet article est reproduit de : Trinea

Cet article est la troisième partie de l'optimisation des performances Android - optimisation du code Java (Android). Présente principalement des méthodes d'optimisation des performances et d'optimisation du réseau dans le code Java , y compris la mise en cache, l'asynchrone, le délai, le stockage de données, les algorithmes, JNI, la logique et d'autres méthodes d'optimisation.

1. Réduire le temps d'exécution.Cette
partie comprend plusieurs méthodes d'optimisation : mise en cache, optimisation du stockage de données, optimisation des algorithmes, JNI, optimisation logique et optimisation de la demande.
(1). Le
cache de cache comprend principalement le cache d'objets, le cache d'E/S, le cache réseau et le cache de base de données. Le cache d'objets peut réduire l'allocation de mémoire, le cache d'E/S réduit le nombre de lectures et d'écritures sur le disque, le cache réseau réduit la transmission réseau et le cache de base de données réduit la base de données. fréquence d'accès.
Parmi les vitesses de lecture et d'écriture de la mémoire, des fichiers, des bases de données et des réseaux, la mémoire est la meilleure et les vitesses varient par ordres de grandeur. Essayez donc de stocker des données qui nécessitent un accès fréquent ou qui consomment une grande somme d'argent une fois consultées. la cache.

 

Le cache est couramment utilisé sous Android :
 a.   Pool de threads
b.   Cache d'images Android , cache de carte SD d'images Android , cache de prélecture de données
c. Le cache de messages
réutilise le message précédent via handler.obtainMessage, comme suit :

d.Cache  ListView

E.  Mise en cache réseau :
la base de données met en cache la réponse http et détermine le délai d'expiration du cache en fonction du champ Cache-Control dans les informations d'en-tête http.
f. La mise en cache des E/S de fichiers
utilise un flux d'entrée avec une stratégie de mise en cache, BufferedInputStream remplace InputStream, BufferedReader remplace Reader et BufferedReader remplace BufferedInputStream. Il s'applique à la fois aux E/S de fichier et de réseau.
g.  Cache de mise en page
h. Autres caches de données qui nécessitent un accès fréquent ou consomment une grande quantité de données une fois consultés

 

(2) L'optimisation du stockage des données
comprend la sélection des types de données et des structures de données.
a. Sélection du type de données :
utilisez StringBuilder au lieu de String pour l'épissage de chaînes et utilisez StringBuilder au lieu de StringBuffer dans des situations non simultanées. Si vous avez une compréhension générale de la longueur de la chaîne, par exemple environ 100 caractères, vous pouvez directement spécifier la taille initiale avec new StringBuilder(128) pour réduire la réallocation lorsque l'espace est insuffisant.
Le traitement des types 64 bits tels que long double est plus lent que celui des types 32 bits tels que int. L'
utilisation de SoftReference et WeakReference est plus propice au garbage collection du système que les applications fortes normales. Le
type final est stocké dans la zone constante et est plus efficace en lecture.
LocalBroadcastManager remplace le BroadcastReceiver ordinaire et l'efficacité est la même. La sécurité est plus élevée

 

b. 数据结构选择
常见的数据结构选择如:
ArrayList和LinkedList的选择,ArrayList根据index取值更快,LinkedList更占内存、随机插入删除更快速、扩容效率更高。一般推荐ArrayList。
ArrayList、HashMap、LinkedHashMap、HashSet的选择,hash系列数据结构查询速度更优,ArrayList存储有序元素,HashMap为键值对数据结构,LinkedHashMap可以记住加入次序的hashMap,HashSet不允许重复元素。
HashMap、WeakHashMap选择,WeakHashMap中元素可在适当时候被系统垃圾回收器自动回收,所以适合在内存紧张型中使用。
Collections.synchronizedMap和ConcurrentHashMap的选择,ConcurrentHashMap为细分锁,锁粒度更小,并发性能更优。Collections.synchronizedMap为对象锁,自己添加函数进行锁控制更方便。

 

Android也提供了一些性能更优的数据类型,如SparseArray、SparseBooleanArray、SparseIntArray、Pair。
Sparse系列的数据结构是为key为int情况的特殊处理,采用二分查找及简单的数组存储,加上不需要泛型转换的开销,相对Map来说性能更优。不过我不太明白为啥默认的容量大小是10,是做过数据统计吗,还是说现在的内存优化不需要考虑这些东西,写16会死吗,还是建议大家根据自己可能的容量设置初始值。

 

(3). 算法优化
这个主题比较大,需要具体问题具体分析,尽量不用O(n*n)时间复杂度以上的算法,必要时候可用空间换时间。
查询考虑hash和二分,尽量不用递归。可以从结构之法 算法之道微软、Google等面试题学习。

 

(4). JNI
Android应用程序大都通过Java开发,需要Dalvik的JIT编译器将Java字节码转换成本地代码运行,而本地代码可以直接由设备管理器直接执行,节省了中间步骤,所以执行速度更快。不过需要注意从Java空间切换到本地空间需要开销,同时JIT编译器也能生成优化的本地代码,所以糟糕的本地代码不一定性能更优。
这个优化点会在后面单独用一片博客介绍。

 

(5). 逻辑优化
这个不同于算法,主要是理清程序逻辑,减少不必要的操作。

 

(6). 需求优化
这个就不说了,对于sb的需求可能带来的性能问题,只能说做为一个合格的程序员不能只是执行者,要学会说NO。不过不能拿这种接口敷衍产品经理哦。

 

2、异步,利用多线程提高TPS
充分利用多核Cpu优势,利用线程解决密集型计算、IO、网络等操作。
关于多线程可参考:Java线程池
在Android应用程序中由于系统ANR的限制,将可能造成主线程超时操作放入另外的工作线程中。在工作线程中可以通过handler和主线程交互。

 

3、提前或延迟操作,错开时间段提高TPS
(1) 延迟操作

不在Activity、Service、BroadcastReceiver的生命周期等对响应时间敏感函数中执行耗时操作,可适当delay。
Java中延迟操作可使用ScheduledExecutorService,不推荐使用Timer.schedule;
Android中除了支持ScheduledExecutorService之外,还有一些delay操作,如
handler.postDelayed,handler.postAtTime,handler.sendMessageDelayed,View.postDelayed,AlarmManager定时等。

 

(2) 提前操作
对于第一次调用较耗时操作,可统一放到初始化中,将耗时提前。如得到壁纸wallpaperManager.getDrawable();

 

4、网络优化
以下是网络优化中一些客户端和服务器端需要尽量遵守的准则:
a. 图片必须缓存,最好根据机型做图片做图片适配
b. 所有http请求必须添加httptimeout

c. 开启gzip压缩
d. api接口数据以json格式返回,而不是xml或html
e. 根据http头信息中的Cache-Control及expires域确定是否缓存请求结果。

f. Déterminez si la connexion demandée par le réseau est persistante.
G. Réduisez le nombre de requêtes réseau et fusionnez les requêtes de manière appropriée côté serveur.
h. Réduire le nombre de redirections
i. Le temps de réponse côté serveur de l'interface API ne dépasse pas 100 ms.
Google travaille sur un projet visant à réduire la vitesse des pages Web mobiles à 1 seconde. Nous prêtons attention à https:/ /developers.google.com/speed/docs/insights/ mobile


Je suppose que tu aimes

Origine blog.csdn.net/skylovesky/article/details/26462985
conseillé
Classement