www涩-www黄网站-www黄色-www黄色com-国产免费拍拍视频在线观看网站-国产免费怕怕免费视频观看

java學(xué)習(xí)-如何用Java進(jìn)行高性能網(wǎng)站開(kāi)發(fā)

2018-05-03 09:41:38 智能互動(dòng)  點(diǎn)擊量: 評(píng)論 (0)
如何用Java進(jìn)行高性能網(wǎng)站開(kāi)發(fā),本文給大家梳理了一下

1、生成對(duì)象時(shí),合理分配空間和大小:

Java中的很多類都有它的默認(rèn)的空間分配大小,對(duì)于一些有大小的對(duì)象的初始化,應(yīng)該預(yù)計(jì)對(duì)象的大小,然后使用進(jìn)行初始化。

例如:我們?cè)谑褂肰ector,當(dāng)聲明Vector vect=new Vector()時(shí),系統(tǒng)調(diào)用:

public Vector() {// 缺省構(gòu)造函數(shù)

this(10); // 容量是 10;

}

缺省分配10個(gè)對(duì)象大小容量。當(dāng)執(zhí)行add方法時(shí),可以看到具體實(shí)現(xiàn)為:..

public synchronized boolean add(Object o) {

modCount++;

ensureCapacityHelper(elementCount+1);

elementData[elementCount++] =o;

return true;

}

private void ensureCapacityHelper(int minCapacity) {

int oldCapacity = elementData.length;

if (minCapacity > oldCapacity) {

Object oldData[] = elementData;

int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) :

(oldCapacity * 2);

if (newCapacity < minCapacity) {

newCapacity = minCapacity;

}

elementData = new Object[newCapacity];

System.arraycopy(oldData, 0, elementData, 0, elementCount);

}

}

我們可以看到,當(dāng)Vector大小超過(guò)原來(lái)的大小時(shí),一些代碼的目的就是為了做容量的擴(kuò)充,在預(yù)先知道該Vector大小的話,可以指定其大小,避免容量擴(kuò)充的開(kāi)銷。

如果想學(xué)習(xí)Java可以來(lái)這個(gè)群,首先是一二六,中間是五三四,最后是五一九,里面有大量的學(xué)習(xí)資料可以下載。

2、優(yōu)化循環(huán)體:

循環(huán)是比較重復(fù)運(yùn)行的地方,如果循環(huán)次數(shù)很大,循環(huán)體內(nèi)不好的代碼對(duì)效率的影響就會(huì)被放大而變的突出。讓我們看看下面的代碼片:..

Vector vect = new Vector(1000);

...

for( inti=0; i<vect.size(); i++){

...

}

for循環(huán)部分改寫成:

int size = vect.size();

for( int i=0; i>size; i++){

...

}

如果size=1000,就可以減少1000次size()的系統(tǒng)調(diào)用開(kāi)銷,避免了循環(huán)體重復(fù)調(diào)用。

再看如下的代碼片:..

for (int i = 0;i <100000;i++)

if (i%10 == 9) {

... // 每十次執(zhí)行一次

}

改寫成也可以提高效率:..

for(inti =0,j =10; i<100000; i++,j--){

if(j == 0){

... // 每十次執(zhí)行一次

j = 10;

}

}

所以,當(dāng)有較大的循環(huán)時(shí),應(yīng)該檢查循環(huán)內(nèi)是否有效率不高的地方,尋找更優(yōu)的方案加以改進(jìn)。

3、少用new初始化一個(gè)實(shí)例:

盡量少用new來(lái)初始化一個(gè)類的實(shí)例,當(dāng)一個(gè)對(duì)象是用new進(jìn)行初始化時(shí),其構(gòu)造函數(shù)鏈的所有構(gòu)造函數(shù)都被調(diào)用到,所以new操作符是很消耗系統(tǒng)資源的,new一個(gè)對(duì)象耗時(shí)往往是局部變量賦值耗時(shí)的上千倍。同時(shí),當(dāng)生成對(duì)象后,系統(tǒng)還要花時(shí)間進(jìn)行垃圾回收和處理。

當(dāng)new創(chuàng)建對(duì)象不可避免時(shí),注意避免多次的使用new初始化一個(gè)對(duì)象。

盡量在使用時(shí)再創(chuàng)建該對(duì)象。如:

NewObject object = new NewObject();

int value;

if(i>0 )

{

value =object.getValue();

}

上面一段代碼可以修改為:

int value;

if(i>0 )

{

NewObject object = new NewObject();

Value =object.getValue();

}

另外,應(yīng)該盡量重復(fù)使用一個(gè)對(duì)象,而不是聲明新的同類對(duì)象。一個(gè)重用對(duì)象的方法是改變對(duì)象的值,如可以通過(guò)setValue之類的方法改變對(duì)象的變量達(dá)到重用的目的。

4、選擇合適的方法調(diào)用:

在Java中,一切都是對(duì)象,如果有方法(Method)調(diào)用,處理器先要檢查該方法是屬于哪個(gè)對(duì)象,該對(duì)象是否有效,對(duì)象屬于什么類型,然后選擇合適的方法并調(diào)用。

