偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺談.NET Micro Framework性能優(yōu)化

開發(fā) 后端
由于工作原因,這幾個(gè)月對(duì).NET家族的新成員.NET Micro Framework做了一些研究和實(shí)踐,對(duì)于這個(gè)可以直接運(yùn)行在硬件上的小家伙還是很看好的。這里將為大家講解.NET Micro Framework性能優(yōu)化的問(wèn)題。

.NET Micro Framework的可剪裁性,高定執(zhí)行,和天生對(duì)硬件高集成度都讓它的前途一片光明。當(dāng)然,它現(xiàn)在還很年輕,就發(fā)布的SDK v3.0來(lái)看,它還有很長(zhǎng)的路要走。

廢話不說(shuō),就這幾個(gè)月我用下來(lái)的經(jīng)驗(yàn)談?wù)勗卺槍?duì).NET Micro Framework應(yīng)用程序的性能優(yōu)化吧。

1. 盡可能減少方法調(diào)用!

方法調(diào)用過(guò)于頻繁對(duì)于性能的影響非常大,所以所有的優(yōu)化都是以這個(gè)為大前提的。

2. 盡可能避免使用屬性,而用公共域來(lái)代替。

因?yàn)榫庉嬈鲿?huì)在編譯的時(shí)候?yàn)槊總€(gè)屬性的getter和setter添加訪問(wèn)方法,基于***條,這是要避免地。
當(dāng)然也不是說(shuō)完全避免使用屬性了,畢竟有的時(shí)候?qū)傩允呛芊奖闱冶匾摹?BR>比如這個(gè)下面這個(gè)使用屬性的例子:

  1. public class Test  
  2. {  
  3.  public string Name { get; set; }  

需要把它改成這樣:

  1. public class Test  
  2. {  
  3.  public string Name;  

3. 只在構(gòu)造函數(shù)里面初始化變量。

這一條很容易明白,看下面的例子:

  1. public class Test  
  2. {  
  3.  private string name = "Test String";  
  4.  private DateTime date = DateTime.Now;  
  5.  private int score, counter;  
  6.    
  7.  public Test()  
  8.  {  
  9.   score = 0;  
  10.   counter = 0;  
  11.  }  

初始化的工作其實(shí)進(jìn)行了兩次,一次是在聲明變量的時(shí)候,另外一次是在調(diào)用構(gòu)造函數(shù)的時(shí)候。遵循***條原則,我們要盡可能減少方法調(diào)用,且構(gòu)造函數(shù)的使用概率很高,所以我們?cè)诖诵枰殉跏蓟墓ぷ魅考械綐?gòu)造函數(shù)里面來(lái)進(jìn)行。

4. 只在必要的地方調(diào)用lock。

對(duì)于MF這樣一個(gè)半實(shí)時(shí)的系統(tǒng)來(lái)說(shuō),lock的成本遠(yuǎn)遠(yuǎn)高于我們的想象。在.NET里面可能感覺(jué)不出來(lái),但到了MF這個(gè)小伙子手里感覺(jué)就非常明顯了,也許這一條大家已經(jīng)知道了,就當(dāng)我老調(diào)重彈吧。
看這個(gè)例子:

  1. public class Test  
  2. {  
  3.  private ArrayList objs;  
  4.    
  5.  public void SomeMethod(object o)  
  6.  {  
  7.   for(int i = 0; i < 100; i++)  
  8.   {  
  9.    if (objs.Contains(o))  
  10.    {  
  11.     lock(objs.SyncRoot)  
  12.     {  
  13.      objs.Remove(o);  
  14.     }  
  15.    }  
  16.   }  
  17.  }  

在一個(gè)循環(huán)里面增刪一個(gè)集合,由于是多線程訪問(wèn),所以在操作之前加了鎖。之所以在循環(huán)內(nèi)部加鎖,理由可能是想盡可能的減少lock的訪問(wèn)次數(shù),只有滿足那個(gè)if條件的時(shí)候才會(huì)被調(diào)用。
實(shí)際上,這個(gè)想法錯(cuò)了,無(wú)論如何,這里的lock都會(huì)被調(diào)用很多次,這些開銷加起來(lái)就會(huì)對(duì)性能造成很大的影響。
把代碼改成這樣就會(huì)好很多:

  1. public class Test  
  2. {  
  3.  private ArrayList objs;  
  4.    
  5.  public void SomeMethod(object o)  
  6.  {  
  7.   lock(objs.SyncRoot)  
  8.   {  
  9.    for(int i = 0; i < 100; i++)  
  10.    {  
  11.     if (objs.Contains(o))  
  12.     {  
  13.      objs.Remove(o);  
  14.     }  
  15.    }  
  16.   }  
  17.  }  

5. 保證每個(gè)時(shí)間只有一個(gè)線程在運(yùn)行。

用慣了.NET,來(lái)到MF世界***個(gè)不適應(yīng)就是它的多線程太慢了,如果同時(shí)打開兩個(gè)線程工作,那么整個(gè)程序的效率都會(huì)受到極大的影響。
拿電子地圖軟件來(lái)做例子,主線程負(fù)責(zé)更新UI,工作線程負(fù)責(zé)在后臺(tái)取得地圖塊。這樣的設(shè)計(jì)本身無(wú)可厚非也是合理的,但***我們發(fā)現(xiàn)性能實(shí)在太差了。
后來(lái)更改成為當(dāng)用戶在操作UI的時(shí)候,工作線程全都暫停,只有檢測(cè)到用戶沒(méi)有任何操作的時(shí)候才進(jìn)行工作。
要實(shí)現(xiàn)這一點(diǎn),就要求程序在設(shè)計(jì)的時(shí)候就考慮到工作線程的可暫停性。

6. 盡可能少的并且在最小的范圍內(nèi)調(diào)用Invalidate()方法。

很多人在重畫UI之后都會(huì)習(xí)慣性的調(diào)用頂層元素的Invalidate()方法來(lái)更新所有子控件,因?yàn)檫@樣是最快捷的??珊芏鄷r(shí)候我們忽略了一點(diǎn),Invalidate()這個(gè)方法可能在背后已經(jīng)被調(diào)用過(guò)很多次了。
比如,有的控件會(huì)在得到焦點(diǎn)的時(shí)候調(diào)用這個(gè)方法,有的控件會(huì)在出發(fā)用戶事件的時(shí)候自動(dòng)調(diào)用這個(gè)方法。因?yàn)檫@些都是在背后發(fā)生的,我們可能并不知情,所以在完成我們自己控件的繪制之后通常會(huì)調(diào)用parent的Invalide來(lái)更新整個(gè)布局,這樣就會(huì)在不知不覺(jué)之間導(dǎo)致了不必要的重畫產(chǎn)生。
要避免這個(gè)問(wèn)題也很簡(jiǎn)單,一則仔細(xì)觀察,二則用Refactor!去閱讀一下別人的代碼。

7. 盡可能少的使用圖片資源。

因?yàn)镸F本身的數(shù)據(jù)吞吐量很小,如果載入過(guò)多圖片資源的話,輕則程序運(yùn)行效率變低,重則出現(xiàn)內(nèi)存溢出。所以這里的原則我們要參照網(wǎng)頁(yè)的設(shè)計(jì)原則,例如一個(gè)按鈕圖片,把它切割成幾個(gè)小塊,利用重復(fù)貼圖來(lái)完成中間部分,而不要直接使用一整張圖片。
同樣在制作高亮的時(shí)候可以通過(guò)改變圖片透明度或者在圖片上面加一層透明矩形來(lái)實(shí)現(xiàn)。

