【Android】性能实践—编码优化与布局优化学习笔记
编码优化
使用场景
- 如果需要拼接字符串,优先使用StringBuffer和StringBuilder进行凭借,他们的性能优于直接用加号进行拼接,因为使用加号连接符会创建多余的对象
- 一般情况下使用基本数据类来代替封装数据类型(比如int优于Integer)
- 当返回一个String类型的数据时,如果明确知道返回后的字符串用于进行拼接操作,那么可以考虑返回StringBuffer,因为StringBuffer是一个对象的引用而String的话就是创建了一个短生命周期的临时对象
- 类似于第二条,基本数据类型数组也优于对象数据类型数组(a[]和b[]使用起来效率比c(a, b)[]高得多)
静态优于抽象
当我们只想调用某个对象的某个方法去实现一个功能的时候,可以将该方法设置为静态方法,因为调用静态方法可以不用创建对象,也可以使得调用速度提升。
class Utils {public static int add(int a, int b) {return a + b;}
}// 调用静态方法,不需要创建 Utils 的对象
int result = Utils.add(3, 5);
使用static和final修饰符
内存效率:
static关键字使变量成为类变量,而不是实例变量。这样,不管创建多少个类的实例,常量在内存中只存在一份,节省内存空间。
public class MyClass {public static final int MAX_VALUE = 100;
}
不可变性:
final关键字使变量成为常量,一旦赋值后不能改变。这确保了常量的值不会被意外修改,从而提高了代码的安全性和可靠性。
public class MyClass {public static final int MAX_VALUE = 100;
}
全局访问:
static使得常量可以通过类名直接访问,无需创建类的实例,方便全局使用。
int maxValue = MyClass.MAX_VALUE;
编译期常量:
static final常量在编译时就被确定,因此在编译期可以进行优化,比如内联(在使用常量的地方直接替换为常量值)。
public class MyClass {public static final int MAX_VALUE = 100;
}
// 在其他地方使用时
int value = MyClass.MAX_VALUE; // 编译时会直接替换为 100
使用增强型for循环
有三个循环方式:
static class Counter {int mCount;
}Counter[] mArray = ...public void zero() {int sum = 0;for (int i = 0; i < mArray.length; ++i) {sum += mArray[i].mCount;}
}public void one() {int sum = 0;Counter[] localArray = mArray;int len = localArray.length;for (int i = 0; i < len; ++i) {sum += localArray[i].mCount;}
}public void two() {int sum = 0;for (Counter a : mArray) {sum += a.mCount;}
}
首先,zero()方法是最慢的一种,因为循环的判断条件为 i < mArray.length ,也就是说在每一层循环进行判断时都要重新计算一遍mArray的长度
其次,one()方法相对第一种就快了很多,它直接在循环前就用len保存了长度,不用每层遍历都再计算一遍
two()方法在没有JIT(Just In Time Compiler)的设备上是运行最快的,而在有JIT的设备上运行效率和one()方法不相上下
“JIT” 指的是 “Just-In-Time” 编译,它是一种动态编译技术,用于提高 Java 程序的执行效率。JIT 编译器在 Java 虚拟机(JVM)运行时将字节码编译成本地机器码,从而加快程序的执行速度。
JIT 编译的工作原理
- 解释执行:
- 初始阶段,Java 程序的字节码由 JVM 的解释器逐行解释执行。解释执行通常较慢,但不需要编译阶段的开销。
- 热点代码检测:
- JVM 会监控代码的执行情况,识别那些频繁执行的代码段,这些代码段被称为“热点代码”。
- 编译为机器码:
- 一旦某段代码被识别为热点代码,JIT 编译器会将这段字节码编译成机器码,生成本地可执行代码,从而提高运行速度。
- 优化:
- JIT 编译器还会对热点代码进行各种优化,如内联、循环展开、常量折叠等,以进一步提高性能。
- 缓存和重用:
- 编译后的机器码会被缓存,以便后续的调用可以直接使用这些优化后的代码,避免重复编译。
使用封装好的API
Java语言当中其实给我们提供了非常丰富的API接口,我们如果能使用系统提供的API就尽量使用,因为系统的API基本上比我们自己写的代码要快得多,它们的很多功能都是通过底层的汇编模式执行的。
避免在内部调用Getters/Setters方法
下面一个例子:
public class Calculate {private int one = 1;private int two = 2;public int getOne() {return one;}public int getTwo() {return two;}public int getSum() {return getOne() + getTwo();}
}
就属于在内部调用getters/setters方法
但其实我们在类的内部可以直接使用类中的封装字段:
public int getSum() {return one + two;
}
布局优化
重用布局文件
<include>的使用
目前几乎所有的软件都会有一个头布局,这个头布局是在所有界面都要使用,但是如果在每个界面都写一次那就太麻烦了,我们可以新建一个布局专门表示头布局,当其他界面要使用的时候直接使用<include>调用就可以了
假设我们随便建了一个头布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"android:background="#EEEEEE"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginStart="8dp"android:text="HaHa"android:textColor="#00dddd"android:textSize="20sp" />
</LinearLayout>
当我们在其他界面要使用的时候就可以直接调用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><include layout="@layout/header"/></LinearLayout>
但是如果我们本来的界面中还有别的东西,我们在引入header后所有的东西都有可能被覆盖,出现这个问题是原因是因为header的最外层布局是一个宽高都是match_parent的LinearLayout,我们可以将LinearLayout的layout_height属性修改成wrap_content就可以了,但是这种操作会影响header的界面,如何你只希望让activity_main.xml这一个界面受影响的话,那么可以使用覆写<include>属性的方式
<merge>的使用
<merge> 是 Android 布局文件中的一个特殊标签,用于优化布局结构。它的主要目的是减少布局层级,使布局文件更加高效。<merge> 标签不会创建一个新的视图层级,而是将其子视图直接合并到包含它的布局中。
使用 <merge> 标签的场景:
- 优化布局层级:
- 当你有一个布局文件(如包含多个子视图的布局)需要嵌套在其他布局中时,使用
<merge>标签可以避免多余的布局层级,从而提高渲染性能。
- 当你有一个布局文件(如包含多个子视图的布局)需要嵌套在其他布局中时,使用
- 简化布局结构:
- 避免不必要的嵌套布局,减少布局的复杂度和绘制开销。
假设有一个复杂的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me" /></LinearLayout><!-- 其他视图 -->
</LinearLayout>
这个布局的嵌套关系如图:

