Android应用性能优化小结

Android 进阶——图形显示系统之底层图像显示原理小结(一) 一个典型的显示系统中一般由CPU、GPU、Display三个部分组成,其中 CPU负责计算帧数据,把计算好的数据交给GPU,GPU会对图形数据进行栅格化处理和渲染,渲染好后放到Frame Buffer(图像缓冲区)里存起来,然后Display(屏幕或显示器)负责把Frame Buffer里的数据呈现到屏幕上。... 阅读详情

废话多说无益,切入正题。

一、Android代码执行

Android开发者使用java,但是java使用jvm虚拟机,android使用dalvik虚拟机。Jvm是基于栈的虚拟机,dalvik基于寄存器的虚拟机。栈的执行效率更低,所需要的指令数更多。

在执行过程中,java被虚拟机先编译成java字节码,然后会被dex编译器编译成dalvik字节码,使用dalvik虚拟机来执行。应用在最终执行的过程中只包含dalvik字节码。

在android2.2版本,google开始使用jit编译器。Dalvik JIT编译器吧dalvik字节码编译成本地代码(直接由Cpu执行,不需要虚拟机解释执行)。因为google称编码速度提高了3-6倍。本地代码可以为特定架构优化。

对过早的系统版本,我们的优化策略包括1、不做优化2、限制应用最低api等级3、禁掉一些非常耗资源的功能

 

 

二、算法优化

最有效最容易调试的方法是算法优化。

1.      使用迭代算法替换递归算法。原因:递归算法往往消耗更多的栈空间。在调用了过多递归的时候,往往会出现栈溢出。因为,我们一定要优先使用迭代算法

2.      对象的创建会消耗一定的资源。在程序中,应尽量减少对象的创建来增加速率。重复的计算伴随这对象的不断创建,对象可能是通过ndk调用,这样的话也会产生一定的消耗。

3.      在代码关键路径上要避免内存分配,如果必须要分配,也要减少分配数量

4.      使用预计算优化速率

5.      在计算代价过高的情况下,使用缓存结果的方式以便再次使用时很快取出来。   这里如果key是个对象是可以使用hashmap,但是如果对象是个整数时,使用SparseArray效率会更高。原因是Hashmap使用Integer对象,而SparseArray使用的是int。

6.      在缓存对象的时候,我们会考虑到内存消耗。因为缓存是有大小的。在android.util.LruCache(3.1版本引入)中,综合当前的情况,通过覆写removeEldestEntry方法来优化缓存策略。一般有LRU(优先丢弃最近最少使用),MRU策略可以使用。

7.      必须要熟悉每个api发布时之间的区别,更高的api代表着有更多的优化可以使用。熟悉可以带来更高的效率

8.      Java的反射机制很好用,但是在性能至关重要的地方要避免使用反射,替代方法是在静态初始化里调用Class.forName和Class.getMethod确定指定方法是否存在。然后在性能要求高的地方只调用Method.invoke就好

9.      使用基于散列的数据结构,而且键是自定义的时候,一定要优化equals以及hashCode方法!

 

三、数据库

要显示创建事务。这样的做法有两个特性1.原子提交2.性能更好

原子提交的好处是事务要么都完成,要么都没完成。因为事务只提交了一次,所以性能也就更好了。

使用一次性事务在任何大数据情况下都会有更好的体验.代码如下:



-------------------------------------------------------------------------------------------------

 

在多次提交的情况下,使用compileStatement可以让语句只编译一次。代码如下:

 

 

四、针对不同架构优化---ndk

市面上的大部分架构如下

1.      arm的版本从v1到v7。

2.      ARM7/ARM9/ARM10核心使用v5

3.      Cortex使用v7。包括A5\A8\A9\A15

4.      对我们来说,重要的是NDK支持一下三个应用程序二进制借口(ABI):1.armeabi

2.armeabi-v 7a

3.x86

              NDK使用方法:

1.      在java中声明本地方法。写个native

2.      javac 编译

3.      javah 产生.h

4.      使用c/c++使用方法

5.      编译,加载本地库

 

这部分暂时了解不多。

值得注意的是

