杨幂好大好硬好深好爽想要,亚洲av无码欧洲av无码网站,亚洲av无码男人的天堂在线,亚洲人成中文字幕在线观看,亚洲国产精品综合久久2007

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

分類(lèi): 瀏覽次數(shù):44136 2018-11-06 00:00:00
滿(mǎn)意回答
2018-11-06 00:00:00

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

QQ截圖20180913101329

1.多線(xiàn)程

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

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

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

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


標(biāo)簽:
青島企業(yè)郵箱哪家做?多少錢(qián)的相關(guān)問(wèn)題
知識(shí)問(wèn)答 更多+

Copyright All Rights GreatGoal Design co.,ltd. 魯ICP備16002128號(hào)-3