精通安卓性能优化-第一章(四)

Android开发初期之后怎么提升?怎么才能叫精通?方向在哪? 1. Android开发初期之后怎么提升? 首先第一个问题:Android开发初期之后怎么提升?说到这个问题,就不得不先搞清楚 “为什么很多人会一直停留在两三年的水平上,而后一直在重复以往的经验,原地踏步?” 我认为最主要的一个原因就是这部分开发者缺乏主观能动性,或者说缺乏能支撑你坚持学习的兴趣。如果你对Android开发没有太大的兴趣,那么还是尽早换方向吧。有了兴趣,然后就是要有一个比较正确的钻研路线,不要这也搞那也抓,最后什么都知道点,但也就只是知道点儿。 一个很好的例子就是我们平时在开发过程中都会用 阅读详情

缓存结果

当计算比较昂贵的时候,记录过去的结果使得将来可以更快的得到它是一个很好的方法。缓存的使用非常简单,通常的伪代码样式如Listing 1-10所示。

Listing 1-10 使用Cache

result = cache.get(n);    // 传入参数n作为key

if (result == null) {
    // 结果没有在cache中,所以我们计算并且添加到cache
    result = computeResult(n);
    cache.put(n, result);    // n作为key,result作为value
}

return result;

计算Fibonacci序列的快速递归算法产生了许多重复的计算,可以从存储结果中获取极大的收益。比如,计算第50000个序列值需要计算第25000个序列值和第24999个序列值。计算第25000个序列值需要第12500个值和第12499个值,当计算第24999个值的时候再次需要计算同样的第12500个值和12499个值。Listing 1-11给出了一个更好的实现,使用cache。

如果你熟悉Java,你可能尝试使用HashMap作为cache,它会工作的很好。然而,Android定义了SparseArray,当key是一个整型值的时候比HashMap更加有效率:HashMap需要key的类型为java.lang.Integer,SparseArray使用基本类型int作为key。因此使用HashMap将会触发许多Integer对象的创建,SparseArray简单的避免了。

Listing 1-11 更快的递归实现,使用BigInteger, long和Cache

public class Fibonacci {
    public static BigInteger computeRecursivelyWithCache (int n) {
        SparseArray<BigInteger> cache = new SparseArray<BigInteger>();
        return computeRecursivelyWithCache(n, cache);
    }
    
    private static BigInteger computeRecursivelyWithCache (int n, SparseArray<BigInteger> cache) {
        if (n > 92) {
            BigInteger fN = cache.get(n);
            
            if (fN == null) {
                int m = (n/2) + (n&1);
                BigInteger fM = computeRecursivelyWithCache(m, cache);
                BigInteger fM_1 = computeRecursivelyWithCache(m - 1, cache);
                if ((n&1) == 1) {
                    fN = fM.pow(2).add(fM_1.pow(2));
                } else {
                    fN = fM_1.shiftLeft(1).add(fM).multiply(fM);
                }
                cache.put(n, fN);
            }
            return fN;
        }
        return BigInteger.valueOf(iterativeFaster(n));
    }
    
    private static long iterativeFaster (int n) {    // 看Listing 1-5的实现
    
    }
}

测量显示computeRecursivelyWithCache(50000)大约需要20毫秒,比computeRecursivelyFasterUsingBigIntegerAndPrimitive(50000)减少了大约50毫秒。显然,这个差值随着n增长而增长:当n等于200,000的时候,两个方法分别需要50毫秒和330毫秒左右。


因为减少了许多的BigInteger对象的分配,当使用cache的时候BigInteger是不可变对象的问题已经不再严重。然而,当计算fN的时候3个BigInteger对象仍然被创建(其中两个的生命周期非常短),所以使用可变的整型仍然能够提升性能。


尽管使用HashMap代替SparseArray会慢一些,但是好处是使代码不是安卓独有的,即可以在非安卓的环境里面使用完全一样的代码(不使用SparseArray)。

NOTE:安卓定义了许多sparse array的类型:SparseArray(整数映射到对象),SparseBooleanArray(映射整数到布尔值), SparserIntArray(映射整数到整数)。


android.util.LruCache<K,V>