可以使用merge对布局进行优化:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><includelayout="@layout/optimized_sub_layout" /><!-- 其他视图 -->
</LinearLayout>
在 optimized_sub_layout.xml 中使用 <merge> 标签:
<!-- res/layout/optimized_sub_layout.xml -->
<merge xmlns:android="http://schemas.android.com/apk/res/android"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me" />
</merge>
优化后布局变成了

参考博客:Android最佳性能实践(三)——高性能编码优化_android 硬编码 节省码率-CSDN博客
Android最佳性能实践(四)——布局优化技巧_android中对布局进行优化-CSDN博客
已经到底啦!!
相关文章:
【Android】性能实践—编码优化与布局优化学习笔记
编码优化 使用场景 如果需要拼接字符串,优先使用StringBuffer和StringBuilder进行凭借,他们的性能优于直接用加号进行拼接,因为使用加号连接符会创建多余的对象一般情况下使用基本数据类来代替封装数据类型(比如int优于Integer&…...
如何合规与安全地利用专业爬虫工具,构建企业数据竞争优势
摘要: 本文深入探讨了在当今大数据时代,企业如何通过合规且安全的方式运用专业爬虫工具,有效收集并分析海量信息,进而转化为企业独有的数据优势。我们不仅会介绍最佳实践,还会讨论关键技术和策略,帮助企业…...
自动驾驶三维车道线检测系列—OpenLane数据集介绍
文章目录 1. 背景介绍2. OpenLane数据集详细描述2.1 数据集特点2.2 坐标系定义 3. 使用方法4. 结论 1. 背景介绍 自动驾驶技术的发展日新月异,而3D车道感知是其核心之一。本文将深入介绍OpenLane数据集——迄今为止规模最大、最接近真实世界的3D车道数据集。我们将…...
CMakeList学习笔记
设置项目:project project(planning VERSION 1.0.0 LANGUAGES CXX) # 项目的名字 版本 1.1.0 编程语言 CXX 设置包含目录:include_directories、targer_include_directories 设置编译类型:add_executable、add_library add_executable(demo d…...
将git默认的编辑器设置为vin
git默认编辑器现状 如下,很多linux发行版,未加修改的情况下,git的默认编辑器使用起来不太方便 Signed-off-by: root <rootxxx.COM># Please enter the commit message for your changes. Lines starting # with # will be ignored, a…...
ros2_control 6 自由度机械臂
系列文章目录 前言 ros2_control 是一个实时控制框架,专为普通机器人应用而设计。标准的 c 接口用于与硬件交互和查询用户定义的控制器命令。这些接口增强了代码的模块化和与机器人无关的设计。具体的应用细节,例如使用什么控制器、机器人有多少个关节以…...
Python 在自动化中的实际应用:用 Python 简化繁琐任务
文章目录 1、概述2、自动化文件和目录管理3.数据处理与分析4.网页爬虫5. 系统管理6。定时任务7.结语 1、概述 这篇文章将深入探讨Python在自动化中的实际应用,帮助您用Python简化繁琐任务。 我们将从多个方面入手,展示如何利用Python进行文件管理、数据…...
解释 Spring 框架的核心模块(如 IoC 容器、AOP )及其工作原理。描述如何使用 Spring Boot 快速搭建一个 RESTful Web服务?
Spring框架是一个广泛使用的Java企业级应用程序开发框架,它提供了一系列的模块来帮助开发者构建健壮、可测试、可维护的应用程序。 其中,最核心的模块包括IoC容器和AOP(Aspect Oriented Programming,面向切面编程)。 …...
数据分析详解
一、数据分析教程 1. 入门教程 在线课程:如Coursera、Udemy、网易云课堂等平台提供了大量数据分析的入门课程,涵盖统计学基础、Python/R语言编程、数据可视化等内容。书籍推荐:《Python数据分析实战》、《R语言实战》等书籍是数据分析入门的…...
SpringCloud之@FeignClient()注解的使用方式
FeignClient介绍 FeignClient 是 Spring Cloud 中用于声明一个 Feign 客户端的注解。由于SpringCloud采用分布式微服务架构,难免在各个子模块下存在模块方法互相调用的情况。比如订单服务要调用库存服务的方法,FeignClient()注解就是为了解决这个问题的…...
20.rabbitmq插件实现延迟队列
问题 前面谈到基于死信的延迟队列,存在的问题:如果第一个消息延时时间很长,而第二个消息延时时间很短,第二个消息并不会优先得到执行。 下载插件 地址:https://github.com/rabbitmq/rabbitmq-delayed-message-excha…...
TS如何处理js模块的类型?
现在很多插件都直接用ts开发了,本身包含了类型定义常见的第三方插件,都有’types/xxx’包,安装即可使用其他的,可通过declare module定义类型 比如: // someModule.js export function greet(name) {return Hello, $…...
GPS定位系统(VUE框架)
源码下载:小宅博客网 博主之前写的《GPS定位系统(MVC框架)》版本,并没有做到前后端分离,不太适合多人协作开发,这边博主分享一个基于asp.net web api vue3的GPS定位系统框架,本框架继承了MVC框…...
分布式光伏并网AM5SE-IS防孤岛保护装置介绍——安科瑞 叶西平
产品简介 功能: AM5SE-IS防孤岛保护装置主要适用于35kV、10kV及低压380V光伏发电、燃气发电等新能源并网供电系统。当发生孤岛现象时,可以快速切除并网点,使本站与电网侧快速脱离,保证整个电站和相关维护人员的生命安全。 应用…...
神奇的方法解决Navicat闪退
原因 打开Navicat操作上面的工具等就会闪退,原因竟然是屏幕划词!!! 解决方法 看别人提到有道词典的划词功能的原因 我没有安装有道词典,但我安装豆包,它也有划词翻译的功能,关闭即可...
openmv学习笔记(24电赛笔记)
感光元件 openmv采用小孔摄像模式,将图像映射到感光原件上面,来传递图片,通过图片快速的刷新行成视频,在IDE中通过对感光原件的编辑可以控制视频的效果。 重置感光元件到默认状态 import sensor #导入感光元件这个库sensor.res…...
Linux shell编程学习笔记67: tracepath命令 追踪数据包的路由信息
0 前言 网络信息是电脑网络信息安全检查中的一块重要内容,Linux和基于Linux的操作系统,提供了很多的网络命令,今天我们研究tracepath命令。 Tracepath 在大多数 Linux 发行版中都是可用的。如果在你的系统中没有预装,请根据你的…...
生鲜云订单零售系统小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,商品分类管理,商品信息管理,订单评价管理,订单管理,系统管理 微信端账号功能包括:系统首页,商品信息&#…...
BLE自适应跳频算法详解
前言 (1)自适应跳频算法是相当的简单,小学生都能够看懂,而且网上已经有相当多的关于自适应跳频算法的介绍。既然如此,为什么我还要写这样一篇博客呢? (2)原因很简单,我发…...
[Meachines] [Easy] Beep Elastix-CMS-LFI
信息收集 IP AddressOpening Ports10.10.10.7TCP:22, 25, 80, 110, 111, 143, 443, 993, 995, 3306 $ nmap -p- 10.10.10.7 --min-rate 1000 -sC -sV Nmap scan report for 10.10.10.7 (10.10.10.7) Host is up (0.53s latency). Not shown: 65486 filtered tcp ports (no-…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
