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

Android相机开发工程师:从入门到精通 《Android相机开发工程师指南:职责、技能与面试全解析》 本文系统阐述了Android相机开发工程师的核心职责与技术要点。作为移动端核心功能开发者,其主要工作包括相机应用的开发维护(Camera2API/CameraX)、功能规划实现(HDR/夜景模式等),以及团队协作交付。岗位要求扎实的Android开发能力(Kotlin/Java)、复杂问题解决能力(性能优化/兼容性调试)及团队协作精神。 阅读详情

第六章 基准测量和分析

能够测量性能是有必要的,可以决定是否需要优化,优化实际提升了什么。
性能在大多数情况下是测量完成一个操作的所需时间。比如,游戏的性能经常用每秒多少帧可以被渲染来测量,直接依赖于需要多少时间去渲染帧:为了达到60帧每秒的帧率,每个帧渲染和显示的时间需要少于16.67毫秒。同样的,像第一章讨论的那样,100毫秒的响应时间通常是为了立即显示出效果。
在本章将学习在你的应用中不同的测量方式。你同样学习如何使用Traceview分析工具,跟踪Java代码和native代码并简单的辨识应用的瓶颈。最终,学习Android的logging机制,和如何利用过滤能力。

测量时间

当需要优化代码的时候,一个操作或者一系列的操作完成需要多少时间是信息的关键部分。不知道做某件事情花费多少时间,你的优化没办法测量。Java和Android提供了如下简单API,可以用来测量时间和性能:
(1) System.currentTimeMillis
(2) System.nanoTime
(3) Debug.threadCpuTimeNanos
(4) SystemClock.currentThreadTimeMillis
(5) SystemClock.elapsedRealtime
(6) SystemClock.uptimeMillis
通常,你的应用需要调用两次这样的方法,因为单次调用是没有意义的。为了测量时间,你的应用需要一个起始时间和一个结束时间,性能通过两次值的差测量。冒着冠冕堂皇的给人傲慢感觉的风险,现在是一个很好的时间讲有每秒1,000,000,000纳秒,或者说,纳秒是一秒的百万分之一。

NOTE:尽管有些方法以纳秒为单位的返回,并不表示是纳秒精度。实际的精度依赖于平台,设备不同结果不同。相似的,System.currentTimeMillis()返回毫秒的数量但是并不保证毫秒精度。

Listing 6-1 给出了一个通常的应用。

Listing 6-1 测量时间

long startTime = System.nanoTime();

// 这里执行你期望测量的操作

long duration = System.nanoTime() - startTime;

System.out.println("Duration: " + duration);

一个重要的细节是Listing 6-1没有使用任何Android独有的。作为事实,测量代码仅使用java.lang.System, java.lang.String和java.io.PrintStream包。结果,你可以在另外一个Java应用使用相似的代码,而不必在Android设备上。Debug和SystemClock类,换句话说,是Android独有的。
尽管System.currentTimeMillis()作为一个测量时间的方法,实际上并不推荐使用,有两个原因:
(1) 它的精度不足够
(2) 改变系统时间会影响结果
代替的,你的应用可以使用System.nanoTime(),因为它提供了更好的精度。

System.nanoTime()

因为没有定义基准时间,你应该只使用System.nanoTime()测量时间间隔,如Listing 6-1所示。为了获取时间(作为时钟),使用System.currentTimeMillis(),因为它定义了返回值为从1970,1月1日,00:00:00 UTC开始的毫秒数。
Listing 6-2给你展示如何用System.nanoTime()测量时间。

Listing 6-2 System.nanoTime()

private void measureNanoTime() {
    final int ITERATIONS = 100000;
    long total = 0;
    long min = Long.MAX_VALUE;
    long max = Long.MIN_VALUE;

    for (int i=0; i<ITERATIONS; i++) {
        long startTime = System.nanoTime();
        long time = System.nanoTime() - startTime;
        total += time;

        if (time < min) {
            min = time;
        }

        if (time > max) {
            max = time;
        }
    }

    Log.i(TAG, "Average time: " + ((float)total / ITERATIONS) + " nanoseconds");
    Log.i(TAG, " Minimum: " + min);
    Log.i(TAG, " Maximum: " + max);
}