可以減少方法的調(diào)用,同樣一個(gè)方法:

public void CallMethod(int i ){

if( i ==0 ){

return;

}

... // 其他處理

}

如果直接調(diào)用,

int i = 0;

...

CallMethod(i);

上面的代碼,就應(yīng)該寫成:

int i = 0;

...

if( i ==0 ){

CallMethod(i);

}

不影響可讀性等情況下,可以把幾個(gè)小的方法合成一個(gè)大的方法。

另外,在方法前加上final,private關(guān)鍵字有利于編譯器的優(yōu)化。

5、異常處理技巧:

異常是Java的一種錯(cuò)誤處理機(jī)制,對(duì)程序來(lái)說(shuō)是非常有用的,但是異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象,并進(jìn)行相關(guān)的處理,造成系統(tǒng)的開(kāi)銷,所以異常應(yīng)該用在錯(cuò)誤處理的情況,不應(yīng)該用來(lái)控制程序流程,流程盡量用while,if等處理。

在不是很影響代碼健壯性的前提下,可以把幾個(gè)try/catch塊合成一個(gè)。

如果想學(xué)習(xí)Java可以來(lái)這個(gè)群,首先是一二六,中間是五三四,最后是五一九,里面有大量的學(xué)習(xí)資料可以下載。

6、盡量使用局部變量和靜態(tài)變量:

盡量使用局部變量,調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack) 中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。

盡量使用靜態(tài)變量,即加修飾符static,如果類中的變量不會(huì)隨他的實(shí)例而變化,就可以定義為靜態(tài)變量,從而使他所有的實(shí)例都共享這個(gè)變量。

7、同步處理技巧:

同步主要出現(xiàn)在多線程的情況,為多線程同時(shí)運(yùn)行時(shí)提供對(duì)象數(shù)據(jù)安全的機(jī)制,多線程是比較復(fù)雜話題,應(yīng)用多線程也是為了獲得性能的提升,應(yīng)該盡可能減少同步。

另外,如果需要同步的地方,可以減少同步的代碼段,如只同步某個(gè)方法或函數(shù),而不是整個(gè)代碼。

8、盡可能的使用Java自身提供的API:

Java的API一般都做了性能的考慮,如果完成相同的功能,優(yōu)先使用API而不是自己寫的代碼,如數(shù)組復(fù)制通常的代碼如下:

int size = 1000;

String[] strArray1 = new String[size];

String[] strArray2 = new String[size];

for(inti=0;i<size;i++){ // 賦值

strArray1 = (new String("Array: " + i));

}

for(inti=0;i<size;i++){ // 復(fù)制

strArray2=(new String((String)a));

}

上面那段代碼,如果使用Java提供的API,就可以提高性能:

int size = 1000;

String[] strArray1 = new String[size];

String[] strArray2 = new String[size];

for(inti=0;i<size;i++){ // 賦值

strArray1 = (new String("Array: " + i));

}

System.arraycopy(strArray1,0,strArray2,0,size); // 復(fù)制

同樣的一個(gè)規(guī)則是,當(dāng)有大量數(shù)據(jù)的復(fù)制時(shí),應(yīng)該使用System.arraycopy()。

9、盡量減少I/O操作:

輸入/輸出(I/O)包括很多方面,我們知道,進(jìn)行I/O操作是很消耗系統(tǒng)資源的。程序中應(yīng)該盡量少用I/O操作。使用時(shí)可以注意: . 合理控制輸出函數(shù)System.out.println()對(duì)于大多時(shí)候是有用的,特別是系統(tǒng)調(diào)試的時(shí)候,但也會(huì)產(chǎn)生大量的信息出現(xiàn)在控制臺(tái)和日志上,同時(shí)輸出時(shí),有序列化和同步的過(guò)程,造成了開(kāi)銷。

特別是在發(fā)行版中,要合理的控制輸出,可以在項(xiàng)目開(kāi)發(fā)時(shí),設(shè)計(jì)好一個(gè)Debug的工具類,在該類中可以實(shí)現(xiàn)輸出開(kāi)關(guān),輸出的級(jí)別,根據(jù)不同的情況進(jìn)行不同的輸出的控制。

10、盡量使用緩存:

讀寫內(nèi)存要比讀寫硬盤上的文件要快很多,應(yīng)盡可能使用緩沖,以便直接從內(nèi)存中讀取數(shù)據(jù)。

盡可能使用帶有Buffer的類代替沒(méi)有Buffer的類,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來(lái)進(jìn)行處理I/O操作。

同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高

11、盡量不使用同步:

Servlet是多線程的,以處理不同的請(qǐng)求,基于前面同步的分析,如果有太多的同步就失去了多線程的優(yōu)勢(shì)了。

12、不用保存太多的信息在HttpSession中

很多時(shí)候,存儲(chǔ)一些對(duì)象在HttpSession中是有必要的,可以加快系統(tǒng)的開(kāi)發(fā),如網(wǎng)上商店系統(tǒng)會(huì)把購(gòu)物車信息保存在該用戶的Session中,但當(dāng)存儲(chǔ)大量的信息或是大的對(duì)象在會(huì)話中時(shí),是有害的,特別是當(dāng)系統(tǒng)中用戶的訪問(wèn)量很大,對(duì)內(nèi)存的需求就會(huì)很高。

