原文:【Xamarin挖墙脚系列:应用的性能调优】

官方提供的工具:网盘地址:http://pan.baidu.com/s/1pKgrsrp

官方下载地址:https://download.xamarin.com/profiler/profiler-windows.msi

Xamarin Profiler,使用此工具,帮助我们进行软件性能的调优,找到应用的瓶颈。

内存占用较高的代码调用进行监视。快速解决影响程序性能的代码。

关于此工具的使用,请参见:

https://developer.xamarin.com/guides/cross-platform/deployment,_testing,_and_metrics/

关于程序性能提升的几条建议:

官方文档:https://developer.xamarin.com/guides/cross-platform/deployment,_testing,_and_metrics/memory_perf_best_practices/

一个差劲儿的应用,会体现在很多方面,如:下拉滚动卡顿,CPU占用极高,耗费电池电量,内存占用很高等等,从而造成的用户交互不友好。

为了提升用户体验,必须对开发的程序进行性能调优。

性能调优的步骤:

1 使用监视工具找出内存占用较高的代码区域

2 使用真机测试,而不是用模拟器

3 使用多种不同型号 不同配置的真机测试

4 测试前,关闭其他应用,减少不必要的干扰

优化建议:

1 使用

IDisposable

接口,进行释放非托管的资源,IO流,HTTP网络流,数据库读写流等。使用实现了此接口的类的实例的操作,尽量使用Using (){}代码块。

public void ReadText (string filename)
{
...
string text;
using (StreamReader reader = new StreamReader (filename)) {
text = reader.ReadToEnd ();
}
...
}public void ReadText (string filename)
{
...
string text;
using (StreamReader reader = new StreamReader (filename)) {
text = reader.ReadToEnd ();
}
...
}

  

2 在try catch 代码块中,一定要对实现了IDisposable的资源进行释放

3 对事件进行退订操作。我们一般对实现  进行 订阅 add 操作,在使用的时候 ,尽量减少一个监听的多次订阅,减少多播委托的触发调用。

如下面的代码:

public class Publisher
{
public event EventHandler MyEvent; public void OnMyEventFires ()
{
if (MyEvent != null) {
MyEvent (this, EventArgs.Empty);
}
}
} public class Subscriber : IDisposable
{
readonly Publisher publisher; public Subscriber (Publisher publish)
{
publisher = publish;
publisher.MyEvent += OnMyEventFires;
} void OnMyEventFires (object sender, EventArgs e)
{
Debug.WriteLine ("The publisher notified the subscriber of an event");
} public void Dispose ()
{
publisher.MyEvent -= OnMyEventFires;
}
}

  在释放的时候,就退订了事件的订阅。

4 注意:高潮来了

在托管代码中,尽量不要使用不同类型的类的相互嵌套。一旦出现嵌套,那么除非强制销毁两个相互依赖的实例,否则,这相互依赖的实例不会被GC回收掉。比如以下的代码:

class  A 依赖class B ,同样,B中有A。这种嵌套一旦形成,就无法让GC以为两个实例是没有被引用,从而无法销毁。

5 对耗时操作,使用异步方法,防止阻塞UI。对这类操作,使用.net 4.0后的 Task async await 搭配,封装异步的调用。

6   使用GC进行强制垃圾回收,Xamarin提供了两种垃圾回收器。

  • SGen – This is a generational garbage collector and is the default garbage collector on the Xamarin platform.
  • Boehm – This is a conservative, non-generational garbage collector. It is the default garbage collector used for Xamarin.iOS applications that use the Classic API.

Sgen的垃圾回收性能效果是很客观的。

7 减少应用程序包的体积

使用Xamarin的 Link技术。

The linker provides three different settings to control its behavior:

  • Don’t Link – No unused types and methods will be removed by the linker. For performance reasons, this is the default setting for debug builds.
  • Link Framework SDKs/SDK Assemblies Only – This setting will only reduce the size of those assemblies that are shipped by Xamarin. User code will be unaffected.
  • Link All Assemblies – This is a more aggressive optimization that will target the SDK assemblies and user code. For bindings this will remove unused backing fields and make each instance (or bound objects) lighter, consuming less memory.

自己手工对比,发现,Link后的dll体积比非Link的减少许多。Xamarin团队,实现了将跟程序无关的API进行移除的操作。大大减少了程序包的体积。

8 优化图片资源

因为图片资源是要被加载进入内存中的,过多的图片资源,可能导致CPU占用较高,内存爆满,对图片等素材进行压缩处理,在不失真,不损失分辨率的情况下,对图片资源进行压缩。

在关闭窗口的时候,释放掉图片资源。

9 减少在程序加载的时候初始化过多的资源

一般在程序启动的时候,我们开启一个过渡动画效果,提示用户程序启动中。等初始化完毕后,进入程序。但是不要过于耗时的初始化,感觉是程序假死。

