Android性能优化(一)—— 启动优化,冷启动,热启动,温启动

Android性能优化之冷启动优化 可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化。在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的。因此本文重点谈论的是对冷启动相关的优化。生命周期:Process.start->Application创建->attachBaseContext->onCreate->onStart->onResume->Activity生命周期启动速度:在几种启动类型中最慢,也是我们优化启动速度最大的拦路虎。 阅读详情
AI摘要

本文深入探讨了APP启动过程中的白屏问题,分析了冷启动、热启动与温启动的区别,详细解释了白屏产生的原因及如何通过优化APP启动流程、减少初始化工作量和加速UI绘制来解决这一问题。

标签 : Android架构师之路


APP启动方式

App启动方式分三种:冷启动(cold start)、热启动(hot start)、温启动(warm start)

▲ 冷启动

系统不存在App进程(APP首次启动或APP被完全杀死)时启动APP
此时,APP的启动将经历两个阶段:

第一阶段

1.加载并启动app;
2.app启动后,第一时间为app显示一个空白的window;
3.创建app进程

第二阶段

系统一旦创建了app进程,app进程就要负责做以下的任务:

1.创建app对象;
2.启动主进程ActivityThread;
3.创建MainActivity;
4.渲染视图;
5.执行onLayout;
6.执行onDraw
7.完成第一次绘制后,把mainActivity替换已经展示的BackgroundWindow,即空白window。

▲ 热启动

当我们按了Home键或其它情况app被切换到后台,再次启动app的过程。
热启动时,系统将activity带回前台。如果应用程序的所有activity存在内存中,则应用程序可以避免重复对
象初始化、渲染、绘制操作。

如果由于内存不足导致对象被回收,则需要在热启动时重建对象,此时与冷启动时将界面显示到手机屏幕上一
样。

▲ 温启动

温启动包含了冷启动的一些操作,由于app进程依然在,温启动只执行冷启动的第二阶段,这代表着它比热启动有更多的开销。

温启动有很多场景,例如:

  • 用户按连续按返回退出了app,然后重新启动app;
  • 由于系统收回了app的内存,然后重新启动app。

App启动优化

app启动优化的方向是冷启动。

空白window问题

app启动时,会短暂的一瞬间白屏:

冷启动动画
这个动图是我在Application的oncCreate里线程休眠1s实现。虽然如此,但是实际项目中确实存在启动时白屏时间过长的问题。

要看怎么解决,先问▲为什么会有白屏?

在上面讲冷启动第一阶段,启动app之后,立即展示一个空白的window,那么具体怎么展示,为什么要展示空白的window呢?

我们看app启动流程加载首屏部分源码:

ActivityStack


 	// Set to false to disable the preview that is shown while a new activity
    // is being started.
    private static final boolean SHOW_APP_STARTING_PREVIEW = true;
    
	void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
            boolean newTask, boolean keepCurTransition, ActivityOptions options) {
       //…… 省略一万行……

        if (!isHomeOrRecentsStack() || numActivities() > 0) {
            if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION,
                    "Prepare open transition: starting " + r);
            //…… 省略一万行……
            
            boolean doShow = true;
            if (newTask) {
                // Even though this activity is starting fresh, we still need
                // to reset it to make sure we apply affinities to move any
                // existing activities from other tasks in to it.
                // If the caller has requested that the target task be
                // reset, then do so.
                if ((r.intent.getFlags() & Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
                    resetTaskIfNeededLocked(r, r);
                    doShow = topRunningNonDelayedActivityLocked(null) == r;
                }
            } else if (options != null && options.getAnimationType()
                    == ActivityOptions.ANIM_SCENE_TRANSITION) {
                doShow = false;
            }
            if (r.mLaunchTaskBehind) {
                // Don't do a starting window for mLaunchTaskBehind. More importantly make sure we
                // tell WindowManager that r is visible even though it is at the back of the stack.
                r.setVisibility(true);
                ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
			// 如果同时满足,则显示空白屏幕
            } else if (SHOW_APP_STARTING_PREVIEW && doShow) {
                //……
                //显示空白屏幕
                r.showStartingWindow(prev, newTask, isTaskSwitch(r, focusedTopActivity));
            }
        } else {
            // If this is the first activity, don't do any fancy animations,
            // because there is nothing for it to animate on top of.
            ActivityOptions.abort(options);
        }
    }

这里省略了部分代码,只保留关键代码。

显示白屏由两个变量决定:SHOW_APP_STARTING_PREVIEW,在activity启动前时否显示预览;doShow,其默认值为true,但是它由newTask决定,是否为一个全新的activity栈,也就是说,SHOW_APP_STARTING_PREVIEW为true,并且app冷启动,就显示白屏。

那么,能不能不显示白屏呢?

答案是可以的!
两种方法:

  • 禁用app启动时window预览的功能