1.      JNI字符串需要转换成c/c++字符串

2.      c/c++字符串需要被释放

3.      GetStringChars----ReleaseStringChars

4.      GetStringUTFChars-----ReleaseStringUTFChars

5.      GetStringCritical----ReleaseStringCritical

6.      GetStringRegion  -----n/a

7.      GetStringUTFRegion ---n/a

8.      从3-7来看。优先使用6\7,这样做避免了内存分配、复制String要用的一部分到预先分配的缓存区(更快)、不需要释放字符串

9.      在jni中调用java对象或类的域和方法。我们都需要得到域或方法的id、使用jni函数设置/获取域或者调用方法。出于性能的考虑,我们不会每次访问域或调用方法时都去获取一次域或者方法的id。            注意。。。虚拟机加载类时域和方法的id就被设置了,只要类被加载,该id就有效。所以,        高效的方式是~~~在类被加载时就获取id,在静态初始化中获取。

 

 

五、使用汇编

1.      ARMv5:支持全部16位指令

2.      ARMv7:支持Thumb2指令集,分16位和32位

3.      通过简化汇编代码,我们可以取得更好的效果

4.      考虑使用汇编,就是说要在几条指令,几条指令中徘徊,尼玛,这个很多蛋疼。这里不能仅仅只考虑指令数量的多少,而且还需要计算每条指令话费时间,才能得到更精确的耗时。不同的是不一样的指令在cpu中可能需要花费的指令周期也是不一样的。有时候为了最大化吞吐量还会打乱执行顺序。所以,结果不好确定。。。。。详细的话需要参考arm的技术参考手册。

参阅Cortex-A9技术参考手册,可以得到更多的指令周期计时的信息。

5.      在使用汇编的时候,减少操作数,也可以优化

6.      通过优化算法,可以减少使用基本操作的次数

7.      在不同的ARM结构中,每条指令所占的字节数也会不一样。我们应该因地制宜。

 

 

注意~!!使用汇编需要很重点的关注ARM指令集,详情参阅infocenter.arm.com

Ata. Android的api中包含很多优化过的算法。在引用java的对象的时候,我们可以适当的查看下,android是否提供了相关的可替代的对象。

 

六、NDK小技巧
1、内联函数:函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。特别是对于一些函数体代码不是很大,但又频繁地被调用的函数来讲,解决其效率问题更为重要。引入内联函数实际上就是为了解决这一问题.只要在函数定义的头前加上关键字inline即可
2、把一个函数的循环展开,比如将100次循环改成25次,在循环体内执行4次。这个需要实验过才知道有没有效果。不一定都有效。这依赖当前的系统架构
3、预加载内存
1.GCC的__builtin_prefetch();
2.在arm汇编代码中使用pld和pldw指令,pli指令(适用于armv7及以上)

这种优化不一定有效,因为一些cpu会自动预加载内存

4、使用LDM/STM代替LDR/STD指令。汇编不舒服,一笔带过。

 

七、内存使用

性能主要取决于三个因素:

1.      CPU如何操纵特定的数据类型

2.      数据和指令需要占用多少存储空间

3.      数据在内存中的布局

 

在性能比较下,

1.      使用更短的数据类型,性能更优

2.      避免类型转换

3.      注意数组之类的在释放时,要设置成null

4.      因为对象是在队中分配的,在数组中只能存储对象的引用。所以如果要提高命中率,可以考虑并拢数组,即将一个类型的数据都组合在一起。

5.      在关键路径,或者在主线程中,要避免内存回收。特别是在游戏中

6.      在任何时候,都要有推迟初始化的习惯

 

八、多线程和同步

在很多情况下,应用处理的顺序是

1.      在UI线程中收到事件

2.      在非UI线程中处理相应事件

3.      UI线程根据处理结果刷新

 

线程的优先级

从1-10.MIN_PRIORITY(1)   NORM_PRIORITY(5)  MAX_PRIORITY(10)

调用Thread.setPriority()可以改变线程优先级

 

Linux优先级

使用android.os.Process。Process.setThreadPriority。它定义了8个优先级

1.      THREAD_PRIORITY_AUDIO(-16)

