比較Swing和SWT的速度
前面文章已經(jīng)說過,MiG Layout Site網(wǎng)站的Mikael Grev曾編寫了一個(gè)GUI benchmark,來測(cè)試和比較Swing和SWT的性能,最終結(jié)論是除在Windows上比較Swing和SWT的速度幾乎一樣快之外,在其他操作系統(tǒng)上Swing的速度都要快于SWT。
這好像違背人們的常識(shí),模擬的組件如何能快過本地組件?實(shí)際如果你按照下面的想法想,這個(gè)現(xiàn)象也就不難解釋:
1.本地組件實(shí)際上也是畫出來,只不過是操作系統(tǒng)畫罷了。這個(gè)通常是人們所忽略的,仿佛只有Swing是畫出來的,而本地組件就是屏幕上的附屬物似的,忘記了它們也是畫出來的。
2.現(xiàn)在Java平臺(tái)的運(yùn)行速度已經(jīng)不慢于C/C++等靜態(tài)編譯型語言的產(chǎn)生的代碼。人們往往提到本地仿佛就比Java實(shí)現(xiàn)要快。在過去也許可以這樣看,但是現(xiàn)在隨著Java 6平臺(tái)性能的提高,許多地方Java平臺(tái)的速度反而快過本地調(diào)用。因此是應(yīng)該讓人們從過去對(duì)于Java速度的印象中醒過來時(shí)候了,現(xiàn)在人們提到Java速度想到的應(yīng)該是和C/C++相提并論了。
3.JNI調(diào)用耗費(fèi)的時(shí)間是不能忽略的。JNI調(diào)用速度要比普通Java方法調(diào)用慢好幾倍甚至幾十倍。即便是在Java 6中,這種情況并沒有改善。問題的實(shí)質(zhì)在于Java運(yùn)行時(shí)系統(tǒng)和本地庫(kù)之間畢竟是兩個(gè)異質(zhì)系統(tǒng),它們之間的調(diào)用必然有大量的轉(zhuǎn)換開銷。Java普通方法調(diào)用和JNI調(diào)用之間的關(guān)系就好像是本地調(diào)用和遠(yuǎn)程過程調(diào)用之間的區(qū)別,遠(yuǎn)程過程調(diào)用有網(wǎng)絡(luò)數(shù)據(jù)通信和數(shù)據(jù)類型系統(tǒng)轉(zhuǎn)換的開銷,而JNI也有數(shù)據(jù)傳遞(主要是內(nèi)存拷貝,速度雖然快過網(wǎng)絡(luò)通信,但是相對(duì)直接調(diào)用是不能忽略的)和數(shù)據(jù)類型系統(tǒng)轉(zhuǎn)換(Java數(shù)據(jù)類型和C語言數(shù)據(jù)類型)的開銷。
4.Swing絕大部分是用Java平臺(tái)模擬出的組件,這個(gè)過程都在一個(gè)系統(tǒng)平臺(tái)內(nèi)完成。而SWT是部分在本地系統(tǒng)完成,部分在Java平臺(tái)完成,要在這兩個(gè)平臺(tái)之間需要進(jìn)行頻繁的數(shù)據(jù)交互。
5.Swing可以享受JVM的特殊待遇,進(jìn)行特殊優(yōu)化,比如inline,JIT代碼,Swing事件隊(duì)列對(duì)于事件的預(yù)處理(合并Paint事件,批處理Java 2D光柵指令等),這就像本地組件可以利用操作系統(tǒng)進(jìn)行優(yōu)化一樣。
因此如果排除人的因素,也就是說排除Java平臺(tái)的工程師、Windows的工程師、Linux的工程師和Solaris的工程師本身能力的區(qū)別,從理論上來說,Swing的速度是完全可以超過SWT的。理解這一點(diǎn)你只要記住最關(guān)鍵的兩個(gè)原因是:
1).Java平臺(tái)的速度可以和C/C++一樣快。這個(gè)已經(jīng)被很多benchmark證明了,它們的速度是相當(dāng)?shù)?。因此Java模擬組件不一定會(huì)慢過本地組件,這要看誰的實(shí)現(xiàn)算法好。
2).跨系統(tǒng)之間的調(diào)用(JNI調(diào)用)開銷是不能忽略的。這個(gè)也在很多論文和benchmark得到證明。Swing中組件和數(shù)據(jù)之間的更新速度要遠(yuǎn)快于SWT,其原因就是Swing不需要進(jìn)行數(shù)據(jù)傳輸,而SWT需要跨兩個(gè)系統(tǒng)進(jìn)行數(shù)據(jù)傳輸。這在大數(shù)據(jù)量編輯組件如Table中尤其明顯。原因就在于Swing直接顯示了數(shù)據(jù)模型,而SWT需要將這些數(shù)據(jù)使用JNI發(fā)送到本地組件中去。
不可否認(rèn),Microsoft在Windows上浸淫了這么多年,圖形用戶界面的優(yōu)化已經(jīng)非常完善,而反觀Linux和Unix系列的桌面系統(tǒng)卻沒有如此優(yōu)化過。這就是為什么前文的benchmark顯示SWT能在Windows上和Swing速度相持平,而在其他平臺(tái)上遠(yuǎn)慢于Swing的原因。因?yàn)镾WT使用本地組件,它既占了Windows的光,也因此吃了Linux和Unix的虧。以上是比較wing和SWT的速度。
【編輯推薦】