在三星Galaxy Tab 10.1,平均时间大约是750纳秒。

NOTE:调用System.nanoTime()需要多少时间,依赖于实现和设备。

因为调度器最终有责任调度线程在处理单元的运行,你希望测量的操作可能会被中断,很可能会有几次,为另外一个线程留下空间。因此,你的测量结果可能包含花费在其他代码的时间,使得测试不正确,会被误导。
为了了解你的代码需要多少时间完成,你可以使用Android独有的Debug.threadCpuTimeNanos()方法。

Debug.threadCpuTimeNanos()

因为它只是测试花费在当前线程的时间,Debug.threadCpuTimeNanos()给你一个理想的概念自己的代码花费了多少时间去完成。然而,如果你要测量的执行在多个线程,单独的一个Debug.threadCpuTimeNanos()不会给你精确的估计,你需要在你所有的感兴趣的线程调用这个方法,并且把结果相加。
Listing 6-3给出了Debug.threadCpuTimeNanos()如何使用的一个简单的实例。它的使用和System.nanoTime()没什么不同,仅可以被用来测量一个时间周期。

Listing 6-3 使用Debug.threadCpuTimeNanos()

long startTime = Debug.threadCpuTimeNanos();
// 警告:如果系统不支持这个操作可能会返回-1

// 简单的睡眠1秒(在这个时间内其他线程会被调度执行)
try {
    TimeUnit.SECONDS.sleep(1);
    // 和Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

long duration = Debug.threadCpuTimeNanos() - startTime;

Log.i(TAG, "Duration: " + duration + " nanoseconds");

因为TimeUnit.SECONDS.sleep()的调用,代码需要大约1秒去完成,实际的执行代码花费的时间很少。实际上,在Galaxy Tab 10.1上运行代码大约是74毫秒。这是预期的,因为在两个Debug.threadCpuTimeNanos()之间除了将线程sleep 1秒没有做其他的事情。

NOTE: 参考TimeUnit类文档。TimeUnit提供了在不同的时间单元之间转换的方便方法,同样会执行线程相关的操作,比如Thread.join()和Object.wait()。

当然,你同样可以在应用的C代码使用标准的C时间函数去测量时间,如Listing 6-4所示。

Listing 6-4 使用C时间函数

#include <time.h>

void foo() {
    double duration;
    time_t time = time(NULL);

    // 在这里做些你想去测量的事情

    duration = difftime(time(NULL), time); // 以秒为单位的间隔
}


从硅到氮化镓:用Sentaurus TCAD仿真GaN HEMT功率器件,我踩过的那些坑 本文分享了使用Sentaurus TCAD仿真GaN HEMT功率器件的实战经验,详细解析了从硅基到氮化镓的技术转型中遇到的五大关键挑战:材料参数设置、极化效应建模、网格划分策略、陷阱模型校准以及仿真与实测数据匹配。通过具体案例和参数优化方法,帮助工程师避开常见陷阱,提升TCAD仿真精度与效率。 阅读详情

相关推荐

VirtualBox虚拟机拖放文件总失败?手把手教你配置双向拖放与共享文件夹(Ubuntu版)

本文详细指导如何在VirtualBox的Ubuntu虚拟机中配置高效的数据交换方案。核心是安装VirtualBox Guest Additions,并在此基础上开启双向拖放与共享粘贴板功能,同时建立稳定的共享文件夹,彻底解决主机与虚拟机间文件传输失败的问题,构建无缝的跨系统工作环境。

weixin_29245767的博客 232

Android修炼之道—时间测量

Java 和 Android提供了一下API, 可以测量时间及性能:     System.currentTimeMillis     System.nanoTime     //下面是Android独有的     Debug.threadCpuTimeNanos     SystemClock.currentThreadTimeMillis     SystemClock.elaps

firefist_wei的专栏 2511

Win11下CH340串口识别失败的终极排查指南:从驱动更新到硬件电路检查

本文提供了Windows 11系统下CH340串口芯片识别失败的全面排查指南。从驱动更新、系统设置等软件层面入手,逐步深入到USB线缆、电源测量等硬件连接检查,并重点剖析了硬件设计细节,如电源退耦电容容值对设备描述符请求的关键影响,最终帮助开发者系统性地定位并解决识别难题。

weixin_29174013的博客 587

android调试工具集

<br />1.TraceView<br />1)功能:用于热点分析和性能优化,分析每个函数占用的CPU时间,调用次数,函数调用关系等<br /> 2)方法:<br />  a)在程序代码中加入追踪开关<br />  import android.os.Debug;<br />  ……<br />  android.os.Debug.startMethodTracing(“/data/tmp/test”);// 先建/data/tmp目录<br />  ……// 被追踪的程序段<br />  android

