日本一区二区三区在线看|亚洲视频一二最新在线无码|丝袜啪啪高潮喷水秀|久久精品国产九九|影音先锋萱萱影视|福利二区免费播放|五月丁香婷婷丁香视频|丁香五月天激情在线vr|精品国产视频一二三|殴州亚州av另类..

青島網(wǎng)站建設(shè)_小程序開發(fā)_品牌設(shè)計_圭谷設(shè)計

網(wǎng)站建設(shè)中的代碼優(yōu)化

分類:網(wǎng)站建設(shè) 瀏覽次數(shù):48936 2018-11-06
滿意回答
2018-11-06

代碼優(yōu)化:山東網(wǎng)站建設(shè)的業(yè)務(wù)邏輯實現(xiàn)代碼主要部署在應(yīng)用服務(wù)器上,需要處理復(fù)雜的并發(fā)事務(wù).合理優(yōu)化業(yè)務(wù)代碼,可以很好地改善網(wǎng)站性能.不同編程語言的代碼優(yōu)化手段有很多,這里我們概要地關(guān)注比較重要的幾個方面.1234

1.多線程

多用戶并發(fā)訪問是網(wǎng)站的基本需求,大型網(wǎng)站的并發(fā)用戶數(shù)會達(dá)到數(shù)萬,單臺服務(wù)器的并發(fā)用戶也會達(dá)到數(shù)百。CGI編程時代,每個用戶請求都會創(chuàng)建一個獨立的系統(tǒng)進(jìn)程去處理。由于線程比進(jìn)程更輕量,更少占有系統(tǒng)資源,切換代價更小,所以目前主要的Web應(yīng)用服務(wù)器都采用多線程的方式響應(yīng)并發(fā)用戶請求,因此網(wǎng)站開發(fā)天然就是多線程編程。從資源利用的角度看,使用多線程的原因主要有兩個:IO阻塞與多CPU。當(dāng)前線程進(jìn)行IO處理的時候,會被阻塞釋放CPU以等待IO操作完成,由于IO操作(不管是磁盤IO還是網(wǎng)絡(luò)IO)通常都需要較長的時間,這時CPU可以調(diào)度其他的線程進(jìn)行處理。前面我們提到,理想的系統(tǒng)Load是既沒有進(jìn)程(線程)等待也沒有CPU空閑,利用多線程IO阻塞與執(zhí)行交替進(jìn)行,可大限度地利用CPU資源。使用多線程的另一個原因是服務(wù)器有多個CPU,在這個連手機都有四核CPU的時代,除了低配置的虛擬機,一般數(shù)據(jù)中心的服務(wù)器至少16核CPU,要想大限度地使用這些CPU,必須啟動多線程。網(wǎng)站的應(yīng)用程序一般都被Web服務(wù)器容器管理,用戶請求的多線程也通常被Web服務(wù)器容器管理,但不管是Web容器管理的線程,還是應(yīng)用程序自己創(chuàng)建的線程,一臺服務(wù)器上啟動多少線程合適呢?假設(shè)服務(wù)器上執(zhí)行的都是相同類型任務(wù),針對該類任務(wù)啟動的線程數(shù)有個簡化的估算公式可供參考:啟動線程數(shù)=[任務(wù)執(zhí)行時間/(任務(wù)執(zhí)行時間(IO等待時間)]]CPU內(nèi)核數(shù)佳啟動線程數(shù)和CPU內(nèi)核數(shù)量成正比,和IO阻塞時間成反比。如果任務(wù)都是CPU計算型任務(wù),那么線程數(shù)多不超過CPU內(nèi)核數(shù),因為啟動再多線程,CPU也來不及調(diào)度;相反如果是任務(wù)需要等待磁盤操作,網(wǎng)絡(luò)響應(yīng),那么多啟動線程有助于提高任務(wù)并發(fā)度,提高系統(tǒng)吞吐能力,改善系統(tǒng)性能。多線程編程一個需要注意的問題是線程安全問題,即多線程并發(fā)對某個資源進(jìn)行修改,導(dǎo)致數(shù)據(jù)混亂。這也是缺乏經(jīng)驗的網(wǎng)站工程師容易犯錯的地方,而線程安全Bug又難以測試和重現(xiàn),網(wǎng)站故障中,許多所謂偶然發(fā)生的“靈異事件”都和多線程并發(fā)問題有關(guān)。對網(wǎng)站而言,不管有沒有進(jìn)行多線程編程,工程師寫的每一行代碼都會被多線程執(zhí)行,因為用戶請求是并發(fā)提交的,也就是說,所有的資源——對象、內(nèi)存、文件、數(shù)據(jù)庫,乃至另一個線程都可能被多線程并發(fā)訪問。編程上,解決線程安全的主要手段有如下幾點。將對象設(shè)計為無狀態(tài)對象:所謂無狀態(tài)對象是指對象本身不存儲狀態(tài)信息(對象無成員變量,或者成員變量也是無狀態(tài)對象),這樣多線程并發(fā)訪問的時候就不會出現(xiàn)狀態(tài)不一致,Java Web開發(fā)中常用的Servlet對象就設(shè)計為無狀態(tài)對象,可以被應(yīng)用服務(wù)器多線程并發(fā)調(diào)用處理用戶請求。而Web開發(fā)中常用的貧血模型對象都是些無狀態(tài)對象。不過從面向?qū)ο笤O(shè)計的角度看,無狀態(tài)對象是一種不良設(shè)計。使用局部對象:即在方法內(nèi)部創(chuàng)建對象,這些對象會被每個進(jìn)入該方法的線程創(chuàng)建,除非程序有意識地將這些對象傳遞給其他線程,否則不會出現(xiàn)對象被多線程并發(fā)訪問的情形。并發(fā)訪問資源時使用鎖:即多線程訪問資源的時候,通過鎖的方式使多線程并發(fā)操作轉(zhuǎn)化為順序操作,從而避免資源被并發(fā)修改。隨著操作系統(tǒng)和編程語言的進(jìn)步,出現(xiàn)各種輕量級鎖,使得運行期線程獲取鎖和釋放鎖的代價都變得更小,但是鎖導(dǎo)致線程同步順序執(zhí)行,可能會對系統(tǒng)性能產(chǎn)生嚴(yán)重影響。