2.      THREAD_PRIORITY_BACKGROUND(10)

3.      THREAD_PRIORITY_DEFAULT(0)

4.      THREAD_PRIORITY_DISPLAY(-4)

5.      THREAD_PRIORITY_FOREGROUND(-2)

6.      THREAD_PRIORITY_LOWEST(19)

7.      THREAD_PRIORITY_URGENT_AUDIO(-19)

8.      THREAD_PRIORITY_URGENT_DISPLAY(-8)

 

如果要调整线程优先级,可以使用  优先级老化算法

 

关于优化

1. 在多线程环境中,我们会经常使用AsyncTask来进行多线程环境的操作

我们要注意线程中必须了解的Handler和Looper
值得注意的是使用Message.obtain或Handler.obtainMessage来获得message对象更优化。因为这是从全局的消息池中取出Message对象,这比每次单独创建新实例获取Message效率更高

2. 使用HandlerThread
多线程环境必须要注意同步,保证语句的原子性

3. 多线程的环境,要注意并发的情况。当多个线程同时只读访问相同的数据时,充分考虑到吞吐量,比较常用的是ReentrantReadWriteLock.WriteLock和ReentrantReadWriteLock.ReadLock

4. 未来的世界属于多核。我们应该利用多核优势。使用分治算法

5. 在某些情况下,可以考虑将子问题的缓存共享。(这里有可能会发生将问题分解成子问题后,性能没得到提成,很有可能是因为数据之间有依赖,不得不进行同步,线程在等待上花费了很多时间)。因此,最好使用多线程执行无关的任务,避免同步需求,或执行偶尔或者频率低的定期同步

6. 使用多线程。要考虑到内存泄漏问题。

 

九、科学的功耗

任何一个操作都伴随着CPU的运行。一个优秀的应用应该为用户考虑这一点

要做到这一点需要考虑以下

1.      避免执行做无用功的代码,比如一些广播的注册可以延后到需要的时候才做

2.      充分的给用户设置的权利

3.      给用户选择图片质量的权利,图片下载也会伴随的流量,伴随着更大的消耗

4.      软件的监听操作应该让用户选择监听的频率

5.      使用被动定位服务

6.      通过获取历史最新结果提供用户更好的体验

7.      充分利用wakelock功能,建议使用带超时功能的WakeLock.acquire

 

十、布局

1.      横向布局,减少布局层数。这能提高应用反映速度

2.      减少布局中创建的对象。使用尽可能少的对象来布局

3.      在布局嵌套时,考虑上层的布局方式,看是否能用merge来减少一层布局

4.      使用推迟初始化布局----ViewStub

ViewStub只需要在代码中,findViewById 然后inflate就可以

5.      考虑图片压缩,使用压缩过的图片可以减少内存占用

6.      在OpenGl的环境下,应该充分考虑消隐,以及多种纹理方式,只有当有需要的时候才去渲染

 

十一、RenderScript

在很多纹理渲染的时候,我们可以使用RenderScript,这是一种高性能的3D渲染和计算操作的新框架。

优势:

1.      平台独立

2.      易于并行执行

3.      可以使用cpu、gpu、或者其他处理器

缺点:

1.      android独有,不通用

2.      学习有一定难度

3.      api数量有限,动画效果难了就不要考虑

 

RenderScript会被不断的优化,所以,我们应该重视,google帮你做优化

o型圈沟槽设计_O型密封圈——详细选型过程及步骤 一、密封圈常用材料二、密封圈常用密封形式密封圈分为活塞密封,活塞杆密封,端面密封,旋转密封。三、O型密封圈的选型规则O型密封圈的尺寸图径向安装O型圈选型(静态和动态运动)活塞杆密封选择适当规格的O形圈时,应该保证其外径(d1+2*d2)至少等于或者大于沟槽外径d6;当选择的O形圈直径d1大于250 mm时, O形圈外径将不能超过沟槽外径的3%;当选择的O形圈直径d1小于250mm时, O形圈外径将... 阅读详情

相关推荐

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置)