另外一个值得提到的类是android.util.LruCache<K,V>,在Android 3.1(Honeycomb)引入,使分配缓存的时候定义最大size非常简单。任选的,你也可以重写sizeOf()方法去改变每个缓存项的大小是如何计算的。因为它从安卓3.1开始支持,如果你的目标安卓版本低于3.1,你最终将只能使用一个不同的类在你的应用中实现缓存。这是一个很需要考虑的场景,因为Android3.1在当前市场安卓设备上仅占很少的一部分。一个可以替代的方案是继承java.util.LinkedHashMap,重写removeEldestEntry方法。LRU cache首先丢弃最近很少使用的项目。在一些应用程序中,你可能有相反的需求,即缓存首先丢弃最近最常使用的项目。安卓现在没有定义像MruCache这样一个类,这并不奇怪,因为MRU缓存并不常用。

当然,cache用来保存信息而不是计算。cache的通常使用方式是去保存下载数据,比如图片,仍然需要严格控制内存的消耗。比如,基于一个标准去重写LruCache的sizeOf( )方法限制缓存的大小而不是简单的限制缓存项的数目。尽管我们主要讨论LRU和MRU策略,在你的cache可能需要不同的策略去最大化命中率。比如,你的缓存首先丢弃不需要消耗很多就可以重建的项,或者简单的随机丢弃项目。遵循务实的态度设计你的cache。一个简单的替换策略比如LRU可以产生巨大的结果,可以使你的资源集中于其他更加重要的问题。

我们已经看到了几个不同的技巧去优化Fibonacci序列的计算。每个技巧都有它的优点,没有一个是最优的。通常最好的结果通过组合多个不同的技巧去实现而不是依赖于其中的某一个。比如,一个更快的实现可能使用了预计算(一种缓存机制),甚至可能稍微修改公式。(Hint:比如当n是4的倍数的时候)。需要怎样去计算,使得F(Integer.MAX_VALUE)耗时小于100毫秒?

安卓ROM开发入门到精通 包含内容: 第一期主要为ROM开发,ROM定制技术资料,提供一些工具为主 ,让你学会简单做包,和基本的ROM DIY技巧,偶尔附加一些必要的教程。第二期针对ROM技术教程,细分知识点,重点剖析、解释,形成一系列的知识文档供查阅,目前大纲已列出,可以教你从零开始做包。 1.第一期---技术资料(维护更新): 更新日志: 1.书籍-Android系统级深入开发——移植与调试 2.开发工具-And... 阅读详情

相关推荐

Android/JAVA性能优化:从入门到精通(万字讲解!!!)

在当今快速发展的移动应用市场中,用户体验是决定应用成功与否的关键因素之一。无论是在Android还是其他平台上,应用的性能表现直接影响用户的满意度和应用的市场竞争力。作为开发者,掌握Java性能优化的技巧不仅能够提升应用的流畅度,还能延长应用的生命周期,从而在激烈的市场竞争中脱颖而出。本文将从内存管理、线程与并发、代码优化、网络优化、数据库优化等多个方面,深入探讨Java性能优化的策略和技巧,帮助开发者在实际开发中提升应用性能,优化用户体验。提示:以下是本篇文章正文内容,下面案例可供参考。

学无止境 1222

Android 缓存机制(一)

相册图片预取缓存策略是内存缓存(硬引用LruCache、软引用SoftReference)、外部文件缓存(context.getCachedDir()),缓存中取不到的情况下再向服务端请求下载图片。同时缓存三张图片(当前预览的这张,前一张以及后一张)。  内存缓存 //需要导入外部jar文件 android-support-v4.jar   import android.support.v4

bwf_erg的博客 289

从零到精通:Android开发学习路径全解析

Android开发作为移动互联网核心技术之一,其技术栈经历了从基础SDK到现代架构的演进。理解Android系统架构需要扎实的Java/Kotlin基础,掌握Activity生命周期、UI组件等核心概念。在进阶阶段,开发者需要关注性能优化、架构设计等关键技术,如内存管理、MVVM模式实现等。通过项目实践和源码阅读,开发者可以深入理解Binder机制、AMS等底层原理。本文以知名博主stormzhang的学习路径为例,系统梳理了从Java基础到Flutter跨平台的完整学习框架,为移动开发者提供了一条清晰的技

