久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

計算機系統性能優化總結

時間:2019-05-15 12:55:22下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《計算機系統性能優化總結》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《計算機系統性能優化總結》。

第一篇:計算機系統性能優化總結

計算機系統性能優化總結

現今,計算機技術在社會各行各業都得到了廣泛的應用。計算機給我們的學習、生活和工作都帶來了極大的便利。但隨著我們對計算機整體性能要求的提高,計算機系統性能的優化就顯得尤為重要。

一、計算機系統運行不佳的原因分析

計算機系統運行性能不佳的原因有很多。如,系統平臺結構不好、系統配置不好或參數設置不對;應用系統數據結構設計不合理,加大了系統的輸入和輸出需求;應用系統算法或邏輯處理有問題,使計算機系統達不到最佳的運行狀態。

二、計算機系統性能優化措施

1.合理地配置各種軟件,使計算機系統發揮最好的功能。計算機系統由硬件系統和軟件系統組成,二者之間相互依賴,這就要求我們在使用計算機軟件的過程中,使用一些速度較快、版本較高和功能較完善的軟件,并仔細閱讀各種軟件的使用說明,避免在應用過程中發生沖突。作為編程人員,在編寫應用程序的過程中,要充分考慮應用系統數據結構設計的合理性,以便使計算機系統達到最佳的運行狀態。

2.調整輸入和輸出系統。在計算機系統的應用過程中,我們進行的大多數操作就是輸入和輸出。因此,輸入和輸出操作是影響計算機性能的一個重要因素。隨著科技的日益發

展,磁盤的平均尋址時間日益縮短,但與中央處理器的運算相比,仍然緩慢很多。在觀察一些系統運行時,經常出現中央處理器處在空閑狀態而應用程序卻遲遲不能完成的情況。究其原因,就是因為磁盤的輸入和輸出的速度太慢,數據沒有讀(寫)入內存中。因此,在實際的應用過程中,我們可以考慮把數據文件存放在不同的磁盤上,讓多個磁盤并行工作,從而解決輸入和輸出的瓶頸問題。如果輸入和輸出總數明顯不合理,就要考慮查找引起輸入和輸出數量增大的原因,從而優化應用程序,減少輸入和輸出的次數,提高系統的性能。

3.安排相同性質的處理過程同時運行,以確保中央處理器和輸入和輸出的絕對通暢。一臺計算機能夠同時運行多個應用程序,從使用系統資源的角度來看,這些應用程序可以分為面向輸入和輸出與面向運算2種類型。

系統中如果有2個或多個面向輸入和輸出的應用在同時運行,就會造成中央處理器閑置而大量磁盤輸入和輸出擁塞和等待的情況,使得各個應用程序的性能變差。系統中如果有2個或多個面向運算的應用程序同時運行時,就會造成磁盤空轉的情況。因此,要盡量避免讓多個面向輸入和輸出或多個面向運算的應用程序同時運行。最好的安排就是讓面向輸入和輸出與面向運算的應用程序合理搭配,使每個應用都能獲得足夠的系統服務而又互不影響。

4.合理地使用中央處理器。一般來說,在一個計算機系統中,中央處理器的速度要遠遠高于輸入和輸出的速度,因而輸入和輸出速度往往是影響系統性能的主要因素。但必須指出的是,這種規則只適用于普通的情況。如果不知道中央處理器能力也有一定限制,盲目地、不合理地使用中央處理器,中央處理器也會成為影響系統性能的主要因素。

通過對計算機系統的性能進行優化,排除了系統中的各種不合理因素,縮短了系統的響應時間,使計算機系統能更好地發揮作用,從而為我們提供更好的服務。

第二篇:網站前端性能優化總結

一、服務器側優化

1.添加 Expires 或 Cache-Control 信息頭

某些經常使用到、并且不會經常做改動的圖片(banner、logo等等)、靜態文件(登錄首頁、說明文檔等)可以設置較長的有效期(expiration date),這些HTTP頭向客戶端表明了文檔的有效性和持久性。如果有緩存,文檔就可以從緩存(除已經過期)而不是從服務器讀取。接著,客戶端考察緩存中的副本,看看是否過期或者失效,以決定是否必須從服務器獲得更新。

各個容器都有針對的方案,,以 Apache 為例:

ExpiresActive On ExpiresByType image/gif “access plus 1 weeks”

表示gif文件緩存一周,配置可以根據具體的業務進行調整,具體配置可以參考:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_expires.html

2.壓縮內容

對于絕大多數站點,這都是必要的一步,能有效減輕網絡流量壓力。

DeflateCompressionLevel 9 AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php AddOutputFilter DEFLATE html htm xml php css js

表示zlib在壓縮時可以最大程度的使用內存,壓縮html、文本、xml和php這幾種類型的文件,指定擴展名為html、htm、xml、php、css和js的文件啟用壓縮。

具體配置可以參考:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_deflate.html

3.設置 Etags

在使用etags之前,有必要復習一下 RFC2068 中規定的返回值 200 和 304 的含義:

200--OK 304--Not Modified

客戶端在請求一份文件的時候,服務端會檢查客戶端是否存在該文件,如果客戶端不存在該文件,則下載該文件并返回200;如果客戶端存在該文件并且該文件在規定期限內沒有被修改(Inode,MTime和Size),則服務端只返回一個304,并不返回資源內容,客戶端將會使用之前的緩存文件。而etags就是判斷該文件是否被修改的記號,與服務器端的資源一一關聯,所以etags對于CGI類型的頁面緩存尤其有用。

下圖是優化前的首頁:(注意,此時沒有壓縮首頁圖片,即使使用了緩存,仍需要5s左右的時間)

化前的某頁面

需要注意的是,使用etags會增加服務器端的負載,在實際應用中需要自行平衡。

二、Cookie優化

1.減小Cookie體積

HTTP coockie可以用于權限驗證和個性化身份等多種用途。coockie內的有關信息是通過HTTP文件頭來在web服務器和瀏覽器之間進行交流的。因此保持coockie盡可能的小以減少用戶的響應時間十分重要。

使cookie體積盡量小;

在合適的子域名上設置bookie,以免影響其他子域名下的響應;

設置合理的過期時間,去掉不必要的cookie。

下面對比一下各個網站的cookie:

圖中可以看出,6K的cookie顯然是不必要的。

2.對于頁面內容使用無coockie域名

當瀏覽器在請求中同時請求一張靜態的圖片和發送coockie時,服務器對于這些coockie不會做任何地使用。因此它們只是因為某些負面因素而創建的網絡傳輸。所以你應該確定對于靜態內容的請求是無coockie的請求。創建一個子域名并用他來存放所有靜態內容。

例如,域名是

3.切分組件到多個域

主要的目的是提高頁面組件并行下載能力,但注意,也不要同時使用過多的域名,否則就會出現第一條DNS lookup過多的問題,一般情況下兩個域名就可以了。

4.杜絕 http 404 錯誤

對頁面鏈接的充分測試加上對 Web 服務器 error 日志的不斷跟蹤可以有效減少 404 錯誤,并提升用戶體驗。

后記:

這次總結給我帶來的啟發并不在于提升系統性能性能本身,提升性能只是一個很表面上的東西,網上的方法有很多,測試的方法也有很多,照著都做一遍,性能確實會有所提升,但是這種知其然而不知其所以然的性能提升是沒有意義的,這便是本文的目的所在。