2.資源復(fù)用系統(tǒng)運行時,要盡量減少那些開銷很大的系統(tǒng)資源的創(chuàng)建和銷毀,比如數(shù)據(jù)庫連接、網(wǎng)絡(luò)通信連接、線程、復(fù)雜對象等。從編程角度,資源復(fù)用主要有兩種模式:單例(Singleton)和對象池(Object Pool)。單例雖然是GoF經(jīng)典設(shè)計模式中較多被詬病的一個模式,但由于目前Web開發(fā)中主要使用貧血模式,從Service到Dao都是些無狀態(tài)對象,無需重復(fù)創(chuàng)建,使用單例模式也就自然而然了。事實上,Java開發(fā)常用的對象容器Spring默認(rèn)構(gòu)造的對象都是單例(需要注意的是Spring的單例是Spring容器管理的單例,而不是用單例模式構(gòu)造的單例)。對象池模式通過復(fù)用對象實例,減少對象創(chuàng)建和資源消耗。對于數(shù)據(jù)庫連接對象,每次創(chuàng)建連接,數(shù)據(jù)庫服務(wù)端都需要創(chuàng)建專門的資源以應(yīng)對,因此頻繁創(chuàng)建關(guān)閉數(shù)據(jù)庫連接,對數(shù)據(jù)庫服務(wù)器而言是災(zāi)難性的,同時頻繁創(chuàng)建關(guān)閉連接也需要花費較長的時間。因此在實踐中,應(yīng)用程序的數(shù)據(jù)庫連接基本都使用連接池(Connection Pool)的方式。數(shù)據(jù)庫連接對象創(chuàng)建好以后,將連接對象放入對象池容器中,應(yīng)用程序要連接的時候,就從對象池中獲取一個空閑的連接使用,使用完畢再將該對象歸還到對象池中即可,不需要創(chuàng)建新的連接。前面說過,對于每個Web請求(HTTP Request),Web應(yīng)用服務(wù)器都需要創(chuàng)建網(wǎng)站一個獨立的線程去處理,這方面,應(yīng)用服務(wù)器也采用線程池(Thread Pool)的方式。這些所謂的連接池、線程池,本質(zhì)上都是對象池,即連接、線程都是對象,池管理方式也基本相同。