8. 僅導(dǎo)入必要的字體資源。

這一點(diǎn)和上一條的理由是一樣的,都是減少運(yùn)行期間的數(shù)據(jù)吞吐量。對(duì)于英文來(lái)說(shuō)還好,本來(lái)就不大,對(duì)于中文來(lái)說(shuō)就很重要了,因?yàn)橹形淖煮w動(dòng)輒就是幾百k上兆,如果全部導(dǎo)入的話簡(jiǎn)直就是災(zāi)難。
***就是程序用到多少就導(dǎo)入多少,實(shí)在沒(méi)辦法,就把生僻字全部剔出吧。

9. 窗體***用完就是立即關(guān)閉。

這一點(diǎn)對(duì)于窗體很多的應(yīng)用程序非常重要!在.NET的世界里,打開一個(gè)主窗體,然后在主窗體里面創(chuàng)建子窗體的做法非常常見(jiàn)。但這可能會(huì)成為你的MF程序運(yùn)行效率***的隱性殺手。
例如 主窗體 -> 產(chǎn)品列表 -> 產(chǎn)品詳細(xì)信息 -> 產(chǎn)品操作窗口 -> 結(jié)算窗口
這是一個(gè)常見(jiàn)的邏輯線,此時(shí)一共有五個(gè)窗口被打看,如果你有時(shí)間嘗試的話,會(huì)發(fā)現(xiàn)在打開結(jié)算窗口的時(shí)候,整個(gè)程序已經(jīng)氣喘吁吁,動(dòng)彈不得了。