所以在程序处于激活的时候,我们如果加载一些本地资源 文本 或者二进制数据 或者xml等,尽量把关键数据加载完毕,即可。一些网络操作等,如果没有必要,就不要进行。

10 减少程序客户端跟网络的通信

一些静态数据块,比如类别 科目 考试的试题  单词库 离线地图数据包等等。如果不是升级更新,那么这些数据块在第一次加载到客户端后,不用经常更新。每次去网络检索下,是否有新的数据包,有的话,提示用户更新。

我们可以将这些数据  打包成特定的文本文件 xml文件 json数据文件  db 文件 dat二进制数据文件。

在客户端尽可能多的缓存这些数据块,会极大的提高用户体验。而不是每次都要从服务器端,下载大量的数据包。

当然,针对一些在线视频 IM通信  监测 股票金融的引用,对实时信息要求较高的。我们就不要缓存,在提高数据通信质量上,做优化。

【Xamarin挖墙脚系列:应用的性能调优】的更多相关文章

  1. SQL Server调优系列基础篇 - 性能调优介绍

    前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...

  2. SQL Server 调优系列基础篇 - 性能调优介绍

    前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...

  3. Spark Streaming概念学习系列之SparkStreaming性能调优

    SparkStreaming性能调优 合理的并行度 减少批处理所消耗时间的常见方式还有提高并行度.有以下三种方式可以提高并行度: 1.增加接收器数目 有时如果记录太多导致单台机器来不及读入并分发的话, ...

  4. 恒天云技术分享系列3 – KVM性能调优

    恒天云技术分享:http://www.hengtianyun.com/download-show-id-11.html KVM是什么 KVM 是 kernel-based Virtual Machin ...

  5. 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

  6. jvm系列(五):tomcat性能调优和性能监控(visualvm)

    tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...

  7. IOS性能调优系列:Analyze静态分析

    目前关于IOS性能优化的教程较少,决定写一个<IOS性能调优系列>,主要关注与内存泄漏.性能优化.流量和电量分析几个方面. XCode已经提供了非常强大的性能调优工具,结合几个第三方工具和 ...

  8. IOS性能调优系列:使用Instruments动态分析内存泄漏

    硬广:<IOS性能调优系列>第二篇,持续更新,欢迎关注. 第一篇介绍了Analyze对App做静态分析,可以发现应用中的内存泄漏问题,对于有些内存泄漏情况通过静态分析无法解决的,可以通过动 ...

  9. IOS性能调优系列:使用Time Profiler发现性能瓶颈

    硬广:<IOS性能调优系列>第五篇,预计会有二十多篇,持续更新,欢迎关注. 之前四篇都是关注于内存方面,分析了内存泄漏.僵尸对象.内存分配,本篇介绍Time Profiler工具的使用,开 ...

随机推荐

  1. ASP.NET 设计模式中依赖倒置原则

    依赖倒置原则 A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象. B.抽象不应该依赖于具体,具体应该依赖于抽象. 依赖倒置原则 A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于 ...

  2. 格式太旧或是类型库无效。 (Exception from HRESULT: 0x80028019 (TYPE_E_UNSUPFORMAT))

    错误提示信息 格式太旧或是类型库无效. (Exception from HRESULT: 0x80028019 (TYPE_E_UNSUPFORMAT)) . Old format or invali ...

  3. oracle定时备份

    1.将如下代码复制到文本中,最后将文本后缀名称修改成XXX.bat 批处理文件: *********************************************************** ...

  4. OC加强-day03

    #program mark - 0_18 分类的使用注意 [掌握] 1.分类的作用 作用:讲一个类分为多个模块,将相似功能的方法写在同一个模块中,方便我们后面代码的维护 "强调 1.分类中只 ...

  5. javaee学习-JSP指令简介

    JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: page指令 Inclu ...

  6. webstorm的默认project编码为系统编码GBK.

    使用新的IDE,而不会设置,会给你带来灾难. 如下为我是用webstorm时遇到的文件编码问题. 纳闷很久,终于发现是IDE的设置问题. 参考

  7. STL之优先队列

    STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素 ...

  8. ffmpeg只使用h264编译参数

    --disable-everything --enable-decoder=h264 --enable-demuxer=h264 --enable-parser=h264 --disable-ffpl ...

  9. I/O端口与I/O内存

    端口的概念:设备通过系统总线上的接口与CPU相连,接口电路中含有多种寄存器,CPU向设备读写数据实际上是向接口上的寄存器读写数据,这些寄存器称为I/O端口.一个接口通常包含控制端口,数据端口,状态端口 ...

  10. CSS3之简易的3D模型构建[原创开源]

    CSS3之简易的3D模型构建[开源分享] 先上一张图(成果图):这个是使用 3D建模空间[源码之一] 制作出来的模型之一 当然这是一部分模型特写, 之前还制作过枪的3D模型等等. 感兴趣的朋友可以自己 ...