weixin_34326558的博客 268

LinkedHashMap的removeEldestEntry方法

LinkedHashMap有一个removeEldestEntry(Map.Entry eldest)方法,通过覆盖这个方法,加入一定的条件,满足条件返回true。当put进新的值方法返回true时,便移除该map中最老的键和值。   package scorpio.

wangshione的专栏 2万+

android游戏开发从入门到精通,androidstudio插件开发

如果基础知识有太多不会的就危险了,必须好好准备,这是躲不过的。这个阶段有不会的很正常,因为对方正在确定你的水平,但态度一定要积极主动,即使之前没有研究过,也要结合一些经验说出推测的结果,切忌直接说“我不会”。我只贴上我写过内容的链接,剩下的朋友们去网上一搜,或者去买本书看下就好了,建议看 《Java 编程思想》,不仅解答了 What 还有探讨 Why。我这次面试算法问的比较少,只手写过插入排序,建议把冒泡、插入、归并时间复杂度和实现熟悉熟悉,最好手写下,不然现场手写的时候容易出错。

2401_84408418的博客 1419

深度解析ZGC:高效垃圾回收的应用与优化

随着现代应用对性能的要求不断提高,ZGC(Z Garbage Collector)作为一种低暂停时间的垃圾回收器,已成为处理大规模堆内存的理想选择。本文介绍了 ZGC 的基本原理与技术架构,重点分析了其在 JDK11 中的应用与优化策略。通过对 ZGC 性能特点的探索,本文旨在帮助开发者深入理解其在高并发、大数据场景下的表现,以及如何通过合理调优提升系统的内存管理效率和稳定性。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 177万+

Java LinkedHashMap removeEldestEntry()方法与示例

LinkedHashMap类removeEldestEntry()方法 (LinkedHashMap Class removeEldestEntry() method) removeEldestEntry() method is available in java.util package. removeEldestEntry()方法在java.util包中可用。 removeEldestE...

cumt30111的博客 5318

Android面试指南与参考答案——基于领星安卓开发职位要求

本文基于领星安卓开发职位要求,整理Android开发岗位常见面试问题与参考答案。核心内容包括:1.基础知识:Android四层架构、SDK组件及API使用;2.编程语言:Kotlin优势、Jetpack组件应用及MVVM/MVP架构对比;3.开发工具:性能优化方法及版本适配策略;4.实战经验:第三方SDK集成和APP发布流程。针对1-3年经验者及应届生,提供代码示例和项目实例说明,覆盖框架搭建、性能优化等关键技术点,帮助候选人系统准备面试,突出技术能力和问题解决思维。

郑伟强dev的专栏 1192

LinkedHashMap 学习笔记

LinkedHashMap 在 Map 集合框架的位置 LinkedHashMap简介 LinkedHashMap是Map 接口的 哈希表(hash table) 和 链表(linked list) 的实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于,它维护一个双链接列表,该列表贯穿其所有条目。这个链表定义了迭代的顺序,通常是键值插入到 map 中的插入顺序(insertio...

五石之瓠 以为大樽 浮于江湖 悠笑人生 550

vue引入使用腾讯地图

// 引入鹅厂地图 initMap(lat = 0.0000000, lng = 0.0000000) { // 定义地图中心点坐标- var center = new TMap.LatLng(lat, lng) // 定义map变量,调用 TMap.Map() 构造函数创建地图 map = new TMap.Map(document.getElementById('txMapBox'), { center: center, // 设.

LiangRZ 4536

Python抓取摄像头图像,进行AI识别(一)

本文介绍了如何用Python获取海康威视摄像头的图像并进行AI识别。主要内容包括:1)准备工作,包括摄像头IP设置和密码重置方法;2)使用Python的Requests库通过ISAPI接口获取实时图像;3)示例代码展示如何保存摄像头图像。整个过程为后续AI图像识别提供了基础,通过简单的Python代码即可实现专业监控设备的图像采集功能。

Hahafantuan的博客 1513

Android从入门到精通