而且,因?yàn)镸F的半實(shí)時(shí)性,導(dǎo)致GC在關(guān)閉窗口之后不能立即釋放資源,如果用戶反復(fù)打開關(guān)閉這些窗口,內(nèi)存很快就溢出了。

所以實(shí)現(xiàn)一個(gè)窗口管理器非常重要,要確保每個(gè)時(shí)間只有一個(gè)窗口在運(yùn)行。

10. 減少Timer的使用。

Timer也是性能消耗的大戶,我曾見(jiàn)過(guò)一個(gè)程序里面打開了數(shù)十個(gè)Timer,那性能簡(jiǎn)直慘不忍睹。所以如果可能,保證整個(gè)程序只是用一個(gè)Timer,且只在必要的時(shí)候啟動(dòng)它,將會(huì)為你的程序減輕很多負(fù)擔(dān)。

【編輯推薦】

  1. .Net Micro數(shù)據(jù)的***存儲(chǔ)淺析
  2. 在.Net Micro Framework中支持英文輸入法
  3. 詳解.Net Micro實(shí)現(xiàn)SideShow窗體界面實(shí)例
  4. 詳解.Net Micro Framework平臺(tái)移植初步
  5. 在.Net Micro Framework中支持鼠標(biāo)操作
責(zé)任編輯:彭凡 來(lái)源: blog.codingmylife.com
相關(guān)推薦

2009-07-09 09:28:19

.Net Micro

2009-11-17 10:29:39

.NET Micro

2009-07-16 15:02:33

Shapes命名空間Net Micro F

2010-10-08 17:03:59

.NET Micro Visual Stud

2009-07-17 13:56:44

.Net Micro

2009-07-17 13:46:52

.Net Micro

2009-07-17 14:51:22

.Net Micro

2009-05-11 09:24:53

微軟.Net Micro 源代碼

2009-08-26 14:27:03

C# Framewor

2009-07-17 13:35:12

IO模擬器研究.Net Micro

2009-07-17 14:38:49

Micro Frame

2010-01-05 13:56:37

2009-07-21 14:16:02

ASP.NET管道優(yōu)化

2010-01-06 18:47:21

.NET Compac

2010-01-05 18:49:57

.NET Framew

2009-05-26 09:09:50

.NET FramewStream.Read基礎(chǔ)類

2009-07-22 17:07:16

WPF插件開發(fā).NET Framew

2019-08-21 10:53:29

.NET性能優(yōu)化

2009-04-11 15:12:24

.Net MicroI2C總線模擬器

2017-12-14 14:32:30

.Net內(nèi)存代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)