Bluuee的专栏 796

微波传感器 - 从原理到实战,解锁非接触感知新维度

本文深入解析微波传感器的工作原理,重点阐述了其基于多普勒效应的非接触感知机制,并对比了红外、超声波等技术的优劣。通过树莓派Pico与RCWL-0516模块的实战案例,展示了如何构建区域入侵检测器,并探讨了微波传感器在智能家居、工业自动化及汽车电子等领域的广阔应用前景。

weixin_29306571的博客 223

NAO V6 开发环境的配置(附所有文件)

NAO V6开发环境配置前言环境Robot SettingsChoregraphe 2.8.5.10python2.7+naoqi2.8+opencv4.1.0putty与FileZilla 前言 学校的机器人摸索了一段时间,之前摸爬滚打探索环境,之前没接触这类机器人可能会非常艰辛,希望能给需要的人一些帮助。Nao与pepper通用 环境 win10(x64)+naoqi2.8 1、Robot S...

wbhhello的博客 3219

android 源码问题解答(异常处理)

case1:如何做到按back键不退出应用后台继续运行? 在基类activity会调用onBackPressed这个方法,这个方法会finish当前这个activity,使得当前activity走到onDestory,如果想要按back键不走到onDestory,需要复写onBackPressed方法     @Override public void onBackPress

若然的专栏 2469

Android——Handler详解

1. 简介 Handler是一套 Android 消息传递机制 可以说只要有异步线程与主线程通信的地方就一定会有 Handler。 在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理 使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全 2. 相关概念解释 Handler、Message、Message Queue、Looper Android消息机制: 以Handler的sendMes

Yawn 7万+

斐波那契数列Kotlin的N种实现方式

斐波那契数列Kotlin的N种实现方式

LiePy的博客 1166

Labview项目01:标准可配置序列测试框架

摘要:本文介绍了一个基于LabVIEW2020开发的通用测试框架系统。该系统采用模块化设计,包含主界面、调试界面、设置界面和登录界面。主功能包括:1)可配置测试序列,支持延时、预定值输出、随机值输出等操作;2)单步测试功能自主添加;3)界面支持测试序列编辑和权限管理。系统采用队列机制处理事件和测试流程,通过CSV文件存储测试序列,支持参数化配置。用户可自定义测试VI(A_.vi和N_.vi格式),并通过调试界面验证测试序列。最终测试结果在主界面显示,提供整体判断功能。该系统既可作为学习参考,也可用于实际测试

weixin_38637405的博客 1552

【OpenClaw从入门到精通】第23篇:OpenClaw办公自动化实战—报表生成+文档批量处理+跨系统同步(2026实操进阶版)

本文聚焦OpenClaw在办公自动化场景的进阶应用,针对职场中高频且重复的报表生成、文档批量处理、跨系统数据同步三大痛点,提供从环境搭建、原理讲解到完整代码实现的全流程实操指南。方案基于Python生态工具链(pandas、Playwright、PyPDF2等)与OpenClaw的低代码编排能力,兼顾新手入门与进阶提升——新手可直接复用代码快速落地,进阶读者可学习流程编排逻辑进行二次开发。所有案例均基于真实办公场景设计,部分虚拟场景已明确标注,代码经本地环境验证可复现。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 965

Kotlin的性能调优变得轻松

精工电子数字计时器 我经常在http://slack.kotlinlang.org/上看到开发人员,想知道他们的哪些代码片段性能更高。 通常,其中一个片段类似于Java中的处理方式,而另一个则是Kotlin惯用的方式。 通常,一种假设是,通过添加语法糖,“ Kotlin方式”比更冗长的“ Java方式”要慢。 并非总是如此。 具有Java开发背景,每当我负责基准测试代码块/方法的性能时,我都...

