【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通信  监测 股票金融的引用,对实时信息要求较高的。我们就不要缓存,在提高数据通信质量上,做优化。

时间: 2024-08-01 22:48:03

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

IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象

硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instruments动态分析内存泄漏>关注了内存泄露的问题,本篇正好相反,关注的是内存中那些被过度释放的对象(overreleased objects). 这篇的标题纠结了半天,到底是写EXC_BAD_ACCESS错误调试,还是写内存中僵尸对象的分析,最后还是选了个Duang~Duang~的标题. 今天在论坛上看到

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

硬广:<IOS性能调优系列>第二篇,持续更新,欢迎关注. 第一篇介绍了Analyze对App做静态分析,可以发现应用中的内存泄漏问题,对于有些内存泄漏情况通过静态分析无法解决的,可以通过动态分析来发现,分析起来更有针对性. 从本篇开始介绍XCode提供的强大的分析工具Instruments,内存分析只是Instruments中的一个功能,其他功能后续介绍. 使用Instruments动态分析内存泄漏 Instruments中的Leaks功能主要用于分析内存泄漏,还是以<IOS性能调优系列

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

硬广:<IOS性能调优系列>第五篇,预计会有二十多篇,持续更新,欢迎关注. 之前四篇都是关注于内存方面,分析了内存泄漏.僵尸对象.内存分配,本篇介绍Time Profiler工具的使用,开始真正的“性能”调优之旅. Time Profiler还有之前介绍过的Leaks.Allocations工具,被戏称为Instruments的救命三招,是当应用遇到问题时首先应当使用的三个工具. Time Profiler帮助我们分析代码的执行时间,找出导致程序变慢的原因,告诉我们“时间都去哪儿了?”. 在使

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

目前关于IOS性能优化的教程较少,决定写一个<IOS性能调优系列>,主要关注与内存泄漏.性能优化.流量和电量分析几个方面. XCode已经提供了非常强大的性能调优工具,结合几个第三方工具和一些技巧,进行性能优化非常简单. 第一篇先写写最简单的,Analyze静态分析. 相信IOS开发者在App进行Build或Archive时,会产生很多编译警告,这些警告是编译时产生的,静态分析的过程也类似,在XCode Product菜单下,点击Analyze对App进行静态分析. Analyze主要分析以下

IOS性能调优系列:使用Allocation动态分析内存使用情况

硬广:<IOS性能调优系列>第三篇,持续更新,欢迎关注. <IOS性能调优系列:Analyze静态分析>介绍了使用静态分析方法查找IOS内存泄漏的方法,<IOS性能调优系列:使用Instruments动态分析内存泄漏>讲解了使用Instruments的Leaks工具动态分析内存泄漏. 这两篇都是关注于内存泄漏的,是内存调优首先要关注的方面. 关于内存的问题,除了内存泄漏以外,还可能存在内存不合理使用的情况,也会导致IOS内存警告. 内存的不合理使用往往比内存泄漏更难发现

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

前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过本篇了解如何阅读和理解查询计划.并且列举一系列最常用的查询执行运算符. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 一.区别不同的运算符 在所有T-SQL语句在执行的时候,都会将语句分解为一些基本的结构单元,这些结构单元统称为:运

SQL 语句性能调优

经常听到有做应用的朋友抱怨数据库的性能问题,比如非常低的并发,令人崩溃的响应时间,长时间的锁等待,锁升级 , 甚至是死锁,等等.在解决这些问题的过程中,DBA 经常发现应用开发人员对数据库的"误用".包括 , 返回过多不必要的数据 , 不必要和不适当加锁,对隔离级别的误用和对存储过程的误用等等.但是,面对浩如烟海的数据库知识 , 要求完全掌握 , 对应用开发人员来说也确实枯燥艰深 . 因此,笔者特别提炼对应用开发人员有帮助的 SQL 书写部分,以期望能对数据库开发人员有所帮助. &qu

性能调优:消耗分析

本篇为系统性总结性能调优中的消耗分析. 性能调优系列的其他篇幅,请查阅. 性能调优:CPU消耗分析 性能调优:IO消耗分析 性能调优:消耗分析思维导图 转载注明出处:http://blog.csdn.net/supera_li/article/details/45251055 性能调优之消耗分析,思维导图 卧槽,终于画完了..图中不明确的地方直接回复文章,我会单独细节补充在下面.如有错误,请多多指教.

ASP.NET性能调优

性能调优 最佳实践的核心就是旨在提高网站性能. Excetional Performance团队总结出了一系列可以提高网站速度的方法.可以分为7大类34条.包括内容.服务器.cookie.CSS.Javascrīpt.图片.移动应用等七部分. 其中内容部分一共十条建议: 一.内容部分 尽量减少HTTP请求 减少DNS查找 避免跳转 缓存Ajxa 推迟加载 提前加载 减少DOM元素数量 用域名划分页面内容 使frame数量最少 避免404错误 1.尽量减少HTTP请求次数 终端用户响应的时间中,有