在主题中为首屏activity添加一个注意,禁用window预览的功能,并在manifest中使用

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

    </style>

    <!--禁用预览功能主题-->
    <style name="AppSpalshNoPreviewTheme" parent="AppTheme">
    	<item name="android:windowFullscreen">true</item>
        <item name="windowNoTitle">true</item>
        
        <!--        <item name="android:windowContentOverlay">@null</item>-->
        <!--        <item name="android:windowBackground">@mipmap/wall</item>-->
        <item name="android:windowDisablePreview">true</item>
    </style>
</resources>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.margin.myapplication">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:name=".MyApplication"
    android:theme="@style/AppTheme"
    tools:ignore="GoogleAppIndexingWarning">
    

    <activity android:name=".SplashActivity"
        android:theme="@style/AppSpalshNoPreviewTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".HomeActivity"
        android:launchMode="singleTask"/>
</application>

</manifest>

在网上看到说可以将首屏背景设为透明背景,就是我注释掉的两行,但是实际测试发现会透明,但是会出现黑屏的问题,估计这种也不靠谱还麻烦,所以直接忽略它,直接禁用预览功能。

效果如下:

禁止预览

可以看到,我们点了一下app,系统竟然卡住了?!过了1秒多,app才启动起来??什么鬼?
其实并不是系统卡住了,而是我们本来应该显示的空白预览屏幕不显示了,所以看起来好像卡住了。嘿嘿嘿,此处突然萌生了一个想法:你手机或者系统有问题,跟我的app代码有啥关系😏😏😏,哈哈哈,你品,你细品,哈哈哈哈……

言归正传,这种方式虽然可以帅锅给系统,并且之前支付宝好像竟然这么干过!但是并不是好的办法,接下来,我们往下看另一种方法。

  • 给空白首屏Activity设置一个背景

在style.xml中给SplashActivity添加一个新主题,设置一个背景:

    <!--替换首屏的背景的主题-->
    <style name="AppSpalshBackgroundTheme" parent="AppTheme">
        <item name="android:windowBackground">@mipmap/wall</item>
        <item name="android:windowFullscreen">true</item>
        <item name="windowNoTitle">true</item>
    </style>

效果如下:

设置首屏背景

看这种效果是不是很好,如果UI再改一下,UI妹子给做一些好看的图,是不是效果更棒了。
(另外我发现头条好像也是这样的)

从源头解决

上面两种方式,看似挺不错,尤其是第二种,效果竟然看着还不错??😂😂😂

但是!上面的方式治标不治本只是障眼法,我们还是要从根源上解决问题!

从上面冷启动的介绍可知,app启动过程中,会有如下几个重要过程:

Created with Raphaël 2.3.0 load and launch App showPreviewWindow init app init splashActivity replace previewWindow with splashActivity

看出点什么了吗?
app启动,显示白屏,首屏第一次绘制完成,替换白屏。也就是说,直到首屏显示之前,都是白屏!

所以,要想解决白屏的问题,就要减少白屏显示的时间!也就是说要加快app初始化和首屏绘制的时间。

像上面,我实现长时间白屏,就是在application的onCreate方法中,让线程休眠一段时间:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

看到这段代码,是不是让你产生了一些思路呢?

  • 减少Application 初始化的工作量。

我们通常会在Application的onCreate方法中可以做一些轻量化的初始化操作。当onCreate任务越多耗时操作越多,初始化越慢,于是splashActivity启动时间就越晚,白屏时间就越长咯。

一些三方的SDK,文件,设备,线程池,等等工具类,等等尽可能不要在application中初始化。

  • 加快UI绘制
    其实这个已经是老生常谈的话题了,常常由一下几种方案:
  1. 减少布局嵌套层级。
    布局层级越深,执行measure,layout次数就越多越耗时,ui绘制自然就越慢。我曾经见过一位大神,一个xml嵌套8-9层甚至十几层!我始终想不明白大神到底是计算机专业的还是护理专业的。

此刻我不得不说约束布局——ConstraintLayout是真的香!只要你用的好,布局合理,甚至可以零嵌套!

  1. 减少布局元素
    布局中元素越多,单帧UI绘制就越耗时,所以尽可能减少布局元素。事实上,不管是首屏还是其他的activity或者fragment布局都应该尽可能的减少布局元素。注意有时候可能为了方便,布局中放了一些不可见或占位的控件,应该减少这种情况,因为他们也参与绘制过程的。
    另外还可以使用viewStub标签,使用时再初始化需要的布局,非常方便。

  2. 避免过度绘制
    减少不必要的背景设置。
    尽可能避免元素重叠。既设置了背景又重叠,就会有不必要的耗时绘制。
    还是要减少不必要的站位元素。


