【Xamarin挖牆腳系列:應用的性能調優】

原文: 【Xamarin挖牆腳系列:應用的性能調優】

官方提供的工具:網盤地址:http://pan.baidu.com/s/1pKgrsrphtml

官方下載地址:https://download.xamarin.com/profiler/profiler-windows.msi數據庫

Xamarin Profiler,使用此工具,幫助咱們進行軟件性能的調優,找到應用的瓶頸。json

內存佔用較高的代碼調用進行監視。快速解決影響程序性能的代碼。windows

 

關於此工具的使用,請參見:緩存

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/app

一個差勁兒的應用,會體如今不少方面,如:下拉滾動卡頓,CPU佔用極高,耗費電池電量,內存佔用很高等等,從而形成的用戶交互不友好。less

爲了提高用戶體驗,必須對開發的程序進行性能調優。異步

性能調優的步驟:

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通訊  監測 股票金融的引用,對實時信息要求較高的。咱們就不要緩存,在提升數據通訊質量上,作優化。

相關文章
相關標籤/搜索