全书共分15章,内容包括Android快速入门、Android模拟器与常用命令、用户界面设计、高级用户界面设计、基本程序单元Activity、Android应用核心Intent、Android事件处理、资源访问、图形图像处理技术、多媒体应用开发、Content Provider实现数据共享线程与消息处理、Service应用、网络编程及Internet应用和基于Android的家庭理财通。[Android.游戏开发入门](美)Mario.Zechner.插图版.pdf。

github_38514857的博客 878

MuJoCo 相机图片怎么拿?视角调整获取物体图片及实时显示(附代码)

在Mujoco的仿真中,对于识别抓取场景来说,如何获得添加的body等物体的实时图像很重要,今天就分享下如何添加相机视角及可视化小方块(举例)的实时图片。复制一个scene.xml为scene_withcamera.xml,在xml中添加camera和小方块如下。设置xml文件中添加的相机body id。需要创建一个离屏渲染器。

darcsdn 2128

想学Android开发,是否必须精通Java?

想学Android开发,必然需要先精通Java,其次c++,再后面是kotlin,基本代码上系统源码framework层面都是java和c++,基本上找不到任何kotlin,源码中只有几个简单app使用是kotlin。在这里,我为大家整理了一些列Android学习资料,有需要的朋友可以扫描下方二维码,获取更多相关资料。

Eqiqi的博客 1988

【DeepSeek R1构建本地RAG知识库】数据结构化清洗-工作流自动清洗

在构建本地RAG知识库时,数据结构化清洗是关键但繁琐的步骤。传统方法效率低且易出错,而低代码/无代码平台如Dify提供了更高效的解决方案。Dify通过可视化工作流设计,集成大模型智能处理,支持多格式输入输出,无需编码即可完成复杂的数据清洗任务。文章详细介绍了数据结构化的核心困境、目标、价值及类型,并比较了TXT与Markdown在RAG系统中的适用性。最后,通过Dify平台实战演示了如何在20分钟内完成规则制度文档的结构化清洗,输出标准化数据,展示了自动化工作流在数据处理中的高效性和便捷性。

少说,多做 1222

Halcon实例转OpenCVSharp--粘连物体分割与计数(基于距离变换+分水岭算法) (附源码)

本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp应用实例--粘连物体分割与计数(基于距离变换+分水岭算法)! 本文使用的OpenCVSharp版本---》v4.5.3。 实现目标:将下图中的硬币分割出来并计算数量。 预期效果图: ...

Color Space的博客 2419

精通安卓性能优化-第一章(一)

第一章 优化Java代码 许多的安卓应用开发者从以往的经验对Java语言有很好的使用知识。从1995年出道以来,Java已经成为了一种非常流行的编程语言。有些调查指出Java在和其他语言比较的时候失去了光泽,比如Object-C或者C#,另外有些调查把Java列为最流行的语言。自然,随着移动设备的销量超过个人电脑和Android平台的成功(在2011年11月,每天激活700,000部),J...

路漫漫 其修远 1106

把 SAP Query 用到极致:ABAP Query 的核心概念、配置流程、权限与运输治理全解析

摘要:SAP Query 是一款面向业务用户的自助报表工具,可解决标准报表无法满足业务需求的问题。其核心由四大组件构成:Queries(报表定义)、InfoSets(数据视图)、User Groups(权限分组)和Translation(多语言支持)。通过SQ03、SQ02、SQ01事务码分步创建用户组、数据视图和查询,业务用户无需ABAP知识即可生成Basic List(明细)、Statistics(统计)和Ranked List(排名)三种报表形式。典型案例展示了如何为采购部门设计包含明细追溯和Top1

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 179

android性能优化从入门到精通

什么是性能优化 一款app除了要有强大的功能和交互外,在性能上也应该追求更高的要求,这样才能更好的提高用户体验 优化目的 性能指标 优化的方向 更快 流畅性 启动速度页面响应速度响应速度 更稳定 稳定性 避免出现应用崩溃(crash)避免出现应用无响应(ANR) 更省 资源节省性 内存大小安装包大小耗电量网络流量 优化详解 速度优化 内存优化 数据结构优化:数据结...

qq_23081779的博客 1765

深度学习在地质勘探中的应用:使用Python构建卷积神经网络进行地震数据分析