3.?dāng)?shù)據(jù)結(jié)構(gòu)早期關(guān)于程序的一個定義是,程序就是數(shù)據(jù)結(jié)構(gòu)早算法,數(shù)據(jù)結(jié)構(gòu)對于編程的重要性不言而喻。在不同場景中合理使用恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu),靈活組合各種數(shù)據(jù)結(jié)構(gòu)改善數(shù)據(jù)讀寫和計算特性可極大優(yōu)化程序的性能。前面緩存部分已經(jīng)描述過Hash表的基本原理,Hash表的讀寫性能在很大程度上依賴HashCode的隨機性,即HashCode越隨機散列,Hash表的沖突就越少,讀寫性能也就越高,目前比較好的字符串Hash散列算法有Time33算法,即對字符串逐字符迭代乘以33,求得Hash值,算法原型為:hash(i)= hash(i 1)* 33 + str[i]Time33雖然可以較好地解決沖突,但是有可能相似字符串的HashCode也比較接近,如字符串“AA”的HashCode是2210,字符串“AB”的HashCode是2211。這在某些應(yīng)用場景是不能接受的,這種情況下,一個可行的方案是對字符串取信息指紋,再對信息指紋求HashCode,由于字符串微小的變化就可以引起信息指紋的巨大不同,因此可以獲得較好的隨機散列.通過MD5計算HashCode4.垃圾回收如果Web應(yīng)用運行在JVM等具有垃圾回收功能的環(huán)境中,那么垃圾回收可能會對系統(tǒng)的性能特性產(chǎn)生巨大影響。理解垃圾回收機制有助于程序優(yōu)化和參數(shù)調(diào)優(yōu),以及編寫內(nèi)存安全的代碼。以JVM為例,其內(nèi)存主要可劃分為堆(heap)和堆棧(stack)。堆棧用于存儲線程上下文信息,如方法參數(shù)、局部變量等。

堆則是存儲對象的內(nèi)存空間,對象的創(chuàng)建和釋放、垃圾回收就在這里進(jìn)行。通過對對象生命周期的觀察,發(fā)現(xiàn)大部分對象的生命周期都極其短暫,這部分對象產(chǎn)生的垃圾應(yīng)該被更快地收集,以釋放內(nèi)存,這就是JVM分代垃圾回收.JVM分代垃圾回收機制在JVM分代垃圾回收機制中,將應(yīng)用程序可用的堆空間分為年輕代(Young Generation)和年老代(Old Generation),又將年輕代分為Eden區(qū)(Eden Space)、From區(qū)和To區(qū),新建對象總是在Eden區(qū)中被創(chuàng)建,當(dāng)Eden區(qū)空間已滿,就觸發(fā)一次Young GC(Garbage Collection,垃圾回收),將還被使用的對象復(fù)制到From區(qū),這樣整個Eden區(qū)都是未被使用的空間,可供繼續(xù)創(chuàng)建對象,當(dāng)Eden區(qū)再次用完,再觸發(fā)一次Young GC,將Eden區(qū)和From區(qū)還在被使用的對象復(fù)制到To區(qū),下一次Young GC則是將Eden區(qū)和To區(qū)還被使用的對象復(fù)制到From區(qū)。因此,經(jīng)過多次Young GC,某些對象會在From區(qū)和To區(qū)多次復(fù)制

網(wǎng)站名片  _副本


知識問答 更多+

Copyright All Rights GreatGoal Design co.,ltd. 魯ICP備16002128號-3      技術(shù)支持: @圭谷設(shè)計