本文详细介绍了如何通过部署开源元搜索引擎SearXNG,为本地运行的OpenWebUI大语言模型(如Qwen、Llama)配置联网搜索功能,解决其知识库过时的问题。文章重点讲解了SearXNG的Docker部署、集成国内搜索引擎(如百度、360)的配置方法,以及如何与OpenWebUI无缝对接,从而实现本地大模型获取实时、准确的中文信息,提升其实用性。

weixin_28835583的博客 1876

Android中设置线程优先级方法

有时候,我们会创建一个线程去操作一个比较耗时的任务,同时它的优先级不需要很高,不能应用这个耗时的工作线程,影响了整机的性能,那么我们可以通过Process.setThreadPriority(int i) 这个函数,去设定线程的优先级。数值越大,那么优先级就越低。 SDK中定义了很多的优先级数值等级,如下: THREAD_PRIORITY_DEFAULT,默认的线程优先级,值为0。 THREAD_...

天花板的随笔 4955

Aruba CX交换机VSX配置实战:如何避免脑裂导致的网络中断(含详细命令)

本文提供Aruba CX交换机VSX配置的实战指南,重点讲解如何通过构建高可靠的ISL链路聚合与独立隔离的Keepalive链路,有效避免网络脑裂风险。文章包含详细的命令步骤,从基础配置到高级故障排查,帮助网络工程师构建坚如磐石的高可用核心网络,确保业务流量零中断。

weixin_29231725的博客 172

设置安卓系统线程优先级

https://www.jianshu.com/p/632dce664c3d android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); /** * 播放线程 */ Runnable recordRunnable = new Runnable() { @Override public void run() { ..

fangyan_1229的博客 1161

[数字电路]用与非门实现BCD译码器驱动数码管

Hello,大家好。这里是xdd_core,好久不见。今天来和大家聊聊大一数字电路课程的一个课设。# Key word:BCD Decoder,Proteus8.x,NAND Gate,Digital Circuit# 流程:Proteus8.x仿真电路并绘制PCB导出Gerber文件打样,最终实物验证。# 以下为我对这个课设的report(里面对整个设计做了详细介绍,并设计了完整的验证电路) 感谢观看,仅供参考,未经作者允许,禁止转载/抄袭,本文已上传至数据库,查重必挂QAQ BCD to 7-Segme

xddcore的博客 6012

程序员的自我修养

一个好的程序员的自我修养需要从不同角度出发,工作能力是一个方面,对自身的定位和了解也是一个方面,程序员的工作能力修养包括需求理解、功能设计、沟通确认、代码规范、成果验证、代码重构优化等,通过自我剖析来对自身进行定位并了解自身的优缺点,如去除劣根性、端正意识形态与态度、提升自己的核心竞争力等。 自我剖析 一个成功的人,必须要先了解自己,只有了解自己是什么样的人,了解自身有哪些优缺点,了解自己更合适做什么工作,知道自己做什么才能发挥出自身的优势,这样才能使自己在工作中发光发热,在职业生涯的道路上走的更远。

数通畅联 1676

Android 中设置线程优先级的正确方式(2种方法)

在 Android 中,有两种常见的设置线程优先级的方式:第一种,使用 Thread 类实例的 setPriority 方法,来设置线程优先级。第二种,使用 Process 类的 setThreadPriority 方法,来设置线程优先级。Java 原生的方法 setPriority 修改线程优先级时,参数范围必须在 MIN_PRIORITY 和 MAX_PRIORITY 范围之间,如果超过该范围,将抛出错误。设置成功时,此线程的优先级将设置为指定的参数和该线程的线程组的最大允许优先级中的较小者。

chuyouyinghe的专栏 2127

【Mode Management】AUTOSAR架构下RH850-F1KM芯片深度休眠配置实践

AUTOSAR架构下RH850-F1KM芯片深度休眠配置实践

qq_36056498的博客 1091

android 开机优化(类和资源预加载优化)

转自:https://blog.youkuaiyun.com/xxm282828/article/details/49095839 Android启动过程中针对类和资源部分预加载耗时比较久,这个部分需要优化,主要涉及的文件: ./base/core/java/com/android/internal/os/ZygoteInit.java 主要采取三个措施: 1. 修改ZygoteInit.java ...