编程故事的地方 433

Cesium 实现气象(温度,降水,风速)可视化详细代码实现

本教程介绍了使用Cesium实现气象数据可视化的方法,主要包括:1) 搭建Cesium开发环境;2) 三种核心气象要素的展示技术:温度热力图(基于颜色渐变和点密度)、降水区域填充(矩形着色)和风速风向(粒子系统);3) 数据集成方案,包括模拟数据生成和API对接;4) 高级功能如3D温度柱和时间序列动画;5) 性能优化策略,如数据聚合和LOD控制。教程提供了完整的代码示例,从基础配置到视觉效果实现,帮助开发者构建交互式气象可视化应用。

专注AI大模型,软件混淆,授权 1844

精通安卓游戏开发(一)

这本书是学习高级 Android 应用开发的实用指南。本书帮助掌握 Android 的核心概念,并在实际项目中快速应用知识。在整本书中,创建了一个应用,并在每一章中不断进化,以便读者可以轻松地跟随并吸收概念。本书分为十二章。前三章专注于应用的设计,解释了设计的基本概念以及 Android 中使用的编程模式。接下来的几章旨在改进应用,访问服务器端以下载要在应用中显示的信息。一旦应用功能完成,它将使用 Material Design 组件和其他第三方库进行改进。

龙哥盟 475

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精通安卓应用开发(一)

本书是学习高级 Android 应用开发的实用指南。本书帮助掌握 Android 的核心概念,并在实际项目中快速应用知识。在整本书中,创建了一个应用,并在每一章中进化,以便读者可以轻松地跟随并吸收概念。本书共分为十二章。前三章主要关注应用的设计,解释了设计的基本概念以及在 Android 中使用的编程模式。接下来的章节旨在改进应用,访问服务器端以下载应用中要显示的信息。应用功能完成后,将使用 Material Design 组件和其他第三方库进行改进。在结束之前,为应用添加了额外服务,如位置服务、分析、崩溃

龙哥盟 445

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

Native Tracing 除了使用startMethodTracing() API分析Java方法外,安卓同样支持native tracing(包括核心代码)。Native tracing也被称为QEMU tracing。本段学习如何产生QEMU trace文件,怎么样将他们转换为Traceview可以理解的文件。 为了产生QEMU trace,需要做两件事: (1) 使用-trace选

路漫漫 其修远 1499

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

精通安卓性能优化(Pro Android Apps Performance Optimization)-前言

最近在做安卓性能优化相关的事情,想起曾看到的《Pro Android Apps Performance Optimization》,那个时候刚刚开始接触安卓,还在学习安卓四大组件,没有到专注的考虑性能问题的地步。当时欣慰的发现和作者(Herve Guihot)为同一家公司工作,不过这位大牛在美国分部,没有当面请教的机会。 市面早已经有这本书的翻译版,也有人在论坛发布自己的译文,不过更喜欢读原版,...

路漫漫 其修远 2692

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

Tracing 一旦发现了什么需要花费太多的时间,你很可能希望可以了解更多的细节,哪个方法是罪魁祸首。你可以在tracing-specific方法帮助下创建trace文件,通过Traceview工具去分析他们。

路漫漫 其修远 1133

史上最全Android性能优化总结,经典收藏

前言 众所周知,移动开发已经来到了后半场,为了能够在众多开发者中脱颖而出,我们需要对某一个领域有深入地研究与心得,对于Android开发者来说,目前,有几个好的细分领域值得我们去建立自己的技术壁垒,如下所示: 1、性能优化专家:具备深度性能优化与体系化APM建设的能力。 2、架构师:具有丰富的应用架构设计经验与心得,对Android Framework层与热门三方库的实现原理与架构设计了如指掌。 3、音视频/图像处理专家:毫无疑问,掌握NDK,深入音视频与图像处理领域能让我们在未来几年大放异彩。 4、大前端

Android23333的博客 1769

Android性能优化问题方案的总结~