APP性能优化不仅仅时启动优化,还有很多内容,比如布局优化(这里包含了部分)、数据结构优化、网络优化、线程优化,业务逻辑优化、内存优化、资源优化、apk瘦身等等等等很多,还有很多性能优化工具这里没有提及,现在先给自己挖个坑,以后有时间补上把😂😂😂

深夜写的有些匆忙着急,如果有不足之处还望多多包涵并欢迎批评指正,非常感谢😜😜😜

Android性能优化之冷启动优化(1) 最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。 阅读详情

相关推荐

Android 冷启动与热启动深度解析

理解这些概念对性能优化、崩溃分析等高级开发场景至关重要,建议结合Systrace工具进行实际案例分析。:ActivityThread.attach()绑定AMS。:在Application.onCreate()前执行。:使用SplashScreen API规范启动过渡。:AMS启动Activity的总耗时。:最后一个Activity启动耗时。JobScheduler定期唤醒。Dart代码预编译(AOT模式):进程存活但Activity重建。:Zygote fork新进程。:进程和Activity都存活。

斗锋在干嘛的博客 924

冷启动和热启动

一、应用的启动方式 通常来说,启动方式分为两种:冷启动和热启动。 1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。 2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用...

常庆伟的博客 1万+

Android性能优化之冷启动优化,安卓android开发

冷启动(Cold start) 场景:冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动。 可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化。在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的。因此本文重点谈论的是对冷启动相关的优化。 生命周期:Process.start->Application创建->attachBaseContext->onCreate->onStart->onResume-

wa32saa的博客 839

App启动速度优化

谷歌官方文档:https://developer.android.com/topic/performance/launch-time.html#common 一、app启动方式 启动方式分为两种:冷启动、热启动、温启动。 1. 冷启动 启动app时,后台没有app的进程,或者进程被killed,这叫冷启...

weixin_33785972的博客 423

Android性能优化:启动速度优化

启动优化是Android应用性能优化中的重要环节,直接影响用户的第一印象。通过本文介绍的优化技术,可以有效减少应用的启动时间,提升用户体验。Application初始化优化:延迟初始化、异步初始化、使用App Startup库布局优化:使用ViewStub、AsyncLayoutInflater、ConstraintLayout懒加载与按需加载:Fragment懒加载、ViewPager2懒加载多线程优化:使用线程池、协程闪屏页优化。

Ya-Jun 的博客 451

Android性能优化——APP启动优化(四)

自定义控件和UI部件,不管这些控件是否支持 xml 化,实现它们的代码质量很重要,要尽可能简化它们的构造过程。

小旭的专栏 3784

Android profiler : 应用启动时间、冷启动、热启动、温启动

如果您之前曾在 Android 11(API 级别 30)或更低版本中使用以下某种方法来实现自定义启动画面,则可能会增加额外的启动时间:使用 windowDisablePreview 主题属性关闭系统在启动过程中绘制的初始空白屏幕。使用专用 activity。从 Android 12 开始,必须迁移到 SplashScreen API。此 API 可以缩短启动时间,并允许您通过以下方式调整启动画面:设置主题以更改启动画面的外观控制启动画面的显示时长。

火星男孩的分享空间 2412

1.3、云计算HCIP融合存储产品及部署

目标:描述Oceanstor V3系列存储产品系统组成及产品定位 描述Oceanstor V3硬件结构及软件架构 掌握存储系统与主机系统之间的连接 一、存储型号 低端型存储:Oceanstor 2200 2600 2800 V3/V5 终端型存储:Oceanstor 5300 5500 5600 5800 6800 V3/V5 高端型存储:Oceanstor 18000 二、Oceanstor V3系列存储系统定位 OceanStor V3系列存储系统是华为根据存储产品应用现状和存储

weixin_43666279的博客 1653

Android性能优化系列:启动优化

Android 性能优化—— 启动优化提升60%

Vincent的博客 6949

pytest-bdd封装

简介 pytestbdd主要是用于代码封装 代码封装的好处: 1、提升代码复用率 2、提示测试效率 手工测试–使用框架0代码 流程+数据驱动 产品经理这样的不懂测试的人员–流程驱动 自动化测试–数据驱动 pytest-bdd:流程驱动封装 行为驱动–敏捷开发模式,消除开发/测试对需要了解的歧义 使用方式: 描述需求/用户场景 Feature(需求) Scenario(场景) Given(假设) When(操作步骤) Then(验证,清除) #新建feature 文件之前 需要提取安装支持featrue文.

liao_11的博客 2733

西门子1500 PLC与巴鲁夫RFID实战:从硬件接线到数据读写的完整流程