jinron10的专栏 4691

C#与数据采集卡集成开发全指南:从硬件连接到实时数据处理(附工业传感器监测实战)

C#数据采集卡集成开发指南 本文系统介绍了不同类型数据采集卡(DAQ卡)与C#的集成方法。主要内容包括: 数据采集卡分类:按接口分为PCIe/PCI(高带宽低延迟)、USB(便携即插即用)和以太网(远距离组网);按信号类型分为模拟量输入、数字量输入/输出等。 C#集成核心方法: 优先使用厂商SDK(如NI DAQmx),提供完整功能封装 无SDK时采用通用协议(如USB HID、Modbus TCP) 具体实现示例: NI DAQmx采集热电偶温度代码 USB HID协议读取模拟量电压值 工业应用要点:实时

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1972

AUTOSAR OS Counter讲解

Counter(计数器)以tick为单位记录操作系统中发生了多少“事情”。tick(滴答)是一个抽象的单位。时间,例如毫秒,微妙,分钟等,然后计数器计算过去了多少时间旋转,例如以度或分钟为单位,计数器计算物体旋转了多少按钮按下,计数器计算按钮按下多少次错误,计数器计算错误发生的频次中断(有时是任务)用于驱动一个计数器。该驱动程序负责进行正确的OS API调用来滴答计数器,或者告诉OS计数器已经滴答到一个所需的值。

酒无忧的博客 1074

Android应用性能优化最佳实践.1.4 本章小结

1.4 本章小结 Android Studio的安装并不复杂,首次使用可能会不适应并觉得效率甚至低于以前使用的其他IDE,但相信使用一段时间后,一定能体验到它的灵活和强大之处,同时Android Studio的技巧非常多,大家可以多从网上找到各种技巧。 古人云,“工欲善其事,必先利其器”,Android应用开发者的“器”则是指Android Studi...

weixin_33695082的博客 114

布尔可满足性问题(SAT)深度研究

布尔可满足性问题(Boolean Satisfiability Problem, SAT)是计算机科学和数理逻辑中的一个核心决策问题。其定义为:对于一个给定的布尔逻辑公式,判断是否存在一组对其变量的真值赋值(即,为每个变量指定真 (True) 或假 (False)),使得该公式的最终计算结果为真。如果存在这样的赋值,则称该布尔公式是可满足的 (satisfiable);否则,称其为不可满足的 (unsatisfiable)。

步子哥的博客 497

Android 开发优化小结

目录 Android基本组件 UI与布局 进程、线程与消息通信 Android基本组件 当前的Activity的onPause方法执行完成之后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响页面之间的跳转效率。 使用Toast时,建议定义一个全局的Toast对象,这样可以避免连续显示Toast时不能取消上一次Toast消息的情况。 使用Adapter的时候,如果你使用了ViewHolder做缓存,在getView()的方法中无

qq_35381515的博客 2110

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

Android内存优化原理,Android应用性能优化最佳实践

Android应用性能优化最佳实践编辑锁定讨论上传视频全书一共7章,在简单介绍了AndroidStudio的使用指南后,分别从绘制(UI)、内存、存储、稳定性、耗电以及安装包6个方面优化,从系统上深入分析绘制和内存的原理,一步步深入了解导致性能问题的本质原因,同时讲述了多种性能优化工具的使用,通过分析典型案例,得到有效的优化方案,从而实现更高质量的应用。书中所讲述的内容均基于Android6.0系...

weixin_36473855的博客 238

深度学习工具包 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")

adb命令启动某个action_android adb实用命令小结

adb对于Android程序员来说在日常的工作中使用频率很高,现将自己工作中常用的adb命令总结一下备忘,方便查询,也供大家参考。查看应用内存占用,耗电信息,启动时间,wakelock,跑monkey的命令在之前的应用性能优化中起了不小的作用。以下adb命令的测试机器为小米3,其中package_name代表包名。基础脚本:1、启动adb服务adb start-server2、终止adb服务adb...

weixin_39726971的博客 1186

计算机控制技术及应用

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

【愚公系列】《移动端AI应用开发》020-Android端应用开发(Android 应用性能优化)