第三篇:SQL語句性能優化

我也做了很長時間醫療軟件,也寫過不少sql優化,沒有詳細記錄下來,個人感覺下面轉載的更符合醫院醫療軟件實際業務,很認可大部分所寫的原則,固轉載過來,以作借鑒。軟件的根本還是在于更細更精,在于從客戶的實際使用考慮問題。

性能優化原則1:永遠避免困境

利用緩存把字典數據取到中間服務器或是客戶端替代直接sql查詢,如,門診醫生站把字典下載到客戶端,減少執行次數。

一次性取數據到客戶端,然后再逐條處理,而不是分次取數據,處理好一條數據再取下一條再處理。例:門診收費取hjcfmxk例子,原來是一張處方條明細都查詢一次,查詢后再處理,現改為一次把所有明細都取過來,然后一條條處理

盡量減少光標,看能不能用臨時表

性能優化原則2:kiss原則

對于where 條件中的左邊可以利用索引的字段Keep it simple stupid,左邊盡量避免用函數(substring,isnull,upper,lower),參加計算+,-*/

例子1:select * from ZY_BRFYMXK where substring(zxrq,1,8)='20081212‘

select * from ZY_BRFYMXK where zxrq between '2008121200' and '2008121224' 例子2:

select * from zy_detail_charge where SUBSTRING(patient_id,1,10)=

substring('000005090600',1,10)這句耗時30秒以上

select * from zy_detail_charge where patient_id like substring('000005090600',1,10)+'%' 這句耗時2秒以內

性能優化原則3:盡可能利用到索引

例:select * from ZY_BRFYMXK a(nolock),VW_LSYZK b(nolock)where a.syxh=3 and a.yzxh=b.xh and a.fylb=0

select * from ZY_BRFYMXK a(nolock),VW_LSYZK b(nolock)where a.syxh=3 and a.yzxh=b.xh and a.fylb=0 and b.syxh=3

性能優化原則4:or,避而遠之

對于索引字段盡力避免用or,普通字段可以用or,解決要么分解成多個sql,要么用業務規則避免,例:declare @rq1 ut_rq16,@syxh ut_syxh

select @rq1='20081201'

select @syxh=157

性能優化原則5:避免大批量數據取到前臺

例: select * from ZY_BRSYK cyrq between ‘20080901’ and ‘20081201‘,對于大醫院每天100多人,90天是9000條數據

性能優化原則6:事務,盡可能的短吧

所有計算、對臨時表的更新都應但放在事務外,事務中最好只有更新和插入正式表操作.因為事務中產生的鎖只有在commit tran是才會釋放。

性能優化原則7:熱表,留在最后吧

熱表是頻繁調用的表。如:sf_mzcfk,zy_brfymxk,bq_fyqqk.對于熱表盡量放在事務最后:這樣鎖的時間短。大家都堅持這樣,死鎖的可能性就小。如果都是熱表各個存儲過程更新表的順序應當一樣這樣可以避免死鎖

性能優化原則8:創建臨時表一定要避免在事務中作

如create #tempXX(…)

Select * into #tempXX from …

因為創建臨時表會鎖tempdb的系統表

例:生成#temp1放在事務內外,用sp_lock2 ‘’觀察結果

if object_id('tempdb..#temp1','U')is not null

drop table #temp1

begin tran

select * into #temp1 from ZY_BRSYK where ryrq>'20080901‘

select * from #temp1

waitfor delay '00:00:10'

commit

性能優化原則9:大的報表查詢避免與正常業務碰撞

如果沒有查詢服務器,那要在存儲過程中限制不能操作加上如:

declare @rq1 ut_rq16,@rq2 ut_rq16,@now ut_rq16

select @rq1=convert(varchar(8),getdate(),112)+'08:00:00'

select @rq1=convert(varchar(8),getdate(),112)+'11:30:00'

select @now=convert(char(8),getdate(),112)+convert(char(8),getdate(),8)

if @now>@rq1 and @now<@rq2

begin

select '上午繁忙時間段不能作此查詢'

return

end

性能優化原則10:存儲過程避免大的if…else…

這個常出項在業務相同表不同的存儲過程中,因為這樣常到if …else …原來醫技接口中很多這種存儲過程,當時把門診住院業務放在一個存儲過程中。這樣最大的問題是sql server會根據sql語句來compile存儲,這個過程會生成優化計劃,決定用那個索引。如果存儲過程用到門診表compile一下,到用到住院表是發現不對,又會compile一下,這樣不停compile.compile很號時間要1-2秒,而且一個存儲過成在compile是,所有調用這個存儲過程的進程都要在排隊等候,因為他會獨占鎖這個存儲過程

例:usp_yjjk_getwzxxm_old.sql,后改為:

usp_yjjk_getwzxxm.sql, usp_yjjk_getwzxxm_mz.sql,usp_yjjk_getwzxxm_zy.sql

性能優化原則11:進攻是最好的防守

在普通編程語句對于數據校驗總是用防守辦法先判斷,后再作相應處理。而在sql中先處理再判斷性能會好很多。

--更新藥品庫存。

If exists(select 1 from YK_YKZKC WHERE idm=100 and kcsl>50)

begin

update YK_YKZKC set kcsl=kcsl-50 where idm=100

End

Else begin

rollback tran

Select ‘F庫存不夠’

return

end

--改為

update YK_YKZKC set kcsl=kcsl-50 where idm=100 and kcsl>50

If @@rowcount<=0

Begin

Rollbakc tran

Select ‘F庫存不夠’

end

--取未執行的醫技項目,日表沒有數據就到年表中查找

if exists(select a.* from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

begin

select a.* into #temp1 from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

end

else begin

select a.* into #temp1 from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)

end

--改為

Insert into #temp1 select a.*

from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

If @@rowcount=0

Begin

Insert into #temp1 select a.*

from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)

end

性能優化原則12:trig最后的手段

Trig(觸發器)的處理的處理機制是滿足條件時就會在源語句后面加上trig中的代碼進行執行。

它有兩個致命的弊端:(1)不清楚有trig的人會對于執行結果感到迷惑。如常有在插入一張表如果主鍵是indentity的值常取用select @@identity。但如是有trig,tring中有表插入操作,這時的@@identity可能就不是想要的值。(2)trig會束縛選擇。如:有一套單據主表和明細表,當明細表的金額更新時,要同步主表的金額,當程序是一條條更新明細時用trig的作法是每當更新一條明細記錄時都算一處所有明細表的總金額,再去更新主表的金額。這樣有多少條明細就要算多少次,好的作法是不要trig,直接在sql語句中明細更新完明后,一次性算出總金額每條單據的總金額,再更新主表的金額。

對于trig如果有其他手段就一定要避免用trig.性能優化原則13:用戶說好才是真的好

1)有時sql語句性能難以優化,但用戶對于系統響應速度還是不滿意。這時可以從業務分析處理。

如:我們退費模塊錄入發票號原來是用fph like ‘XXX%’。用戶報怨慢,后來改為先用fph=‘XXX’來查,如查不到再fph like ‘XXX%’。這樣在絕大部情況下速度都非???,同時也滿足小部分情況下模糊查詢的需求。