本文详细介绍了西门子S7-1500 PLC与巴鲁夫RFID系统集成的完整实战流程。内容涵盖从硬件选型、接线、PROFINET网络配置,到在TIA Portal中安装GSD文件、组态设备、分配地址,再到使用标准功能块(如FB31)进行程序架构设计、实现数据读写以及错误诊断。文章重点分享了硬件连接要点、软件配置步骤、数据块管理技巧以及调试中常见问题的解决方案,为工业自动化工程师实施RFID项目提供了清晰的指导。

weixin_29161785的博客 385

Android 性能优化之启动优化

启动状态:冷启动、温启动、热启动。 耗时检测:TraceView、Systrace、AOP。 优化手段:白屏优化、异步加载优化、延迟加载优化、AppStarup。

xiangxiongfly 1842

Microsemi Libero系列教程(四)——PLL的使用

文章目录PLL是什么Libero中PLL的使用官方文档 系列教程:Microsemi Libero系列教程 PLL是什么 PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存的存取资料等。PLL用于振荡器中的反馈技术。 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率...

whik1194的博客 7212

34. 热启动与温启动优化

热启动优化减少onResume中的操作暂停后台动画和任务Fragment懒加载优化RecyclerView减少View重绘温启动优化使用ViewModel缓存状态减少Bundle序列化优先使用缓存数据布局预加载View复用通用优化监控启动性能定期review代码避免内存泄漏优化布局层级核心优化点热启动:Fragment懒加载、RecyclerView优化、减少生命周期操作温启动:ViewModel状态缓存、数据缓存优先、View复用优化收益。

时代我西的博客 707

使用 Simulink Real-Time 搭建一个完整的实时信号采集与滤波系统模型

本文详细介绍了基于Simulink Real-Time构建实时信号采集与滤波系统的完整流程。主要内容包括:系统配置(模型创建与参数设置)、信号采集模块搭建(模拟信号源或真实硬件连接)、实时滤波器设计(浮点/定点)、输出可视化(Scope/ToWorkspace等)、模型编译与下载到目标机、外部模式在线调试及数据保存方法。系统可实现微秒级实时信号处理,适用于工业控制、航空航天等对时间确定性要求高的场景。文章还提供了优化建议(多速率建模、优先级调度等)和应用场景说明,帮助读者快速掌握实时系统开发的核心技能。

amy_mhd的博客 304

NR TA

这篇是NR TA的笔记,之前有对R17 NTN TA进行了简单总结,但是也仅仅局限在NTN部分,其他TA基本过程没有涉及,这篇是针对R16版本协议对NR TA相关内容做的总结。和PUSCH power control过程类似,NR TA也可以分为开环 和闭环调整,相关内容分散在38.300,38.211,38.213,38.321,38.133和38.331。后面就按照38.300 TA相关概念,38.211中有关TA定义,38.213 TA 相关内容,38.321 TA控制过程,38.133 Timi

ModemProtocol的博客 769

Android冷启动优化

建议:一些三方的SDK,文件,设备,线程池,等等工具类不放在Application初始化,我们可以放到用到的地方才进行初始化操作。热启动是指应用程序在保留应用程序进程的情况下再次启动的启动方式,这种启动方式相对于冷启动要快得多,因为应用程序的许多资源和进程已经存在于系统内存中,不再需要重新创建和加载。**温启动:**温启动包含了冷启动的一些操作,由于app进程依然在,温启动只执行冷启动的第二阶段,这代表着它比热启动有更多的开销。2、推荐使用merge标签,可以减少一个层级。在manifest中使用。

weixin_40323532的博客 1770

PCL RANSAC拟合分割多条直线【2026最新版】

使用RANSAC算法拟合分割多条直线,输出每一条直线的拟合参数到控制台,并保存直线点云到本地文件夹。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 7974

Android性能优化之冷启动优化,阿里P7大佬手把手教你

首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。下一步还是要查漏补缺,进行针对性复习。最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!!!一定要看完!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84149916的博客 1141

迟滞比较器原理及计算

为什么要用迟滞比较器 在讲迟滞比较器之前,我们先看一个案例。 在产品设计中常常需要用到电机,而电机在从运转到停止过程中需要泄放能量,这种能量大部分以电压的形式反馈回电源母线(Vbus)导致Vbus母线电压升高,特别是功率大又转速快的电机需要急刹时,产生的反馈电压更高,严重时可能导致母线上其他器件的损坏。 为了防止将电机反馈的能量泄放掉,我们需要设计一个电路来检测母线电压,当母线电压高于某一安全阈值时,打开MOSFET Q1将母线上的能量通过电阻R5以热的形式消耗掉。 假如用一般的比较器,设计如下: Vbu

sinat_15677011的博客 2万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

安卓性能优化之启动优化

安卓性能优化之启动优化

chendedong的博客 2944

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 再论AsyncTask原理解析
下一篇: HashMap(Java8)原理解析&&HashMap扩容机制
cry kid
博客等级 码龄10年 144粉丝 24原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值