具體開(kāi)發(fā)時(shí),在這兩者之間應(yīng)作好權(quán)衡。

13、清除SESSION

通常情況,當(dāng)達(dá)到設(shè)定的超時(shí)時(shí)間時(shí),同時(shí)有些Session沒(méi)有了活動(dòng),服務(wù)器會(huì)釋放這些沒(méi)有活動(dòng)的Session,.. 不過(guò)這種情況下,特別是多用戶并訪時(shí),系統(tǒng)內(nèi)存要維護(hù)多個(gè)的無(wú)效Session。

當(dāng)用戶退出時(shí),應(yīng)該手動(dòng)釋放,回收資源,實(shí)現(xiàn)如下:..

HttpSession theSession = request.getSession();

// 獲取當(dāng)前Session

if(theSession != null){

theSession.invalidate(); // 使該Session失效

}

14、緩存Home接口

EJB庫(kù)使用Enterprise Bean 的客戶端通過(guò)它的Home接口創(chuàng)建它的實(shí)例。客戶端能通過(guò)JNDI訪問(wèn)它。服務(wù)器通過(guò)Lookup方法來(lái)獲取。

JNDI是個(gè)遠(yuǎn)程對(duì)象,通過(guò)RMI方式調(diào)用,對(duì)它的訪問(wèn)往往是比較費(fèi)時(shí)的。所以,在設(shè)計(jì)時(shí)可以設(shè)計(jì)一個(gè)類專門用來(lái)緩存Home接口,在系統(tǒng)初始化時(shí)就獲得需要的Home接口并緩存,以后的引用只要引用緩存即可。

15、使用快速度的Jdbc驅(qū)動(dòng)

JDBC API包括兩種實(shí)現(xiàn)接口形式,一種是純Java實(shí)現(xiàn)的驅(qū)動(dòng),一種利用ODBC驅(qū)動(dòng)和數(shù)據(jù)庫(kù)客戶端實(shí)現(xiàn),具體有四種驅(qū)動(dòng)模式:

第一類:JDBC-ODBC橋,再加上ODBC驅(qū)動(dòng)程序。

第一類JDBC驅(qū)動(dòng)程序是JDBC-ODBC橋再加上一個(gè)ODBC驅(qū)動(dòng)程序。建議第一類驅(qū)動(dòng)程序只用于原型開(kāi)發(fā),而不要用于正式的運(yùn)行環(huán)境。橋接驅(qū)動(dòng)程序由Sun提供,它的目標(biāo)是支持傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)。Sun為該軟件提供關(guān)鍵問(wèn)題的補(bǔ)丁,但不為該軟件的最終用戶提供支持。一般地,橋接驅(qū)動(dòng)程序用于已經(jīng)在ODBC技術(shù)上投資的情形,例如已經(jīng)投資了Windows應(yīng)用服務(wù)器。

盡管Sun提供了JDBC-ODBC橋接驅(qū)動(dòng)程序,但由于ODBC會(huì)在客戶端裝載二進(jìn)制代碼和數(shù)據(jù)庫(kù)客戶端代碼,這種技術(shù)不適用于高事務(wù)性的環(huán)境。另外,第一類JDBC驅(qū)動(dòng)程序不支持完整的Java命令集,而是局限于ODBC驅(qū)動(dòng)程序的功能,這種驅(qū)動(dòng)方式也叫胖客

大云網(wǎng)官方微信售電那點(diǎn)事兒

責(zé)任編輯:售電衡衡

免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本站無(wú)關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
我要收藏
個(gè)贊
?
主站蜘蛛池模板: 日本不卡免费高清一级视频 | 亚洲精品三区 | 久久精品视频免费观看 | 免费久久| 国产韩国精品一区二区三区久久 | 久草网在线 | 久久黄色片| 中文字幕综合 | a级男女性高爱潮高清试 | 欧美一区二区在线观看免费网站 | 欧美三级在线看 | 99视频久久 | 美女作爱网站 | 欧美综合图片一区二区三区 | 99久久国产综合精品网成人影院 | 成人a毛片手机免费播放 | 中文字幕在线成人免费看 | 91精品国产综合久久欧美 | 亚洲精品视频久久 | 悟空影视大全免费高清 | 亚洲男同可播放videos | 99国内精品 | 国产精品偷伦费观看 | 日韩精品亚洲一级在线观看 | 久久综久久美利坚合众国 | 日本免费高清一区 | a毛片在线看片免费 | 精品视频在线观看一区二区三区 | 国产亚洲精品aaa大片 | 国产a久久精品一区二区三区 | 精品国产区一区二区三区在线观看 | 国产粉嫩高中生无套第一次 | aaa级毛片 | 久久91亚洲精品久久91综合 | 精品一区二区三区在线观看l | 国产高清天干天天视频 | 99精品免费观看 | 免费成年人视频网站 | 美女黄色在线看 | 亚洲手机视频 | 美女视频黄的免费视频网页 |