如:我們的程序要查日表和年表。如果通過日表union表視圖去查會非常慢,性能也難以優化。程序改為普通情況下不查年表,用戶勾上年表標志時才查年表。

(2)查詢統計很多數據時間比較長,就以查詢完一部分數據后可以顯示這部分數據或是用提示,這樣用戶清楚系統在作事情也知道大概進度。這樣情緒上會好很多。

(3)查詢模塊常有一進入時也默認一個查詢,如果性能好,查詢又合用戶心意,這種設計非常好,如果性能不好,那就不是好的設計。用戶對于進入都困難的模塊是沒有好感的。

(4)有戶的耐心與查詢出的記錄成正比。用戶痛恨等待很久卻沒有查詢出記錄。

對于非常慢的查詢,如果有些子查詢非常快可以先作這樣查詢以避免查詢很久卻沒有數據出來的情況。如:按病歷號查在院病人所有費有明細,可以先查一下這個病歷是不是有對應病人。

實戰技巧1:用exists、in代替distinct

Distinct實際上是先收集再刪除這樣兩步都耗資源。

Exists,in會隱式過濾掉重復的記錄

例查自2009年以來有金額大于100的藥品的病人

select distinct a.blh,a.hzxm from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock)where a.patid=b.patid and b.syxh=c.syxh and c.zxrq>'2009' and c.zje>100--改為

select a.blh,a.hzxm from ZY_BRXXK a where exists(select 1 from ZY_BRSYK

b(nolock),ZY_BRFYMXK c(nolock)where a.patid=b.patid and b.syxh=c.syxh and

c.zxrq>'2009'and c.zje>100)

實戰技巧2:縮短union

select …from A,B,C,D,E1

where(E1的條件)

and(其他表聯接條件)

union

select …from A,B,C,D,E2

where(E2的條件)

and(其他表接接條件)

改為

select …from A,B,C,D,(select...from E1where(E1條件)

union

select …from E2where(E2條件))E where(其他條件)

當涉及ABCD表部分耗資源而E1,E2不耗資源時是這樣,如果反過來則改后的性能不一定好。查2009年4月后入院的在院病人在2905病區發生的所有費用明細

select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YK_YPCDMLK d where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.idm=d.idm

union all

select a.hzxm,b.cyrq,d.name,d.xmgg,c.ypsl/c.dwxs ypsl, c.ypdw

from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YY_SFXXMK d where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.ypdm=d.id and c.idm=0

--改為

select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),(select ypmc,ypgg,ypdm,idm idm from YK_YPCDMLK union select name,xmgg,id,0 from YY_SFXXMK)d

where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.idm=d.idm and c.ypdm=d.ypdm

實戰技巧3:合并sql

把表和where條件類似的兩個或是多個sql合并為一個sql.--查2009年以后的普通、急診、專家掛號人數

declare @ptghs int,@jzghs int,@zjghs int

select @ptghs=0,@jzghs=0,@zjghs=0

select @ptghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=0

select @jzghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=1

select @zjghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=2

select @ptghs,@jzghs,@zjghs

--改為

select @ptghs=0,@jzghs=0,@zjghs=0

select @ptghs=sum(case when ghlb=0 then 1 else 0 end),@jzghs=sum(case when ghlb=1 then 1 else 0 end), @zjghs=sum(case when ghlb=2 then 1 else 0 end)

from GH_GHZDK where ghrq>'2009'

select @ptghs,@jzghs,@zjghs

實戰技巧4:去掉游標

把游標當作編程語言的for,do---while的方式,很多情況下都可以去掉,如果光標中間sql語句只有一條一般都是可以去掉光標改為一句sql。

--查當天出院出院日期在2009年4月1到9日間病人的zfdj,zfje置為0

declare @syxh ut_syxh

declare cur1 cursor for select syxh from ZY_BRSYK where cyrq>='20090401' and cyrq<'20090410'

open cur1

fetch cur1 into @syxh

while @@fetch_status=0

begin

fetch cur1 into @syxh

end

close cur1

deallocate cur1

--改為

update ZY_BRFYMXK set zfdj=0,zfje=0

from ZY_BRFYMXK a,ZY_BRSYK b

where a.syxh=b.syxh and b.cyrq>='20090401' and b.cyrq<'20090410'

實戰技巧5:取代count

利用內部函數代替

declare @count int

select * into #tmep1 from ZY_BRFYMXK WHERE zxrq>'200901'

select @count=@@rowcount—可以得到count值

select @count

select @count=count(*)from #tmep1—可以被取代

select @count

利用exists而不count判斷有沒有記錄

declare @count int

Select @count=count(1)from ZY_BRFYMXK WHERE zxrq>'2009‘

If @count>0 … else ….--改為

