Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲视频中文字幕,男人的天堂精品国产一区,波多野结衣教室

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          從四分鐘到兩秒——談?wù)効蛻舳诵阅軆?yōu)化的一些最佳實(shí)踐

          背景

          最近跟售后經(jīng)理吃飯,他跟我再次談起兩年前為公司臨時(shí)寫(xiě)的一個(gè)客戶端,仍然非常激動(dòng)的跟我說(shuō),這個(gè)客戶端完爆了公司其他版本的客戶端,包括最老的Delphi寫(xiě)的,Asp.Net寫(xiě)的,以及最新的Wpf寫(xiě)的客戶端。無(wú)論是多么大的界面(集成的機(jī)房多),這個(gè)系統(tǒng)都是瞬間打開(kāi),而且運(yùn)行非常穩(wěn)定,一旦成功部署之后基本沒(méi)有任何問(wèn)題。

          這個(gè)版本的客戶端僅僅只是一個(gè)臨時(shí)替代的版本:原來(lái)的Delphi客戶端實(shí)在是太慢了,在大型的數(shù)據(jù)中心監(jiān)控中需要4~5分鐘才能進(jìn)入主監(jiān)控界面,而版本的客戶端又經(jīng)常存在不穩(wěn)定的情況(IE瀏覽器不支持7*24小時(shí)的異步刷新),最新的Wpf客戶端又還在設(shè)計(jì)階段,于是臨危受命決定開(kāi)發(fā)一個(gè)臨時(shí)過(guò)渡版本,當(dāng)時(shí)也只是開(kāi)發(fā)了一個(gè)月,沒(méi)想到竟然如此成功,至今仍讓我們的售后部門(mén)津津樂(lè)道。這中間其實(shí)沒(méi)有太多高深的技術(shù),但是卻有很多的開(kāi)發(fā)技巧以及編程的思想。我至今仍然看到很多人都在犯這么一些簡(jiǎn)單的錯(cuò)誤(例如VS2010工具箱的加載項(xiàng)),導(dǎo)致他們的系統(tǒng)非常緩慢,但是他們卻總是抱怨是編程語(yǔ)言的問(wèn)題,是windows系統(tǒng)的問(wèn)題,是機(jī)器的性能不行……

          我決定把我的一些實(shí)踐經(jīng)驗(yàn)跟大家分享:不是非得你有多么牛逼的技術(shù),才能做出一個(gè)穩(wěn)定快速的系統(tǒng),更多的時(shí)候,它取決于你是否有一個(gè)產(chǎn)品的意識(shí),是否讓你的軟件真正貼近用戶。

          系統(tǒng)界面與功能

          先來(lái)看看原來(lái)的系統(tǒng)界面是怎樣子的:

          其功能如下,我新寫(xiě)的客戶端增加了支持生成OCX控件的功能:

          整個(gè)系統(tǒng)的物理架構(gòu)是這樣的:

          原系統(tǒng)存在的問(wèn)題

          頁(yè)面之間切換卡

          數(shù)據(jù)顯示慢

          地點(diǎn)的報(bào)警狀態(tài)顯示不準(zhǔn)確且存在延遲

          報(bào)警并發(fā)較多時(shí)卡頓更嚴(yán)重

          客戶端性能優(yōu)化的基本手法

          我們來(lái)看看通過(guò)一些什么手法能夠解決原來(lái)的系統(tǒng)存在的這些問(wèn)題。

          按需獲取

          大部分的情況下,我們其實(shí)所能看到的東西都是極其有限的,無(wú)論系統(tǒng)是多么龐大,功能多么的豐富,其實(shí)呈現(xiàn)給用戶的都是極其有限的。

          監(jiān)控界面的按需獲取

          前面說(shuō)了,監(jiān)控主界面里的界面都是組態(tài)的,是由工程師拖拉控件上去實(shí)現(xiàn)的,大家也看到上面圖形還算豐富,主要是使用了大量的圖片,因此我們系統(tǒng)中在保存這些組態(tài)界面的時(shí)候,同時(shí)也保存了界面圖片的字節(jié)流。大型的數(shù)據(jù)中心由于界面較多,這些界面加起來(lái)是可能會(huì)超過(guò)1G大小的。這么大的界面,如果都是直接加載到界面中,首先就要費(fèi)不少的時(shí)間,即使是在內(nèi)網(wǎng)的情況下,假設(shè)你網(wǎng)絡(luò)能夠1s下載20M左右,也要50秒,接近1分鐘,遇上網(wǎng)絡(luò)高峰,花個(gè)1~2分鐘并不奇怪。

          我們是否有必要把所有界面都加載進(jìn)來(lái)呢,當(dāng)然沒(méi)有。我們只需加載第一個(gè)界面,其他界面在需要的時(shí)候(用戶點(diǎn)擊或者發(fā)生告警需要跳轉(zhuǎn)的時(shí)候)才加載,這樣我們的速度里面就提升了,這就是按需加載!

          當(dāng)然說(shuō)的輕巧,實(shí)際做的會(huì)有很多問(wèn)題。比如,如何實(shí)現(xiàn)不實(shí)現(xiàn)頁(yè)面又能知道該頁(yè)面是否告警(必須解析每個(gè)界面上的控件,才能知道某個(gè)界面包含了哪些控件,才知道監(jiān)控指標(biāo)告警在哪個(gè)界面上)?

          我的步驟如下:

          按需刷新界面上的數(shù)據(jù)

          做監(jiān)控系統(tǒng),除了告警頁(yè)面必須實(shí)時(shí)通知到客戶外,監(jiān)控?cái)?shù)據(jù)界面,其實(shí)只需展示當(dāng)前顯示頁(yè)面的數(shù)據(jù)即可。

          怎么做呢,我們可以提供一個(gè)單獨(dú)的程序來(lái)管理所有接收到的數(shù)據(jù),然后再提供一個(gè)獲取當(dāng)前數(shù)據(jù)的接口給客戶端,具體請(qǐng)看下面更改的架構(gòu)。

          將程序集添加到緩存失敗 嘗試安裝沒(méi)有強(qiáng)名稱的程序集_將程序集添加到緩存失敗_無(wú)法加載程序集

          有些人可能會(huì)疑問(wèn),為什么不直接在采集器中提供這個(gè)接口呢?因?yàn)檫@是組態(tài)界面,界面上的控件要取哪個(gè)采集器的數(shù)據(jù)是未知的,所以把數(shù)據(jù)放在一起統(tǒng)一管理會(huì)更加方便。而且采集器可以7*24小時(shí)工作,而客戶端是經(jīng)常要打開(kāi)關(guān)閉的……

          VS2010中的反例

          如果用過(guò)VS2010開(kāi)發(fā)自定義的Winform組件,那么大家對(duì)它的工具箱加載自定義組件這個(gè)功能肯定印象深刻,每次選擇添加項(xiàng),然后選擇自定義控件dll的時(shí)候,都非常痛苦,尤其我電腦比較忙而又裝了不少插件的情況下,為了一個(gè)非常簡(jiǎn)單的功能,我需要花費(fèi)4分多的時(shí)間來(lái)打開(kāi)那個(gè)選擇文件的界面,這個(gè)界面加載了一大堆我絕大多數(shù)時(shí)候都用不上的COM組件,我實(shí)在沒(méi)法想象開(kāi)發(fā)這個(gè)功能的程序猿是怎么想的。還好,在VS2013中微軟總算是改進(jìn)了這個(gè)功能,但是做得還不夠。按我的想法,完全可以把COM組件部分異步加載,給出正在加載的提示即可,可以立即顯示“選擇”按鈕,這樣體驗(yàn)性立即上升了一個(gè)層次。

          延遲加載

          延遲加載是指用到的時(shí)候,再去進(jìn)行實(shí)際的構(gòu)建。

          樹(shù)形菜單的延遲加載

          樹(shù)形菜單的樹(shù)形節(jié)點(diǎn)的構(gòu)建就是一個(gè)最適合解釋的例子。大家可以嘗試加載1000個(gè)樹(shù)形節(jié)點(diǎn)然后構(gòu)建成一棵樹(shù),看看在Winform中需要多長(zhǎng)的時(shí)間。我們的實(shí)際中有沒(méi)有必要這么去做呢?

          各位可以思考下自己查看樹(shù)形導(dǎo)航的時(shí)候,是不是從根節(jié)點(diǎn)到子節(jié)點(diǎn)最后到葉子節(jié)點(diǎn)這樣一步步看下去的,大部分的時(shí)候,其實(shí)我們只需首先看到根節(jié)點(diǎn)即可。例如下面這個(gè):

          將程序集添加到緩存失敗_無(wú)法加載程序集_將程序集添加到緩存失敗 嘗試安裝沒(méi)有強(qiáng)名稱的程序集

          對(duì)于這種情況,我們完全可以把樹(shù)形節(jié)點(diǎn)都獲取,但是先只創(chuàng)建只有根節(jié)點(diǎn)的一棵樹(shù),在用戶點(diǎn)擊之后加載子節(jié)點(diǎn),如果已判斷過(guò),則不執(zhí)行加載的操作。基本的方法是在Tag中附加一個(gè)字段指示子節(jié)點(diǎn)是否已經(jīng)加載,參考代碼如下:

          無(wú)法加載程序集_將程序集添加到緩存失敗 嘗試安裝沒(méi)有強(qiáng)名稱的程序集_將程序集添加到緩存失敗

          private void lect(object sender, rgs e)

          var myNode = e.Node.Tag as NTier.Model.;

          if (myNode == null) return;

          if (myNode. == false)

          //還沒(méi)有加載數(shù)據(jù),主要是指機(jī)房節(jié)點(diǎn)

          rm(e.Node, myNode); //加載樹(shù)形子節(jié)點(diǎn)

          //已加載了數(shù)據(jù),則生成相應(yīng)的界面

          (myNode);

          這里延遲加載與按需加載有點(diǎn)類似,區(qū)別是,延遲加載必須把所有數(shù)據(jù)加載進(jìn)來(lái),但是并不構(gòu)建成一棵UI樹(shù),而是在用到的時(shí)候再去生成。

          右鍵延遲初始化

          另一個(gè)地方就是每個(gè)控件的右鍵菜單。因?yàn)槊總€(gè)右鍵菜單顯示的內(nèi)容是需要根據(jù)控件的類型以及相關(guān)的權(quán)限來(lái)判斷的,但是我們看到右鍵菜單的時(shí)候一定是人為進(jìn)行操作才能顯示出來(lái),因此沒(méi)有必要再界面生成的過(guò)程中去為每個(gè)控件生成對(duì)應(yīng)的右鍵菜單,而是在彈出右鍵菜單時(shí)進(jìn)行相關(guān)的判斷,延遲右鍵菜單的生成。

          將程序集添加到緩存失敗 嘗試安裝沒(méi)有強(qiáng)名稱的程序集_無(wú)法加載程序集_將程序集添加到緩存失敗

          化曲為直

          我們知道,如果要查看一棵樹(shù)的所有節(jié)點(diǎn),常用的方法就是使用遞歸進(jìn)行廣度遍歷或者深度遍歷。但是,在樹(shù)形節(jié)點(diǎn)較多的時(shí)候,遍歷其實(shí)是非常耗時(shí)的。在我們這個(gè)系統(tǒng)中,告警是必須要最先處理的,因此,我在系統(tǒng)中使用類型緩存了每個(gè)屬性節(jié)點(diǎn)與它相關(guān)聯(lián)的數(shù)據(jù)類型(ID),從而能夠在發(fā)生告警時(shí)馬上定位到指定樹(shù)形節(jié)點(diǎn)。

          緩存,還是緩存

          緩存界面

          我們系統(tǒng)是組態(tài)的界面,這就限制了界面的生成必須是動(dòng)態(tài)的。如果我們采用按需加載的方式,那么界面的生成就是實(shí)時(shí)的,怎么能夠做到快速的進(jìn)行頁(yè)面的切換呢?

          var = .(this, , myNode.AgentBm); //創(chuàng)建Panel

          在這里,我專門(mén)寫(xiě)了一個(gè)界面的緩存類,如果沒(méi)有緩存,則動(dòng)態(tài)創(chuàng)建,如果有緩存,就直接返回緩存的界面。同時(shí),根據(jù)界面的最新的打開(kāi)時(shí)間和點(diǎn)擊次數(shù),對(duì)緩存的界面進(jìn)行管理。我們知道,整個(gè)大型系統(tǒng)中,其實(shí)用戶關(guān)注的界面也是有限的,一般他們只會(huì)關(guān)注最重要的幾個(gè)界面,最常用的也是這幾個(gè)界面。通過(guò)緩存的管理,不但能夠?qū)崿F(xiàn)界面之間的快速切換,同時(shí)也減少了系統(tǒng)占用的內(nèi)存。我整個(gè)客戶端程序文件大小壓縮之后在500k之內(nèi),而運(yùn)行期間占用內(nèi)存基本維持在50M左右。

          緩存數(shù)據(jù)

          查看上面改造過(guò)后的架構(gòu),我們知道現(xiàn)在獲取數(shù)據(jù)是在打開(kāi)界面之后再去獲取,直到建立連接并取得數(shù)據(jù)之后,才能在界面上顯示,這個(gè)過(guò)程一般會(huì)耗時(shí)1~2秒,網(wǎng)絡(luò)差的情況會(huì)更糟。怎樣才能讓用戶更為快速的確定我們的系統(tǒng)已經(jīng)運(yùn)行了呢?這里我們通過(guò)一個(gè)簡(jiǎn)單的辦法,集中服務(wù)端通過(guò)定時(shí)把當(dāng)前監(jiān)控到的數(shù)據(jù)寫(xiě)入控件的屬性中,在系統(tǒng)加載控件的同時(shí)把這個(gè)值顯示出來(lái),這樣可以看起來(lái)好像是系統(tǒng)馬上獲取到了數(shù)據(jù)。而由于緩存的值是定時(shí)把最新值寫(xiě)入進(jìn)去的,這種做法在很大程度上保證了緩存中的數(shù)值是正確的。

          異步,還是異步

          異步是提高程序響應(yīng)和用戶體驗(yàn)的不二法寶。C#中的控件和大部分流操作類等都提供了支持異步操作的方法:和EndXXX.它的原理也非常簡(jiǎn)單,使用時(shí),把操作加入線程池,執(zhí)行完成之后調(diào)用一個(gè)回調(diào)函數(shù)。

          一個(gè)用戶體驗(yàn)良好的系統(tǒng),應(yīng)該能夠合理的使用異步操作,確保執(zhí)行UI更新時(shí)以及執(zhí)行耗時(shí)的操作時(shí)不會(huì)阻塞。大部分人在寫(xiě)代碼的時(shí)候,總是直接進(jìn)行調(diào)用,在控件較少或者完成簡(jiǎn)單任務(wù)的時(shí)候,你一般都感覺(jué)不出來(lái),但是在控件數(shù)量多的時(shí)候,我們很容易就感覺(jué)到界面卡,不流暢。

          我在新系統(tǒng)開(kāi)發(fā)的時(shí)候,就有意識(shí)的在控件加載、控件數(shù)據(jù)刷新、控件告警狀態(tài)切換等操作中使用了異步的操作,讓系統(tǒng)在打開(kāi)界面時(shí)完全感覺(jué)不到卡的跡象。

          不過(guò)使用異步要時(shí)刻記得,異步可以提高用戶體驗(yàn)性,但是不會(huì)有性能上的實(shí)質(zhì)提升,如果感覺(jué)到數(shù)據(jù)響應(yīng)有延遲,你還是得花功夫找到根本的原因。

          歸并處理

          界面數(shù)據(jù)刷新歸并處理

          我們來(lái)看看原來(lái)界面是怎么刷新數(shù)據(jù)的:

          打開(kāi)界面->刷新數(shù)據(jù)->新建一個(gè)線程->定時(shí)刷新數(shù)據(jù)->關(guān)閉界面->關(guān)閉線程。

          對(duì)Windows系統(tǒng)有足夠了解的人都知道,新開(kāi)一個(gè)線程都是非常耗費(fèi)資源的。這種情況,我們是可以在整個(gè)系統(tǒng)中,提供一個(gè)統(tǒng)一管理的刷新線程,只需對(duì)當(dāng)前需要刷新的界面進(jìn)行刷新即可:

          刷新線程->判斷當(dāng)前界面是否存在->定時(shí)刷新數(shù)據(jù)

          結(jié)合上述的異步操作,我們的控件在刷新數(shù)據(jù)的時(shí)候非常的流暢。

          告警跳轉(zhuǎn)歸并處理

          上面我們提到了,在系統(tǒng)發(fā)生告警時(shí),必須要跳轉(zhuǎn)到報(bào)警的頁(yè)面,這個(gè)機(jī)制在大量告警并發(fā)的時(shí)候,就會(huì)有非常大的問(wèn)題,很可能我們的系統(tǒng)就會(huì)在不同的界面中進(jìn)行跳轉(zhuǎn)而卡死。對(duì)于系統(tǒng)的用戶來(lái)說(shuō),在1~3秒內(nèi)的多個(gè)告警,我們其實(shí)可以處理為一個(gè)告警,我們只需往最后一個(gè)告警發(fā)生的頁(yè)面跳轉(zhuǎn)即可,這樣既達(dá)到了相應(yīng)的效果,也減少了系統(tǒng)的壓力。這就是告警并發(fā)時(shí)的歸并處理。

          無(wú)法加載程序集_將程序集添加到緩存失敗 嘗試安裝沒(méi)有強(qiáng)名稱的程序集_將程序集添加到緩存失敗

          視覺(jué)欺騙

          在一些情況中,我們確實(shí)短時(shí)間沒(méi)有辦法對(duì)性能進(jìn)行提升了,花費(fèi)的時(shí)間卻要要這么多,這種情況下,我們有些什么好的做法呢?

          給出提示信息或者進(jìn)度條

          如果大家經(jīng)常用手機(jī)登陸微博、微信等,肯定對(duì)這些app加載圖片有過(guò)一些體會(huì),尤其如果你是在網(wǎng)絡(luò)較差的情況下,同樣是要等1分鐘才能加載出圖片,如果這個(gè)app沒(méi)有任何提示,那么,過(guò)了30秒或者20秒,你就有可能受不了把他點(diǎn)掉了,因?yàn)槟愀杏X(jué)它似乎已經(jīng)過(guò)了幾分鐘,還有可能遙遙無(wú)期;而如果這個(gè)app能夠提示當(dāng)前下載的字節(jié)數(shù)、當(dāng)前下載的進(jìn)度,那么,1分鐘的等待,你似乎也能接受,這畢竟是網(wǎng)絡(luò)引起的問(wèn)題。這就是一種視覺(jué)上的欺騙。

          將程序集添加到緩存失敗_將程序集添加到緩存失敗 嘗試安裝沒(méi)有強(qiáng)名稱的程序集_無(wú)法加載程序集

          在一個(gè)系統(tǒng)的加載過(guò)程中,有提示信息和沒(méi)提示信息,有進(jìn)度條和沒(méi)進(jìn)度條,給人感覺(jué)的速度是不一樣的,即使從實(shí)際的情況來(lái)看這兩者沒(méi)有任何差別。

          偷偷加載

          很多時(shí)候,我們系統(tǒng)的運(yùn)行需要從服務(wù)器中獲取一些最新的數(shù)據(jù),以支撐基本的運(yùn)行。這部分時(shí)間是你必不可少的,很多人都認(rèn)為這是沒(méi)有任何辦法優(yōu)化的,其實(shí)不然。我們很多程序其實(shí)都提供了一個(gè)用戶名和密碼的輸入框,其實(shí)在用戶輸入的過(guò)程中,我們還是可以利用的。在彈出登陸窗到輸入賬號(hào)和密碼到登入系統(tǒng)的過(guò)程中,一般都會(huì)有3~5秒的時(shí)間。

          我看到很多人寫(xiě)程序,彈出登錄框就老老實(shí)實(shí)的彈出,然后在輸入完用戶名和密碼之后在進(jìn)行數(shù)據(jù)的獲取和加載,實(shí)際上,我們已經(jīng)浪費(fèi)了這些時(shí)間。如果你能有效利用這3~5秒,那么,你就已經(jīng)贏在了起跑線。

          簡(jiǎn)化數(shù)據(jù)

          視覺(jué)欺騙的另外一個(gè)重要運(yùn)用,就是在曲線的渲染中。在機(jī)房監(jiān)控中,我們有些設(shè)備的監(jiān)控比較頻繁,一天產(chǎn)生的數(shù)據(jù)高達(dá)幾萬(wàn)條,把這么多的數(shù)據(jù)繪制到一條24小時(shí)的曲線上,我們將會(huì)看到很多密密麻麻的點(diǎn),繪制這些點(diǎn)非常的耗時(shí)和耗資源。而我們提供曲線給用戶查看的目的是什么呢,是想查看一天的趨勢(shì)變化,過(guò)多密集的點(diǎn)其實(shí)是沒(méi)有必要的,大家看看下圖,如果數(shù)據(jù)點(diǎn)更多的話,第二個(gè)曲線會(huì)更加密集,看起來(lái)會(huì)像一條粗大的直線:

          無(wú)法加載程序集_將程序集添加到緩存失敗_將程序集添加到緩存失敗 嘗試安裝沒(méi)有強(qiáng)名稱的程序集

          通過(guò)簡(jiǎn)單算法對(duì)曲線進(jìn)行壓縮之后,顯示歷史趨勢(shì)的速度非常的快,非常的流暢。我們對(duì)比上面兩條曲線,其實(shí)對(duì)用戶來(lái)說(shuō),或許更喜歡第一條曲線,因?yàn)樗磻?yīng)的趨勢(shì)更為優(yōu)美,有木有?

          使用單元測(cè)試輔助開(kāi)發(fā)

          在我的博文中,我一直強(qiáng)調(diào)使用單元測(cè)試,無(wú)論是開(kāi)發(fā)還是重構(gòu)。我覺(jué)得這個(gè)無(wú)論是怎么強(qiáng)調(diào)都不為過(guò)的。

          在開(kāi)發(fā)的過(guò)程,我們應(yīng)該有意識(shí)的按單元測(cè)試的目的來(lái)構(gòu)建我們的函數(shù)、類、以及程序集,如果你的函數(shù)符合單元測(cè)試要求的話,一般都是比較容易重構(gòu)和維護(hù)的。另外,我們開(kāi)發(fā)的過(guò)程中,很多時(shí)候需要驗(yàn)證某個(gè)功能是否可用,使用單元測(cè)試,將會(huì)很快速的幫你完成這個(gè)驗(yàn)證操作。我看我們很多程序員開(kāi)發(fā)效率都不高,尤其在開(kāi)發(fā)一個(gè)大型系統(tǒng)的時(shí)候,喜歡把整個(gè)系統(tǒng)開(kāi)起來(lái)調(diào)試,或者是在系統(tǒng)里面加上各種配置或者條件編譯來(lái)進(jìn)行調(diào)試,這種習(xí)慣非常不好。在程序中加入配置容易讓程序結(jié)構(gòu)出現(xiàn)混亂,代碼的閱讀體驗(yàn)也不好,很多時(shí)候如果我們忘記去掉這個(gè)配置,很容易就對(duì)發(fā)布的系統(tǒng)產(chǎn)生較大的影響。

          使用單元測(cè)試另外一個(gè)好處是,我們可以隨時(shí)針對(duì)某個(gè)方法進(jìn)行性能上的測(cè)試,發(fā)現(xiàn)哪些代碼對(duì)我們的系統(tǒng)造成了較大的影響。我習(xí)慣連私有的函數(shù)也一起加入測(cè)試,以下是調(diào)用私有函數(shù)的一個(gè)輔助方法:

          public static object (Type type, string , object , object[] @params)

          const flags = . | . | .Static;

          var = type.(, flags);

          var result = .Invoke(, @params);

          return result;

          提供完善的日志信息

          在日常的開(kāi)發(fā)中,我一直跟我的同事強(qiáng)調(diào)日志的重要性。相信有一定開(kāi)發(fā)經(jīng)驗(yàn)的都知道在系統(tǒng)中寫(xiě)日志,但是,怎么把日志寫(xiě)好,很多人都把握不了。在這里我提幾點(diǎn)建議:

          之前我們的系統(tǒng)是自己實(shí)現(xiàn)的日志組件,我用C#重寫(xiě)時(shí),引入了NLog日志組件,我覺(jué)得這個(gè)日志組件非常好用。另外,我還專門(mén)提供了一個(gè)UI界面的調(diào)試窗,以便實(shí)施工程師在現(xiàn)場(chǎng)調(diào)試的時(shí)候能夠快速定位問(wèn)題。

          在實(shí)際運(yùn)行的過(guò)程中,因?yàn)橛辛己玫娜罩拘畔ⅲ液芸炷軌蚺挪楹芏嗟膯?wèn)題,而大部分的問(wèn)題都是因?yàn)榕渲脤?dǎo)致的。我一致跟研發(fā)的同事強(qiáng)調(diào),盡可能的不要相信現(xiàn)場(chǎng)工程師給你的判斷,應(yīng)該要現(xiàn)場(chǎng)工程師提供證據(jù)給你,而要提供什么樣的證據(jù),作為一個(gè)研發(fā),你才是最清楚的。好的日志系統(tǒng)應(yīng)該能夠根據(jù)日志信息精確的定位到問(wèn)題,在離線的情況下能夠最大程度的反應(yīng)當(dāng)前系統(tǒng)的配置、運(yùn)行狀態(tài)、以及錯(cuò)誤信息。

          優(yōu)化的結(jié)果

          最終用C#重寫(xiě)的客戶端在各方面變現(xiàn)都非常的好,系統(tǒng)非常穩(wěn)定,整個(gè)系統(tǒng)進(jìn)入在2s左右,頁(yè)面切換在1s左右,最重要的是,客戶端跟系統(tǒng)的大小沒(méi)有關(guān)系,適應(yīng)大小的數(shù)據(jù)中心。我們看看新老系統(tǒng)在加載過(guò)程中的一個(gè)對(duì)比:

          無(wú)法加載程序集_將程序集添加到緩存失敗_將程序集添加到緩存失敗 嘗試安裝沒(méi)有強(qiáng)名稱的程序集

          很明顯,通過(guò)上述手法進(jìn)行一些優(yōu)化之后,我們的系統(tǒng)在各個(gè)步驟都有了提升,而且通過(guò)異步、緩存、欺騙等方式讓一些步驟可以同步進(jìn)行,大大加快了系統(tǒng)的加載和相應(yīng)。

          總結(jié)

          我希望通過(guò)這篇文章,把客戶端優(yōu)化的一些方法分享出來(lái),供大家參考。這其中沒(méi)有什么高深的知識(shí),也沒(méi)有說(shuō)要你必須采用怎樣的編程語(yǔ)言,僅僅是通過(guò)一些簡(jiǎn)單的手法,并綜合應(yīng)用,就能把一個(gè)系統(tǒng)的響應(yīng)速度從4分鐘提升到只需兩秒。當(dāng)然,我們還有其他很多的方法,比如分布式……無(wú)論是什么樣的技巧,我覺(jué)得有一些基本的原則是要遵循的:

          回顧一下這篇文章講的內(nèi)容:

          程序穩(wěn)定性

          如何升級(jí)手機(jī)系統(tǒng)版本

          一、進(jìn)入設(shè)置 > 系統(tǒng)和更新,點(diǎn)擊軟件更新。

          二、當(dāng)系統(tǒng)檢測(cè)到新版本時(shí),您可以手動(dòng)下載升級(jí)包更新版本,或通過(guò)夜間升級(jí)功能更新版本:

          1、手動(dòng)下載升級(jí)包:點(diǎn)擊新版本 > 下載并安裝 。下載升級(jí)包會(huì)消耗一定的流量,建議您在 WLAN 環(huán)境下進(jìn)行操作。

          升級(jí)完成后,手機(jī)會(huì)自動(dòng)重啟。

          如何更新系統(tǒng)最新版本

          如果您使用的是華為手機(jī),當(dāng)您的手機(jī)有新的軟件版本發(fā)布時(shí),手機(jī)會(huì)提示您下載并安裝更新。

          提示:

          1、在線升級(jí)前,請(qǐng)確認(rèn)手機(jī)未安裝過(guò)非官方版本,否則存在升級(jí)失敗的風(fēng)險(xiǎn),且可能引入未知問(wèn)題。

          如何進(jìn)入手機(jī)安裝系統(tǒng)_手機(jī)安裝操作系統(tǒng)_進(jìn)入安裝手機(jī)系統(tǒng)怎么退出

          2、請(qǐng)?jiān)谏?jí)前備份個(gè)人信息(QQ、微信等第三方應(yīng)用需單獨(dú)備份)。

          3、升級(jí)后,部分第三方應(yīng)用程序可能對(duì)新系統(tǒng)不兼容而導(dǎo)致不可用。這是因?yàn)椴糠值谌綉?yīng)用程序?qū)π孪到y(tǒng)響應(yīng)較慢,請(qǐng)耐心等待第三方應(yīng)用程序的新版本。

          4、升級(jí)過(guò)程中,請(qǐng)勿進(jìn)行手動(dòng)關(guān)機(jī)或重啟手機(jī)、插拔存儲(chǔ)卡(若支持)等操作。

          一、進(jìn)入設(shè)置 > 系統(tǒng)和更新,點(diǎn)擊軟件更新。

          二、當(dāng)系統(tǒng)檢測(cè)到新版本時(shí),您可以手動(dòng)下載升級(jí)包更新版本,或通過(guò)夜間升級(jí)功能更新版本:

          1、手動(dòng)下載升級(jí)包:點(diǎn)擊新版本 > 下載并安裝 。下載升級(jí)包會(huì)消耗一定的流量,建議您在 WLAN 環(huán)境下進(jìn)行操作。

          升級(jí)完成后,手機(jī)會(huì)自動(dòng)重啟。

          如何進(jìn)入手機(jī)安裝系統(tǒng)_手機(jī)安裝操作系統(tǒng)_進(jìn)入安裝手機(jī)系統(tǒng)怎么退出

          2、夜間自動(dòng)升級(jí):點(diǎn)擊設(shè)置,同時(shí)開(kāi)啟WLAN 下自動(dòng)下載和夜間安裝開(kāi)關(guān)。

          手機(jī)將在凌晨 2:00 至 4:00 時(shí)自動(dòng)安裝升級(jí)包,并重啟手機(jī)。

          在此時(shí)間段內(nèi),手機(jī)需處于開(kāi)機(jī)鎖屏狀態(tài),且未設(shè)置 2:00 至 4:00 之間的鬧鐘。升級(jí)電量需大于 35%,如果電量不足,請(qǐng)?zhí)崆安迦氤潆娖鳌?/p>

          如需關(guān)閉系統(tǒng)自動(dòng)更新,請(qǐng)?jiān)谲浖陆缑纥c(diǎn)擊設(shè)置,關(guān)閉 WLAN 下自動(dòng)下載開(kāi)關(guān)。

          安卓版本過(guò)低怎么升級(jí)

          安卓系統(tǒng)太低升級(jí)方法如下:

          1、每一部手機(jī)都有自帶的設(shè)置功能鍵,但是每部手機(jī)的設(shè)置系統(tǒng)都不一樣,根據(jù)自己的手機(jī)不同尋找相應(yīng)更新。


          主站蜘蛛池模板: 加勒比无码一区二区三区| 国产一区二区三精品久久久无广告| 精品91一区二区三区| 在线视频一区二区三区三区不卡| 久久久精品人妻一区二区三区蜜桃 | 最新中文字幕一区二区乱码| 奇米精品一区二区三区在线观看| 亚洲一区精品伊人久久伊人| 国产伦理一区二区| 国产精品免费一区二区三区| 精品一区二区三区AV天堂| 天堂成人一区二区三区| 亚洲AV无码一区二区三区久久精品 | 精品乱码一区二区三区在线| 国产SUV精品一区二区四| 亚洲精品日韩一区二区小说| 欧美人妻一区黄a片| 九九无码人妻一区二区三区| 日本无码一区二区三区白峰美| 中文字幕乱码人妻一区二区三区 | 国产亚洲一区二区手机在线观看 | 成人免费av一区二区三区| 无码精品蜜桃一区二区三区WW| 国产MD视频一区二区三区| 国产福利电影一区二区三区久久久久成人精品综合 | 精品国产一区二区三区四区 | 国精产品一区二区三区糖心| 综合无码一区二区三区| 国产av天堂一区二区三区| 亚洲欧洲一区二区| 亚洲熟女综合一区二区三区| 韩国福利视频一区二区| 国产伦精品一区二区三区精品| 日本一区二区三区在线视频观看免费| 国产精品综合一区二区三区| 午夜福利国产一区二区| 久久亚洲综合色一区二区三区| 亚洲美女视频一区| 国产精品一区二区综合| 内射女校花一区二区三区| 国产乱人伦精品一区二区|