虽然总说“英雄不问出处”,但大厂卡学历是默认的“潜规则”。不过最近一个老弟,让我挺振奋的!人家完全靠实力上岸。他就属于死磕型的,是我近2年见过的少有的Android性能优化高手。 要说他也挺聪明,贼会选领域。你出去随便问,10个大牛9个都会说精通性能优化对一名Android开发来说性价比最高! 这不仅是大厂永恒的敲门砖,更是工作中最能突显价值的金字招牌。近几年面试进一步向深、向广。 做了哪些性能优化呢(启动速度、电量、页面、内存…); 如何减少APP启动时间; 内存优化,对于内存泄露就必须得了解; 还比如

248

针对 Android/安卓系统进阶一对一训练营!

大家好,我是code小生,今天的推文是针对Android系统开发的进阶课程,是付费的,而且不是那种几毛几块的课程,感兴趣可以继续看下去!以下,是正文:安卓入门,主要以学习各种控件的使用方式...

weixin_38754349的博客 427

史上最全Android性能优化总结,经典收藏,android2018面试题

在上述几个细分领域中,最难也最具技术壁垒的莫过于性能优化,要想精通性能优化,需要对许多领域的深度知识及广度知识有深入的了解与研究。 本文针对“性能优化”这个要点,分享给大家一份《Android性能优化全方面解析》,这份学习手册将会带领大家一步一步深入探索Android的性能优化,让产品的性能从各个方面得到提升,希望大家喜欢。 第一章 性能优化心得与经验 移动端性能监控方案Hertz Android性能优化之虚拟机调优 Android性能优化后续 And roid UI 性能优化 美团外

m0_66264938的博客 588

高要求,字节内部“Android面试宝典” ,安卓开发必看的涨薪秘籍

金三银四求职季,面试者源源不断,但很多资深面试官却表示,想招到合适的中高级Android开发,却并不容易。有认识的面试官说,最近的面试中,很多面试者对于应聘都没有做好充足的准备:简历上写着精通,一问就含含糊糊,对于做过的项目也表达不清。很多开发者做了3-5年,一问底层原理、框架,都是答得牛头不对马嘴。 面试官也表示,很多人目前身处一家不错的公司,薪水也不错,待着也舒心。但从公司架构的角度看,随着时间的流逝,一个开发者如果只增加了资历,而没有提升自己的技术深度,那么相比更加年轻的程序员,二者的性价比自然是不言

Android23333的博客 212

全网最详Android framework从入门到精通【程序员必看】

Android Framework在Android开发中扮演着至关重要的角色。它提供了丰富的功能和工具,使得开发者能够轻松创建高质量、稳定可靠的Android应用程序。因此,对于Android开发者来说,熟练掌握Android Framework是必不可少的。在这里为大家提供一份《Android framework从入门到精通》,祝大家学完后都能升职加薪。有需要的朋友可以扫描下方二维码,免费获取更多相关学习资料。

Gaga246的博客 8889

大厂为什么在招聘安卓架构师时,为啥都需要丰富的性能优化经验?

前言 众所周知,移动开发已经来到了后半场,为了能够在众多开发者中脱颖而出,我们需要对某一个领域有深入地研究与心得,对于Android开发者来说,目前,有几个好的细分领域值得我们去建立自己的技术壁垒,如下所示: 1、性能优化专家:具备深度性能优化与体系化APM建设的能力。 2、架构师:具有丰富的应用架构设计经验与心得,对Android Framework层与热门三方库的实现原理与架构设计了如指掌。 3、音视频/图像处理专家:毫无疑问,掌握NDK,深入音视频与图像处理领域能让我们在未来几年大放异彩。 4、大前端

zhireshini233的博客 177

安卓插件化开发!美团点评APP在移动网络性能优化的实践,Android篇

写在前面 1月初失业,找了近2个多月的工作了,还没找到心仪的工作,感觉心好慌,不知道该怎么办了?找不到工作的时候压力很大,有人说自信会很受打击,还有人说会很绝望,是人生的低谷……尽管很多时候我们自己知道,我不是找不到工作,只是找不到理想中的好工作。但这也不能改变你的空白期正在一天一天变长,不妥协的那份坚定正在一天一天动摇的事实。 朋友推荐给我这份文档,狂刷五遍之后,最近刚刚获得字节跳动等多家公司的offer,今天将这份文档分享给大家,希望正在找工作或准备找工作的朋友都可以获得自己心仪公司的offer。 第一

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值