Android应用性能优化:内存泄漏与垃圾回收机制 摘要:本文重点探讨了Android应用开发中常见的内存泄漏问题及其解决方案。内存泄漏是指应用持续持有不再需要的对象引用,导致垃圾回收机制(GC)无法释放内存,长期积累会引发性能下降甚至崩溃。通过典型的Handler内存泄漏示例,演示了Activity被意外持有的场景,并介绍了使用LeakCanary工具进行内存泄漏检测的方法。关键优化建议包括:1)及时移除Handler/Runnable回调;2)避免在静态变量中持有Context;3)正确管理资源密集型对

愚公智库 2万+

Android 布局优化小结

主要介绍使用抽象布局标签(include, viewstub, merge)、去除不必要的嵌套和View节点、减少不必要的infalte及其他Layout方面可调优点,顺带提及布局调优相关工具(hierarchy viewer和lint)。 1、抽象布局标签 (1) 标签 include标签常用于将布局中的公共部分提取出来供其他layout共用,以实现布局模块化,这在布局编写方便提供

欧阳明日的专栏 639

内存优化小结

内存优化小结

小成的博客 739

应用的性能问题和优化小结

哪些地方会导致性能问题? 应用性能问题大致分三个方面:阻塞渲染导致卡顿,内存管理没做好导致泄露或者溢出,应用耗电量大。 关于卡顿: Android系统每隔16ms发出VSYNC(Vertical Synchronization垂直同步)信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数...

weixin_30470643的博客 368

内存优化技巧小结

* 1、使用Service的风险导 * 2、当界面不可见时释放内存 * 3、当内存紧张时候释放内存 * 4、避免Bitmap上浪费内存 * 5、使用优化过的数据集合 * 6、了解内存的开支情况 * 7、反抽象编程理念 * 8、避免使用依赖注入框架 * 9、使用ProGuard混淆代码 * 10、使用多个进程

wuyinlei的博客 1137

Android安装包体积优化

总结:22包体积优化(上): 如何减少安装包大小?_long117long的专栏-优快云博客自我学习极客时间《Android开发高手课》的笔记总结文中链接:饿了么开源的Mess可实现四大组件和View混淆 https://github.com/eleme/MessR8 https://blog.dreamtobe.cn/android_d8_r8/Facebook的so加载开源库SoLoader https://github.com/faceboo...https://blog.youkuaiyun.com/long

C++ JAVA的专栏 807

Bitmap等优化相关小结(七)

本节主要介绍性能优化相关,不局限于Bitmap优化等相关知识点,文末有Bitmap解压缩和利用LruCache和DiskLruCache写成的ImageLoader并发加载图片示例 优化详情参考 https://www.jianshu.com/p/f7006ab64da7 LruCache和DiskLruCache参考 https://blog.youkuaiyun.com/ztchun/article/d...

Tenderness4的博客 665

android adb实用命令小结

感恩原创:http://www.jb51.net/article/112562.htm; adb对于Android程序员来说在日常的工作中使用频率很高,现将自己工作中常用的adb命令总结一下备忘,方便查询,也供大家参考。查看应用内存占用,耗电信息,启动时间,wakelock,跑monkey的命令在之前的应用性能优化中起了不小的作用。以下adb命令的测试机器为小米3,其中package_name代

尽此依报身,同生极乐国。 274

android 深度优化,【深度好文】深入探索 Android 内存优化(收藏慢慢看)

本篇是 Android 内存优化的进阶篇,难度可以说达到了炼狱级别,建议对内存优化不是非常熟悉的仔细看看前篇文章: Android性能优化之内存优化,其中详细分析了以下几大模块:1)、Android的内存管理机制2)、优化内存的意义深入探索 Android 内存优化(炼狱级别)3)、避免内存泄漏4)、优化内存空间5)、图片管理模块的设计与实现主要内容以文档整理以及视频整理的形式进行分享,配合B站视...

weixin_34162851的博客 307
上一篇: 辅助设置中自动旋转
下一篇: 写给自己----祭奠我逝去的青春
手艺人王学明
手艺人王学明 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄17年 441粉丝 185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值