在本文中,我们介绍了如何利用深度学习技术,特别是卷积神经网络(CNN),来处理和分析地震数据。我们使用了Python编程语言和TensorFlow框架构建了一个CNN模型,并使用地震数据进行了训练和评估。在本文中,我们将探讨如何利用深度学习技术,特别是卷积神经网络(CNN),来处理和分析地震数据。首先,我们需要获取地震数据集。通过本文的介绍,希望您能对深度学习在地质勘探领域的应用有更深入的了解,并能够应用这些技术来解决实际问题。在准备好地震数据和构建CNN模型后,我们需要将数据分为训练集和测试集。

斌擎科技 1471

Open3D KD-tree的使用【2025最新版】

Open3d使用FLANN构建KDTree以便进行快速最近邻检索。博客长期更新,本文最近一次更新时间为:2025年1月1日,代码已同步更新至Open3D 0.18.0版本。

点云侠的博客 40万+

精通 Kotlin 安卓开发(四)

在这一简短但重要的章节中,我们强调了关于维护和实现良好应用性能和响应能力的重要要点。这些建议在应用程序优化中至关重要。因此,如果您的应用程序不遵循这些规则,您必须相应地进行优化。通过完成这一章,我们涵盖了您开发 Android 应用程序所需的一切。在下一章中,我们将对其进行测试。准备好编写一些单元测试和仪器测试!在本章中,我们学习了如何为我们的应用程序编写和运行测试。这是迈向生产的又一步。我们建立了一个书写良好且无 bug 的产品。很快,我们将实际发布它。请耐心等待,因为那一刻即将到来!

龙哥盟 434

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android性能优化:从入门到精通

本文从基础知识、优化方法和实战案例分析三个方面,详细介绍了Android性能优化的方法和技巧。性能优化是Android开发中不可或缺的一部分,对提升用户体验具有重要意义。开发者应掌握性能优化的基础知识,合理运用优化方法,以实现应用的高性能表现。未来,随着移动设备的性能不断提升,性能优化将更加重要。开发者需要关注新的优化技术和工具,不断更新优化策略,以满足用户对高性能应用的需求。同时,性能优化也需要与用户需求相结合,避免过度优化,确保应用的平衡发展。持续关注新技术。

2501_92486623的博客 357

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

QtScrcpy安卓投屏完整攻略:从入门到精通

还在为手机屏幕太小而烦恼吗?想要在大屏幕上畅玩手游却不知从何下手?QtScrcpy这款开源安卓投屏工具正是你需要的解决方案!它能将手机屏幕实时投射到电脑,支持键盘鼠标操作,让你彻底告别触摸屏的局限。 ## 🎯 为什么选择QtScrcpy? **传统投屏痛点**: - 连接复杂,步骤繁琐 - 延迟高,画面卡顿 - 不支持键鼠操作 - 无法多设备管理 **QtScrcpy优势对比**: ✅ *

gitblog_00510的博客 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android面试官:你究竟有多大的勇气,在简历上写了“精通”?

自定义 View 可以让我们产生更好的效果,app UI 美观,交互界面友好,用户青睐,用户留存率高,这就是app成功的第一步了。高级UI与自定义View有着不可分割的联系。自定义View其实并不难,为什么呢?因为自定义View无非就是显示+交互:显示由 onMeasure ->onLayout->onDraw的整个流程就将显示整个流程处理完了,而交互则是touch事件的处理;另外其他的一切你比如Canvas,Animation,Paint都是围绕着draw来进行的,所以我们需要搞懂其中的根本原理。

the shy 127

零基础玩转Windows Subsystem for Android:从安装到精通的实用指南

Windows Subsystem for Android(简称WSA)是微软推出的革命性功能,它就像在Windows 11系统中搭建了一座通往Android世界的桥梁????,让你的电脑无需复杂配置就能直接运行手机应用。想象一下,你可以在电脑上刷短视频、使用生产力APP,甚至畅玩安卓游戏,所有操作都在熟悉的Windows环境中完成。对于开发者而言,这更是测试安卓应用的利器;对于普通用户,它则打破了设...

gitblog_01031的博客 1645
上一篇: 精通安卓性能优化-第一章(三)
下一篇: 精通安卓性能优化-第一章(五)
北冥_有鱼
博客等级 码龄19年 14粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值