If exists(Select 1 from ZY_BRFYMXK WHERE zxrq>'2009’)… else ….

第四篇:計算機系統安全性分析

計算機系統安全性分析

摘要:引言

隨著計算機科學技術的迅速發展和廣泛應用,計算機系統的安全問題已成為人們十分關注的重要課題。對計算機系統的威脅和攻擊主要有兩類:一類是對計算機系統實體的威脅和攻擊; 一類是對信息的威脅和攻擊。計算機犯罪和計算機病毒則包含了對實體和信息兩個方面的威脅和攻擊。計算機系統實體所面臨的威脅和攻擊主要指各種自然災害、場地和環境因素的影響、戰爭破壞和損失、設備故障、人為破壞、各種媒體設備的損壞和丟失。對實體的威脅和攻擊,不僅造成國家財產的嚴重損失,而且會造成信息的泄漏和破壞。因此,對計算機系統實體的安全保護是防止對信息威脅和攻擊的有力措施。對信息的威脅和攻擊主要有兩種方式: 一種是信息泄漏,一種是信息破壞。信息泄漏是指故意或偶然地偵收、截獲、竊取、分析、收集到系統中的信息,特別是機密信息和敏感信息,造成泄密事件。信息的破壞是指由于偶然事故或人為因素破壞信息的完整性、正確性和可用性,如各種軟硬件的偶然故障,環境和自然因素的影響以及操作失誤造成的信息破壞,尤其是計算機犯罪和計算機病毒造成信息的修改、刪除或破壞,將導致系統資源被盜或被非法使用,甚至使系統癱瘓。

2、計算機系統安全概述

計算機系統(computer system)也稱計算機信息系統(Computer Information System),是由計算機及其相關的和配套的設備、設施(含網絡)構成的,并按一定的應用目標和規則對信息進行采集、加工、存儲、傳輸、檢索等處理的人機系統。計算機系統安全(computer system security)中的“安全”一詞是指將服務與資源的脆弱性降到最低限度。脆弱性是指計算機系統的任何弱點。

國際標準化組織(ISO)將“計算機安全”定義為:“為數據處理系統建立和采取的技術和管理的安全保護,保護計算機硬件、軟件數據不因偶然和惡意的原因而遭到破壞、更改和泄露?!贝烁拍钇赜陟o態信息保護。也有人將“計算機安全”定義為:“計算機的硬件、軟件和數據受到保護,不因偶然和惡意的原因而遭到破壞、更改和泄露,系統連續正常運行?!痹摱x著重于動態意義描述。

在美國國家信息基礎設施(NII)的文獻中,給出了安全的五個屬性:可用性、可靠性、完整性、保密性和不可抵賴性。這五個屬性適用于國家信息基礎設施的教育、娛樂、醫療、運輸、國家安全、電力供給及分配、通信等廣泛領域。這五個屬性定義如下:

可用性(Availability):得到授權的實體在需要時可訪問資源和服務。可用性是指無論何時,只要用戶需要,信息系統必須是可用的,也就是說信息系統不能拒絕服務。網絡最基本的功能是向用戶提供所需的信息和通信服務,而用戶的通信要求是隨機的,多方面的(話音、數據、文字和圖像等),有時還要求時效性。網絡必須隨時滿足用戶通信的要求。攻擊者通常采用占用資源的手段阻礙授權者的工作。可以使用訪問控制機制,阻止非授權用戶進入網絡,從而保證網絡系統的可用性。增強可用性還包括如何有效地避免因各種災害(戰爭、地震等)造成的系統失效。

可靠性(Reliability):可靠性是指系統在規定條件下和規定時間內、完成規定功能的概率??煽啃允蔷W絡安全最基本的要求之一,網絡不可靠,事故不斷,也就談不上網絡的安全。目前,對于網絡可靠性的研究基本上偏重于硬件可靠性方面。研制高可靠性元器件設備,采取合理的冗余備份措施仍是最基本的可靠性對策,然而,有許多故障和事故,則與軟件可靠

性、人員可靠性和環境可靠性有關。

完整性(Integrity):信息不被偶然或蓄意地刪除、修改、偽造、亂序、重放、插入等破壞的特性。只有得到允許的人才能修改實體或進程,并且能夠判別出實體或進程是否已被篡改。即信息的內容不能為未授權的第三方修改。信息在存儲或傳輸時不被修改、破壞,不出現信息包的丟失、亂序等。

保密性(Confidentiality):保密性是指確保信息不暴露給未授權的實體或進程。即信息的內容不會被未授權的第三方所知。這里所指的信息不但包括國家秘密,而且包括各種社會團體、企業組織的工作秘密及商業秘密,個人的秘密和個人私密(如瀏覽習慣、購物習慣)。防止信息失竊和泄露的保障技術稱為保密技術。

不可抵賴性(Non-Repudiation):也稱作不可否認性。不可抵賴性是面向通信雙方(人、實體或進程)信息真實同一的安全要求,它包括收、發雙方均不可抵賴。一是源發證明,它提供給信息接收者以證據,這將使發送者謊稱未發送過這些信息或者否認它的內容的企圖不能得逞;二是交付證明,它提供給信息發送者以證明這將使接收者謊稱未接收過這些信息或者否認它的內容的企圖不能得逞。影響計算機系統安全問題分析

這里我們只考慮從計算機用戶角度來講的計算機系統信息安全隱患。它大致有如下幾個方面:

3.1計算機網絡病毒

計算機網絡病毒除了具有傳統病毒的破壞性特點外。還具有網絡特性。隨著互聯網的廣泛應用。使得其傳播途徑更廣、速度更快.危害也更大。計算機網絡病毒主要有:宏病毒、網頁腳本病毒、蠕蟲病毒。其中蠕蟲病毒與其他病毒不同的是其傳播具有主動性。它會主動掃描網絡上主機操作系統和一些網絡服務的漏洞。利用這些漏洞感染這些主機。

3.2特洛伊木馬

許多人也將它歸為計算機病毒一類。但它與計算機病毒又有較大的區別。計算機病毒從來不在宿主代碼之外獨立。而總是把自己嵌入宿主代碼,從而成為惡意代碼。木馬則是一個獨立運行的程序。它一般由一個客戶端和一個服務端兩部分構成,服務器端就安裝在受害者的機器上,并注冊成為一種“服務”。然后從遠程控制你的機器等等。而且這種攻擊往往發生在受害者毫不知情的狀況下。所以特洛伊木馬的危害不亞于病毒。

3.3黑客惡意攻擊

不管黑客攻擊的是哪種類型的目標,其采用的攻擊手段和過程都具有一定的共性。一般攻擊大體有如下幾個步驟:對目標系統安全脆弱性進行掃描與分析;找到漏洞入口;執行攻擊程序;獲得管理員權限;放置木馬后門;清除痕跡。

4.計算機系統安全管理對策

計算機系統的安全性和可靠性,來源于安全策略的多樣性和安全技術的先進性。計算機技術是當今發展最快的技術之一,對于計算機系統的安全性,也要根據計算機系統的發展 不斷完善和改進,策略要不斷求變,技術要不斷創新,特別是隨著計算機網絡在社會的各個方面的延伸。進入網絡的手段越來越多,越來越方便,因此,對于計算機系統來自網絡方面 的安全威脅,更是安全防范的重中之重。特別是對予各單位的一些要害部門。必須做到領導重視,制度健全,措施得力,大力加強工作人員的責任心和防范意識。自覺執行各項安全制度,采用先進的技術和產品,構造全方位的防御機制,使計算機系統在理想的狀態下穩定可靠地運行。

4.1建立健全安全管理制度

建立健全安全管理制度是安全管理的重要前提。標準化的安全管理,能克服傳統管理中憑借個人的主觀意志驅動管理模式。不管人員如何變化,先進的管理方法和經驗可以得到 很好的繼承。根據本單位的實際情況和所采用的技術條件,參照有關的法規、條例和其他單位好的經驗,制定出切實可行又比較全面的各類安全管理制度。這些制度應包括:重要數據備份制度、信息數據恢復策略、應用程序使用權限管理制度、用戶賬戶管理制度、計算機設備使用管理制度、計算機網絡安全管理制度、密鑰安全管理制度、計算機病毒防治管理制度等。

4.2做好防御病毒和存儲權限設置

防御病毒首先要加強計算機內部使用人員的教育,養成良好的安全上網習慣和安全意識。不隨便下載和使用來歷不明的計算機軟件和文件,選擇安裝殺毒軟件、后門及木馬檢測和清除軟件。以及防火墻軟件,在局域網中使用網絡版殺毒軟件。計算機采用口令來控制授權訪問,首先口令必須符合復雜口令規則、定期更換口令、不同的人員設置不同的訪問權限。我們需要對系統的所有資源進行權限控制,權限控制的目標就是對應用系統的所有對象資源和數據資源進行權限控制。比如應用系統的功能菜單、各個界面的按鈕、數據顯示的列及 各種行級數據進行權限的操控。

4.3做好防御黑客的策略

防御黑客的策略是對計算機系統以及整個網絡系統實施分層次、多級別的防護。包括檢測、告警和修復等應急功能的實時策略。主要有:一是防火墻技術,防火墻構成了系統對外防御的第一道防線。防火墻是用來隔離被保護的內部網絡。明確定義網絡的邊界和服務,完成授權、訪問控制以及安全審計的功能。它是分離器、限制器,也是分析器。它有效地監控了內部網和Intemet之間的任何活動,保證了內部網絡的安全。防火墻技術可根據防范的方式和側重點的不同而分為很多種類型。但總體來講可分為二大類:分組過濾、應用代理。防火墻很難防范來自于網絡內部的攻擊以及病毒的威脅,基于網絡主機的操作系統安全和物理安會措施。按照級別從低到高,分別是主機系統的物理安全、操作系統的內核安全、系統服務安全、應用服務安全和文件系統安全:主機安全檢查和漏洞修補以及系統備份安全作為輔助安全措施。主要防范部分突破防火墻以及從內部發起的攻擊。二是入侵檢測技術。入侵檢測技術是為保證計算機系統的安全而設計與配置的,是一種能夠及時發現并報告系統中未授權或異常現象的技術,也是用于檢測計算機網絡中違反安全策略行為的技術。入侵檢測系統能夠識別出任何不希望有的活動,這種活動可能來自于網絡外部和內部。入侵檢測系統的應用。能使在入侵攻擊對系統發生危害前,檢測到入侵攻擊,并利用報警與防護系統驅逐入侵攻擊。在入侵攻擊過程中,能減少入侵攻擊所造成的損失。在被入侵攻擊后,收集入侵攻擊的相關信息,作為防范系統的知識。添加到知識庫內,以增強系統的防范能力。

4.4關于數據備份策略

建議在計算機中安裝光盤刻錄機,將一些不再修改的重要數據,直接刻錄在光盤上,分別存放在不同地點:一些還需修改的數據,可通過U盤或移動硬盤,分別存放在辦公室或家庭中的不同計算機中;對于有局域網的單位用戶。一些重要但不需要保密的數據,可分別存放在本地計算機和局域網服務器中;對于一些較小的數據文件。也可壓縮后保存在自己的郵箱中。數據備份的要點,一是要備份多份,分別存放在不同地點:二是備份要及時更新,不可存在僥幸心理,否則,一旦造成損失。后悔莫及。

4.5關于信息數據的恢復策略

只要及時做好了備份,數據的恢復非常簡單。由于備份數據時的文件名可能與原文件名相同,所以在恢復時一定要注意,不要將被破壞的數據覆蓋完整的數據:對于沒有做備份的 數據。也可以通過一些工具軟件進行部分恢復。但操作起來要復雜一些。不是一般用戶能做的。

4.6密鑰安全管理制度

在該制度的制定中,主要應考慮本單位的一些重要賬戶和密碼的安全。這砦重要的賬戶和密碼不應集中在某個人手中,而應該有一套嚴格的密鑰安全管理辦法和應急措施。

第五篇:心得總結:Java性能優化技巧集錦

心得總結:Java性能優化技巧集錦

一、通用篇

“通用篇”討論的問題適合于大多數Java應用。

1.1 不用new關鍵詞創建類的實例

用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable接口,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。

在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現: public static Credit getNewCredit(){ return new Credit();}

改進后的代碼使用clone()方法,如下所示: private static Credit BaseCredit = new Credit();public static Credit getNewCredit(){ return(Credit)BaseCredit.clone();}

上面的思路對于數組處理同樣很有用。

1.2 使用非阻塞I/O

版本較低的JDK不支持非阻塞I/O API。為避免I/O阻塞,一些應用采用了創建大量線程的辦法(在較好的情況下,會使用一個緩沖池)。這種技術可以在許多必須支持并發I/O流的應用中見到,如Web服務器、報價和拍賣應用等。然而,創建Java線程需要相當可觀的開銷。

JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,在這里有一個支持非阻塞I/O的軟件包。

請參見Sun中國網站的《調整Java的I/O性能》。

1.3 慎用異常

異常對性能不利。拋出異常首先要創建一個新的對象。Throwable接口的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。

異常只能用于錯誤處理,不應該用來控制程序流程。

1.4 不要重復初始化變量

默認情況下,調用類的構造函數時,Java會把變量初始化成確定的值:所有的對象被設置成null,整數變量(byte、short、int、long)設置成0,float和 double變量設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。

1.5 盡量指定類的final修飾符

帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。

另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50%。

1.6 盡量使用局部變量

調用方法時傳遞的參數以及在調用中創建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態變量、實例變量等,都在堆(Heap)中創建,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進一步優化。請參見《盡可能使用堆棧變量》。

1.7 乘法和除法

考慮下面的代碼:

for(val = 0;val < 100000;val +=5){ alterX = val * 8;myResult = val * 2;}

用移位操作替代乘法操作可以極大地提高性能。下面是修改后的代碼:

for(val = 0;val < 100000;val += 5){ alterX = val << 3;myResult = val << 1;}

修改后的代碼不再做乘以8的操作,而是改用等價的左移3位操作,每左移1位相當于乘以2。相應地,右移1位操作相當于除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難于理解,所以最好加上一些注釋。

二、J2EE篇

前面介紹的改善性能技巧適合于大多數Java應用,接下來要討論的問題適合于使用JSP、EJB或JDBC的應用。

2.1 使用緩沖標記

一些應用服務器加入了面向JSP的緩沖標記功能。例如,BEA的WebLogic Server從6.0版本開始支持這個功能,Open Symphony工程也同樣支持這個功能。JSP緩沖標記既能夠緩沖頁面片斷,也能夠緩沖整個頁面。當JSP頁面執行時,如果目標片斷已經在緩沖之中,則生成該片斷的代碼就不用再執行。頁面級緩沖捕獲對指定URL的請求,并緩沖整個結果頁面。對于購物籃、目錄以及門戶網站的主頁來說,這個功能極其有用。對于這類應用,頁面級緩沖能夠保存頁面執行的結果,供后繼請求使用。

對于代碼邏輯復雜的頁面,利用緩沖標記提高性能的效果比較明顯;反之,效果可能略遜一籌。

請參見《用緩沖技術提高JSP應用的性能和穩定性》。

2.2 始終通過會話Bean訪問實體Bean

直接訪問實體Bean不利于性能。當客戶程序遠程訪問實體Bean時,每一個get方法都是一個遠程調用。訪問實體Bean的會話Bean是本地的,能夠把所有數據組織成一個結構,然后返回它的值。

用會話Bean封裝對實體Bean的訪問能夠改進事務管理,因為會話Bean只有在到達事務邊界時才會提交。每一個對get方法的直接調用產生一個事務,容器將在每一個實體Bean的事務之后執行一個“裝入-讀取”操作。

一些時候,使用實體Bean會導致程序性能不佳。如果實體Bean的唯一用途就是提取和更新數據,改成在會話Bean之內利用JDBC訪問數據庫可以得到更好的性能。

2.3 選擇合適的引用機制

在典型的JSP應用系統中,頁頭、頁腳部分往往被抽取出來,然后根據需要引入頁頭、頁腳。當前,在JSP頁面中引入外部資源的方法主要有兩種:include指令,以及include動作。

include指令:例如<%@ include file=“copyright.html” %>。該指令在編譯時引入指定的資源。在編譯之前,帶有include指令的頁面和指定的資源被合并成一個文件。被引用的外部資源在編譯時就確定,比運行時才確定資源更高效。

include動作:例如。該動作引入指定頁面執行后生成的結果。由于它在運行時完成,因此對輸出結果的控制更加靈活。但時,只有當被引用的內容頻繁地改變時,或者在對主頁面的請求沒有出現之前,被引用的頁面無法確定時,使用include動作才合算。

2.4 在部署描述器中設置只讀屬性

實體Bean的部署描述器允許把所有get方法設置成“只讀”。當某個事務單元的工作只包含執行讀取操作的方法時,設置只讀屬性有利于提高性能,因為容器不必再執行存儲操作。

2.5 緩沖對EJB Home的訪問

EJB Home接口通過JNDI名稱查找獲得。這個操作需要相當可觀的開銷。JNDI查找最好放入Servlet的init()方法里面。如果應用中多處頻繁地出現EJB訪問,最好創建一個EJBHomeCache類。EJBHomeCache類一般應該作為singleton實現。

2.6 為EJB實現本地接口

本地接口是EJB 2.0規范新增的內容,它使得Bean能夠避免遠程調用的開銷。請考慮下面的代碼。PayBeanHome home =(PayBeanHome)javax.rmi.PortableRemoteObject.narrow(ctx.lookup(“PayBeanHome”), PayBeanHome.class);PayBean bean =(PayBean)javax.rmi.PortableRemoteObject.narrow(home.create(), PayBean.class);

第一個語句表示我們要尋找Bean的Home接口。這個查找通過JNDI進行,它是一個RMI調用。然后,我們定位遠程對象,返回代理引用,這也是一個 RMI調用。第二個語句示范了如何創建一個實例,涉及了創建IIOP請求并在網絡上傳輸請求的stub程序,它也是一個RMI調用。

要實現本地接口,我們必須作如下修改:

方法不能再拋出java.rmi.RemoteException異常,包括從RemoteException派生的異常,比如 TransactionRequiredException、TransactionRolledBackException和 NoSuchObjectException。EJB提供了等價的本地異常,如TransactionRequiredLocalException、TransactionRolledBackLocalException和NoSuchObjectLocalException。

所有數據和返回值都通過引用的方式傳遞,而不是傳遞值。

本地接口必須在EJB部署的機器上使用。簡而言之,客戶程序和提供服務的組件必須在同一個JVM上運行。

如果Bean實現了本地接口,則其引用不可串行化。

請參見《用本地引用提高EJB訪問效率》。

軟件資訊 > 開發特區 > 開發語言 > Java

2006年05月11日 作者:songxin 責任編輯:xietaoming

文章導讀:分通用篇、J2EE篇、GUI篇三部分介紹Java性能優化技巧。

2.7 生成主鍵

在EJB之內生成主鍵有許多途徑,下面分析了幾種常見的辦法以及它們的特點。

利用數據庫內建的標識機制(SQL Server的IDENTITY或Oracle的SEQUENCE)。這種方法的缺點是EJB可移植性差。

由實體Bean自己計算主鍵值(比如做增量操作)。它的缺點是要求事務可串行化,而且速度也較慢。

利用NTP之類的時鐘服務。這要求有面向特定平臺的本地代碼,從而把Bean固定到了特定的OS之上。另外,它還導致了這樣一種可能,即在多CPU的服務器上,同一個毫秒之內生成了兩個主鍵。

借鑒Microsoft的思路,在Bean中創建一個GUID。然而,如果不求助于JNI,Java不能確定網卡的MAC地址;如果使用JNI,則程序就要依賴于特定的OS。

還有其他幾種辦法,但這些辦法同樣都有各自的局限。似乎只有一個答案比較理想:結合運用RMI和JNDI。先通過RMI注冊把RMI遠程對象綁定到JNDI樹。客戶程序通過JNDI進行查找。下面是一個例子: public class keyGenerator extends UnicastRemoteObject implements Remote { private static long KeyValue = System.currentTimeMillis();public static synchronized long getKey()throws RemoteException { return KeyValue++;}

2.8 及時清除不再需要的會話

為了清除不再活動的會話,許多應用服務器都有默認的會話超時時間,一般為30分鐘。當應用服務器需要保存更多會話時,如果內存容量不足,操作系統會把部分內存數據轉移到磁盤,應用服務器也可能根據“最近最頻繁使用”(Most Recently Used)算法把部分不活躍的會話轉儲到磁盤,甚至可能拋出“內存不足”異常。在大規模系統中,串行化會話的代價是很昂貴的。當會話不再需要時,應當及時調用HttpSession.invalidate()方法清除會話。HttpSession.invalidate()方法通??梢栽趹玫耐顺鲰撁嬲{用。

2.9 在JSP頁面中關閉無用的會話

對于那些無需跟蹤會話狀態的頁面,關閉自動創建的會話可以節省一些資源。使用如下page指令: <%@ page session=“false”%>

2.10 Servlet與內存使用

許多開發者隨意地把大量信息保存到用戶會話之中。一些時候,保存在會話中的對象沒有及時地被垃圾回收機制回收。從性能上看,典型的癥狀是用戶感到系統周期性地變慢,卻又不能把原因歸于任何一個具體的組件。如果監視JVM的堆空間,它的表現是內存占用不正常地大起大落。

解決這類內存問題主要有二種辦法。第一種辦法是,在所有作用范圍為會話的Bean中實現HttpSessionBindingListener接口。這樣,只要實現valueUnbound()方法,就可以顯式地釋放Bean使用的資源。

另外一種辦法就是盡快地把會話作廢。大多數應用服務器都有設置會話作廢間隔時間的選項。另外,也可以用編程的方式調用會話的 setMaxInactiveInterval()方法,該方法用來設定在作廢會話之前,Servlet容器允許的客戶請求的最大間隔時間,以秒計。

2.11 HTTP Keep-Alive

Keep-Alive功能使客戶端到服務器端的連接持續有效,當出現對服務器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。市場上的大部分Web服務器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。對于提供靜態內容的網站來說,這個功能通常很有用。但是,對于負擔較重的網站來說,這

里存在另外一個問題:雖然為客戶保留打開的連接有一定的好處,但它同樣影響了性能,因為在處理暫停期間,本來可以釋放的資源仍舊被占用。當Web服務器和應用服務器在同一臺機器上運行時,Keep-Alive功能對資源利用的影響尤其突出。

2.12 JDBC與Unicode

想必你已經了解一些使用JDBC時提高性能的措施,比如利用連接池、正確地選擇存儲過程和直接執行的SQL、從結果集刪除多余的列、預先編譯SQL語句,等等。

除了這些顯而易見的選擇之外,另一個提高性能的好選擇可能就是把所有的字符數據都保存為Unicode(代碼頁13488)。Java以Unicode形式處理所有數據,因此,數據庫驅動程序不必再執行轉換過程。但應該記?。喝绻捎眠@種方式,數據庫會變得更大,因為每個Unicode字符需要2個字節存儲空間。另外,如果有其他非Unicode的程序訪問數據庫,性能問題仍舊會出現,因為這時數據庫驅動程序仍舊必須執行轉換過程。

2.13 JDBC與I/O

如果應用程序需要訪問一個規模很大的數據集,則應當考慮使用塊提取方式。默認情況下,JDBC每次提取32行數據。舉例來說,假設我們要遍歷一個5000 行的記錄集,JDBC必須調用數據庫157次才能提取到全部數據。如果把塊大小改成512,則調用數據庫的次數將減少到10次。

在一些情形下這種技術無效。例如,如果使用可滾動的記錄集,或者在查詢中指定了FOR UPDATE,則塊操作方式不再有效。

2.14 內存數據庫

許多應用需要以用戶為單位在會話對象中保存相當數量的數據,典型的應用如購物籃和目錄等。由于這類數據可以按照行/列的形式組織,因此,許多應用創建了龐大的Vector或HashMap。在會話中保存這類數據極大地限制了應用的可伸縮性,因為服務器擁有的內存至少必須達到每個會話占用的內存數量乘以并發用戶最大數量,它不僅使服務器價格昂貴,而且垃圾收集的時間間隔也可能延長到難以忍受的程度。

一些人把購物籃/目錄功能轉移到數據庫層,在一定程度上提高了可伸縮性。然而,把這部分功能放到數據庫層也存在問題,且問題的根源與大多數關系數據庫系統的體系結構有關。對于關系數據庫來說,運行時的重要原則之一是確保所有的寫入操作穩定、可靠,因而,所有的性能問題都與物理上把數據寫入磁盤的能力有關。關系數據庫力圖減少I/O操作,特別是對于讀操作,但實現該目標的主要途徑只是執行一套實現緩沖機制的復雜算法,而這正是數據庫層第一號性能瓶頸通常總是 CPU的主要原因。

一種替代傳統關系數據庫的方案是,使用在內存中運行的數據庫(In-memory Database),例如TimesTen。內存數據庫的出發點是允許數據臨時地寫入,但這些數據不必永久地保存到磁盤上,所有的操作都在內存中進行。這樣,內存數據庫不需要復雜的算法來減少I/O操作,而且可以采用比較簡單的加鎖機制,因而速度很快。

三、GUI篇

這一部分介紹的內容適合于圖形用戶界面的應用(Applet和普通應用),要用到AWT或Swing。

3.1 用JAR壓縮類文件

Java檔案文件(JAR文件)是根據JavaBean標準壓縮的文件,是發布JavaBean組件的主要方式和推薦方式。JAR檔案有助于減少文件體積,縮短下載時間。例如,它有助于Applet提高啟動速度。一個JAR文件可以包含一個或者多個相關的Bean以及支持文件,比如圖形、聲音、HTML 和其他資源。

要在HTML/JSP文件中指定JAR文件,只需在Applet標記中加入ARCHIVE = “name.jar”聲明。

請參見《使用檔案文件提高 applet 的加載速度》。

3.2 提示Applet裝入進程

你是否看到過使用Applet的網站,注意到在應該運行Applet的地方出現了一個占位符?當Applet的下載時間較長時,會發生什么事情?最大的可能就是用戶掉頭離去。在這種情況下,顯示一個Applet正在下載的信息無疑有助于鼓勵用戶繼續等待。

下面我們來看看一種具體的實現方法。首先創建一個很小的Applet,該Applet負責在后臺下載正式的Applet:

import java.applet.Applet;import java.applet.AppletStub;import java.awt.Label;import java.awt.Graphics;import java.awt.GridLayout;public class PreLoader extends Applet implements Runnable, AppletStub { String largeAppletName;Label label;public void init(){ // 要求裝載的正式Applet largeAppletName = getParameter(“applet”);// “請稍等”提示信息

label = new Label(“請稍等...” + largeAppletName);add(label);} public void run(){ try { // 獲得待裝載Applet的類

Class largeAppletClass = Class.forName(largeAppletName);// 創建待裝載Applet的實例

Applet largeApplet =(Applet)largeAppletClass.newInstance();// 設置該Applet的Stub程序 largeApplet.setStub(this);// 取消“請稍等”信息 remove(label);// 設置布局

setLayout(new GridLayout(1, 0));add(largeApplet);// 顯示正式的Applet largeApplet.init();largeApplet.start();} catch(Exception ex){ // 顯示錯誤信息

label.setText(“不能裝入指定的Applet”);} // 刷新屏幕 validate();

} public void appletResize(int width, int height){ // 把appletResize調用從stub程序傳遞到Applet resize(width, height);} }

編譯后的代碼小于2K,下載速度很快。代碼中有幾個地方值得注意。首先,PreLoader實現了AppletStub接口。一般地,Applet從調用者判斷自己的codebase。在本例中,我們必須調用setStub()告訴Applet到哪里提取這個信息。另一個值得注意的地方是,AppletStub接口包含許多和Applet類一樣的方法,但appletResize()方法除外。這里我們把對appletResize()方法的調用傳遞給了resize()方法。

3.3 在畫出圖形之前預先裝入它

ImageObserver接口可用來接收圖形裝入的提示信息。ImageObserver接口只有一個方法imageUpdate(),能夠用一次repaint()操作在屏幕上畫出圖形。下面提供了一個例子。public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h){ if((flags & ALLBITS)!=0 { repaint();} else if(flags &(ERROR |ABORT))!= 0){ error = true;// 文件沒有找到,考慮顯示一個占位符 repaint();} return(flags &(ALLBITS | ERROR| ABORT))== 0;}

當圖形信息可用時,imageUpdate()方法被調用。如果需要進一步更新,該方法返回true;如果所需信息已經得到,該方法返回false。

3.4 覆蓋update方法

update()方法的默認動作是清除屏幕,然后調用paint()方法。如果使用默認的update()方法,頻繁使用圖形的應用可能出現顯示閃爍現象。要避免在paint()調用之前的屏幕清除操作,只需按照如下方式覆蓋update()方法:

public void update(Graphics g){ paint(g);}

更理想的方案是:覆蓋update(),只重畫屏幕上發生變化的區域,如下所示: public void update(Graphics g){ g.clipRect(x, y, w, h);paint(g);}

3.5 延遲重畫操作

對于圖形用戶界面的應用來說,性能低下的主要原因往往可以歸結為重畫屏幕的效率低下。當用戶改變窗口大小或者滾動一個窗口時,這一點通??梢院苊黠@地觀察到。改變窗口大小或者滾動屏幕之類的操作導致重畫屏幕事件大量地、快速地生成,甚至超過了相關代碼的執行速度。對付這個問題最好的辦法是忽略所有“遲到” 的事件。

建議在這里引入一個數毫秒的時差,即如果我們立即接收到了另一個重畫事件,可以停止處理當前事件轉而處理最后一個收到的重畫事件;否則,我們繼續進行當前的重畫過程。

如果事件要啟動一項耗時的工作,分離出一個工作線程是一種較好的處理方式;否則,一些部件可能被“凍結”,因為每次只能處理一個事件。下面提供了一個事件處理的簡單例子,但經過擴展后它可以用來控制工作線程。

public static void runOnce(String id, final long milliseconds){ synchronized(e_queue){ // e_queue: 所有事件的集合 if(!e_queue.containsKey(id)){ e_queue.put(token, new LastOne());} } final LastOne lastOne =(LastOne)e_queue.get(token);final long time = System.currentTimeMillis();// 獲得當前時間 lastOne.time = time;(new Thread(){public void run(){ if(milliseconds > 0){ try {Thread.sleep(milliseconds);} // 暫停線程 catch(Exception ex){} } synchronized(lastOne.running){ // 等待上一事件結束 if(lastOne.time!= time)// 只處理最后一個事件 return;} }}).start();} private static Hashtable e_queue = new Hashtable();private static class LastOne { public long time=0;public Object running = new Object();}

3.6 使用雙緩沖區

在屏幕之外的緩沖區繪圖,完成后立即把整個圖形顯示出來。由于有兩個緩沖區,所以程序可以來回切換。這樣,我們可以用一個低優先級的線程負責畫圖,使得程序能夠利用空閑的CPU時間執行其他任務。下面的偽代碼片斷示范了這種技術。Graphics myGraphics;Image myOffscreenImage = createImage(size().width, size().height);

Graphics offscreenGraphics = myOffscreenImage.getGraphics();offscreenGraphics.drawImage(img, 50, 50, this);myGraphics.drawImage(myOffscreenImage, 0, 0, this);

3.7 使用BufferedImage

Java JDK 1.2使用了一個軟顯示設備,使得文本在不同的平臺上看起來相似。為實現這個功能,Java必須直接處理構成文字的像素。由于這種技術要在內存中大量地進行位復制操作,早期的JDK在使用這種技術時性能不佳。為解決這個問題而提出的Java標準實現了一種新的圖形類型,即BufferedImage。

BufferedImage子類描述的圖形帶有一個可訪問的圖形數據緩沖區。一個BufferedImage包含一個ColorModel和一組光柵圖形數據。這個類一般使用RGB(紅、綠、藍)顏色模型,但也可以處理灰度級圖形。它的構造函數很簡單,如下所示:

public BufferedImage(int width, int height, int imageType)

ImageType允許我們指定要緩沖的是什么類型的圖形,比如5-位RGB、8-位RGB、灰度級等。

3.8 使用VolatileImage

許多硬件平臺和它們的操作系統都提供基本的硬件加速支持。例如,硬件加速一般提供矩形填充功能,和利用CPU完成同一任務相比,硬件加速的效率更高。由于硬件加速分離了一部分工作,允許多個工作流并發進行,從而緩解了對CPU和系統總線的壓力,使得應用能夠運行得更快。利用VolatileImage可以創建硬件加速的圖形以及管理圖形的內容。由于它直接利用低層平臺的能力,性能的改善程度主要取決于系統使用的圖形適配器。VolatileImage的內容隨時可能丟失,也即它是“不穩定的(volatile)”。因此,在使用圖形之前,最好檢查一下它的內容是否丟失。VolatileImage有兩個能夠檢查內容是否丟失的方法: public abstract int validate(GraphicsConfiguration gc);public abstract Boolean contentsLost();

每次從VolatileImage對象復制內容或者寫入VolatileImage時,應該調用validate()方法。contentsLost()方法告訴我們,自從最后一次validate()調用之后,圖形的內容是否丟失。

雖然VolatileImage是一個抽象類,但不要從它這里派生子類。VolatileImage應該通過

Component.createVolatileImage()或者 GraphicsConfiguration.createCompatibleVolatileImage()方法創建。

3.9 使用Window Blitting

進行滾動操作時,所有可見的內容一般都要重畫,從而導致大量不必要的重畫工作。許多操作系統的圖形子系統,包括WIN32 GDI、MacOS和X/Windows,都支持Window Blitting技術。Window Blitting技術直接在屏幕緩沖區中把圖形移到新的位置,只重畫新出現的區域。要在Swing應用中使用Window Blitting技術,設置方法如下: setScrollMode(int mode);

在大多數應用中,使用這種技術能夠提高滾動速度。只有在一種情形下,Window Blitting會導致性能降低,即應用在后臺進行滾動操作。如果是用戶在滾動一個應用,那么它總是在前臺,無需擔心任何負面影響。

下載計算機系統性能優化總結word格式文檔
下載計算機系統性能優化總結.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    。NET 性能優化方法總結與字符串連接優化

    .NET 性能優化方法總結 Ver 1.0 2009-1-20 目錄 1. C#語言方面 ..........................................................................................................

    VoIP業務Qos性能優化研究

    VoIP 業務QoS 性能及其優化研究 張路宜200522160013 VoIP(voice over IP) 就是通過IP 網絡承載語音業務,也稱IP 網絡電話。當網絡出現擁塞或傳輸差錯時,語音包就會產生時延......

    Web前端頁面性能優化小結

    Web前端頁面性能優化小結 Web前端頁面性能優化小結 影響用戶訪問的最大部分是前端的頁面。網站的劃分一般為二:前端和后臺。我們可以理解成后臺是用來實現網站的功能的,比如:實......

    Oracle DBA優化數據庫性能心得體會

    Oracle DBA優化數據庫性能心得體會 很多的時侯,做Oracle DBA的我們,當應用管理員向我們通告現在應用很慢、數據庫很慢的時侯,我們到數據庫時做幾個示例的Select也發現同樣的問......

    (敏捷開發).NET性能優化方面的總結.docx

    (敏捷開發).NET性能優化方面的總結 一、SqlDataRead和Dataset的選擇 Sqldataread優點:讀取數據非??臁H绻麑Ψ祷氐臄祿恍枳龃罅刻幚淼那闆r下,建議使用SqlDataReader,其性能......

    總結使用Unity3D優化游戲運行性能的經驗

    流暢的游戲玩法來自流暢的幀率,而我們即將推出的動作平臺游戲《Shadow Blade》已經將在標準iPhone和iPad設備上實現每秒60幀視為一個重要目標。 以下是我們在緊湊的優化過程......

    計算機系實習總結

    某 某 大 學實習報 告系部:計算機系專業:08計應1班姓名:某某某 實習時間:2010-11至2011-6 實習總結 從2010年11月開始,為期半年的實習工作轉瞬即將結束。伴隨著畢業鐘聲的臨近,......

    計算機系社會實踐總結

    計算機系2010年暑期社會實踐總結 為貫徹校團委“關于2010年暑期社會實踐活動的安排意見”的通知,加強和改進我系學生思想政治教育的有關要求,引導我系學生認真學習科學發展觀......

主站蜘蛛池模板: 人妻少妇精品中文字幕av| 日本大片免a费观看视频三区| 熟妇人妻va精品中文字幕| 野花香社区在线观看| 电影 国产 偷窥 亚洲 欧美| 国产精品嫩草影院免费观看| 好大好硬好爽免费视频| 无码一区二区三区av在线播放| 亚洲成av人在线视猫咪| 国产午夜亚洲精品久久| 日韩精品视频一区二区三区| 爆乳熟妇一区二区三区| 成人污视频| 麻豆精品一区二区综合av| 无码亲近乱子伦免费视频在线观看| 狠狠久久精品中文字幕无码| 女邻居的大乳中文字幕| 国产亚洲日韩欧美另类第八页| 成人啪啪高潮不断观看| 在线精品自偷自拍无码中文| 中文人妻熟女乱又乱精品| 国产精品无码av一区二区三区| 国产成人无码精品一区在线观看| 两性色午夜视频免费老司机| 亚洲中文字幕久久精品无码app| 伊人久久综合色| 成人免费一区二区三区视频软件| 男人的好看免费观看在线视频| 中文字幕亚洲一区一区| 西西444www无码大胆| 精品人妻午夜一区二区三区四区| 伊人色综合久久天天人手人婷| 日本熟日本熟妇中文在线观看| 国产人妻久久精品二区三区特黄| 国产专区一线二线三线码| 成人免费无遮挡无码黄漫视频| 国产精品麻豆aⅴ人妻| 国产乱理伦片在线观看| 97se色综合一区二区二区| 妺妺跟我一起洗澡没忍住| 无码av最新清无码专区吞精|