對(duì)java 提供的兩個(gè)Map 進(jìn)行了性能測試發(fā)現(xiàn)效果還可以 萬個(gè)key的Map 查找 起來也不是很慢 大概 毫秒還打算自己手工做些性能優(yōu)化 將不同前綴的KEY分開到幾個(gè)小MAP里 發(fā)現(xiàn)性能沒有改觀 納悶中 分開到幾個(gè)小MAP里 然后小的里面還可以再分 分分分 形成一個(gè)按字母檢索樹突然想起 Java Pro 上有篇文章里說過Map系列的內(nèi)置 性能優(yōu)化方式 好象就是和我說的這種思想是一致的查找資料一看(x?ID= page= ) 過真如此 哈哈 不過上次看了印象不深刻 這次自己想出來了 印象當(dāng)真深刻的很 同時(shí)也證明了英雄所見略同(呵呵)/*** Map 系列性能測試*/import java util *;public class MapTest{public static void main(String ags[]){test ();System out println( );test ();}public static void test (){Map m = new HashMap();long t = System currentTimeMillis();for (int i = ; i 99999 ; i++){m.put("aa.bb.to.pub."+i+"12345asfsdfVO",i+"value");}long t1 = System.currentTimeMillis() ;System.out.println(t1-t0)//System.out.println(m.get("8888key"));for (int i = 0; i 99999 ; i++){m.get("aa.bb.to.pub."+i+"12345asfsdfVO");}long t2 = System.currentTimeMillis() ;System.out.println(t2-t1);}public static void test2(){Map m = new HashMap();m.put("aa.bb.ao",new HashMap());m.put("aa.bb.do",new HashMap());m.put("aa.bb.wo",new HashMap());m.put("aa.bb.po",new HashMap());m.put("aa.bb.io",new HashMap());m.put("aa.bb.oo",new HashMap());m.put("aa.bb.bo",new HashMap());m.put("aa.bb.to",new HashMap());m.put("aa.bb.yo",new HashMap());m.put("aa.bb.ro",new HashMap());long t0 = System.currentTimeMillis();for (int i = 10; i 20 ; i++){for (int k = 1; k 5 ; k++) //有10個(gè)模塊,比較5個(gè)模塊概率if("aa.bb.to.pub.12345headerVO".startsWith("aa.bb.to"));//下面假設(shè)上邊比較結(jié)果為: aa.bb.to開頭for(int j = 1000; j 2000; j++) //每個(gè)模塊里有1000個(gè)((Map)m.get("aa.bb.to")).put("aa.bb.to.pub."+j+"12345asfsdfVO","value");}long t1 = System.currentTimeMillis() ;System.out.println("錄入時(shí)間為:"+(t1-t0))//System.out.println(m.get("8888key"));for (int i = 10; i 20 ; i++){for (int k = 1; k 5 ; k++) //有10個(gè)模塊,比較5個(gè)模塊概率if("aa.bb.to.pub.12345asfsdfVO".startsWith("aa.bb.to"));for(int j = 1000; j 2000; j++)((Map)m.get("aa.bb.to")).get("aa.bb.to.pub."+j+"12345asfsdfVO");}long t2 = System.currentTimeMillis() ;System.out.println("查找時(shí)間為:"+(t2-t1));}}; lishixinzhi/Article/program/Java/JSP/201311/19175
公司主營業(yè)務(wù):網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出秦皇島免費(fèi)做網(wǎng)站回饋大家。
隨著DEC(Digital Equipment Corp)公司Alpha處理器在 年末的發(fā)布 就意味著這個(gè)世界開始進(jìn)入 位計(jì)算的時(shí)代 緊接著 全球幾大主要計(jì)算機(jī)公司 如IBM Hewlett Packard(惠普) Fujitsu(富士通) Sun Microsystems 也發(fā)布了各自相應(yīng)的產(chǎn)品進(jìn)入到 位 這個(gè)市場 在 年 Fujitsu旗下的HAL Computer發(fā)布了業(yè)界第一臺(tái)基于 位SPARC CPU的工作站 SPARC 此后不久 Sun發(fā)布了大眾期盼已久的Ultra Ultra 工作站 其內(nèi)置了Sun的 位UltraSPARC處理器 時(shí)間轉(zhuǎn)換到 年 IBM發(fā)布了其第一個(gè) 位PowerPC RISC芯片 RS 在 年 IBM對(duì)RS 進(jìn)行改良 使其支持SMP 這就是Power 如今看起來 對(duì) 位計(jì)算來說 其整整花了五年的時(shí)間 才在 年開始大量進(jìn)入市場 在本文中 將主要涉及兩個(gè)現(xiàn)在廣泛應(yīng)用的 位平臺(tái) AMD 與PowerPC 并分別使用IBM與Sun Microsystems這兩個(gè)Java語言巨頭提供的Java虛擬機(jī)(JVM) 通過SPECjvm 與SPECjbb 的測試 來評(píng)價(jià) 位與 位中JVM的性能 (注 SPECjvm 與SPECjbb 來自Standard Performance Evaluation Corp )AMD 是Advanced Micro Devices(AMD)公司的 位平臺(tái) 其擴(kuò)展了工業(yè)標(biāo)準(zhǔn)的x 指令集架構(gòu) 并設(shè)計(jì)在不降低任何性能的前提下 于 位模式中完全兼容現(xiàn)有的x 應(yīng)用程序與操作系統(tǒng) 在 年 月 AMD發(fā)布了Opteron 遵循AMD 架構(gòu)的第一款處理器 與其同時(shí) 年 IBM發(fā)布了PowerPC 其是源自IBM Power 雙核CPU的單核處理器 從此 IBM把 位PowerPC架構(gòu)帶到了桌面系統(tǒng)與低端服務(wù)器領(lǐng)域 另外要說明一點(diǎn) PowerPC 也像Power 一樣 可在不降低性能的前提下 本地執(zhí)行 位指令 不久之后 在 年 月 由Apple Computer公司設(shè)計(jì) 基于PowerPC CPU的Power Mac G 電腦上市 Java背景介紹 在第一款 位處理器誕生不久 Java技術(shù)也出世了 并由此改寫歷史 Java是一種健壯的 通用的 面向?qū)ο蟮?構(gòu)架中立的 可移植的 安全的 多線程的編程語言 并帶有隱式內(nèi)存管理功能 Java面向?qū)ο蟮奶匦栽诤艽蟪潭壬吓cC++相似 但加入了更多的接口與擴(kuò)展以創(chuàng)建更具靈活性的解決方案 與C++不同的是 Java不支持操作符重載 多重繼承和自動(dòng)類型強(qiáng)制 Java通過廣泛的運(yùn)行時(shí)檢查和內(nèi)置的例外處理機(jī)制 達(dá)到健壯性的目的 編譯器所生成的只是字節(jié)碼指令 其是獨(dú)立于任何特定平臺(tái)的 這樣就保證了架構(gòu)中立性 可移植性是通過指定基本數(shù)據(jù)類型大小和其算術(shù)操作符的行為來達(dá)到的 例如 int總表示一個(gè)有符號(hào)的 位整數(shù) 而float總表示一個(gè) 位的IEEE 浮點(diǎn)數(shù) Java同時(shí)也有一系列的同步原語 其基于廣泛使用的條件變量范式 自動(dòng)內(nèi)存垃圾回收(GC)簡化了Java編程的難度 并極大地降低了bug的數(shù)目 但也使運(yùn)行機(jī)制稍微復(fù)雜了點(diǎn) 在 年 也就是DEC公司發(fā)布第一款 位處理器的前一年 Sun Microsystems開始了一個(gè)名為 the Green Project 的計(jì)劃 目的是要搶占 下一波計(jì)算 的先機(jī) 并為此提前做好準(zhǔn)備 計(jì)劃得出的最初結(jié)論是 移動(dòng)數(shù)字設(shè)備與計(jì)算機(jī)的融合將會(huì)很快出現(xiàn) 在 年的夏天 計(jì)劃小組演示了* (星 ) 一個(gè)通過動(dòng)畫式觸摸屏控制的交互性手持娛樂設(shè)備 通過使用Oak 一種全新的編程語言 這個(gè)設(shè)備可控制很多不同的平臺(tái) 而由James Gosling開發(fā)的Oak 其最主要的特點(diǎn)在于它是一個(gè)徹底獨(dú)立于處理器的語言 在往后的幾年中 這種語言被用于Internet 之后成為大眾所知的Java 而 Oak 這個(gè)名字則因?yàn)榘鏅?quán)問題從此消失了 在 年 月 Sun正式宣布Java的誕生 這是一種程序員只需編寫一次 但卻可在多種操作系統(tǒng)及多種硬件平臺(tái)上運(yùn)行的語言 編寫一次 隨處運(yùn)行 在 年 Sun發(fā)布了Java開發(fā)工具包(JDK ) 其后不久 個(gè)主要的操作系統(tǒng)開發(fā)商宣布支持Java技術(shù) 當(dāng)中也包括Microsoft 其以每年大約 萬美元取得五年時(shí)間的Java許可協(xié)議 在 年 月 Sun發(fā)布了Java平臺(tái)的第一個(gè)即時(shí)(JIT)編譯器 在 年 月 JDK 面世 在隨后的三周時(shí)間里 達(dá)到了 萬次的下載量 到了 年初 這個(gè)數(shù)字達(dá)到兩百萬 在 年末 Java 平臺(tái)發(fā)布了 大概半年后 也就是 年年中 Sun發(fā)布了三個(gè)版本的Java平臺(tái) J ME(Java Micro Edition) 應(yīng)用于移動(dòng) 無線及有限資源的環(huán)境 J SE(Java Standard Edition) 應(yīng)用于桌面環(huán)境 J EE(Java Enterprise Edition) 應(yīng)用于基于Java的應(yīng)用服務(wù)器 此后 廣泛應(yīng)用的Java技術(shù)出現(xiàn)了一些framework 如Enterprise JavaBeans (EJB)和JavaServer Pages (JSP) Java技術(shù)的隨后一次升級(jí) 是出現(xiàn)在 年 月的J SE 幾周后 其獲得了Apple公司Mac OS X的工業(yè)標(biāo)準(zhǔn)的支持 J SE 發(fā)布于 年 月份 對(duì)Java平臺(tái)來說 這是一個(gè)幾乎全新的產(chǎn)品 與J SE 相比 其多了近 %的類和接口 在這些新特性當(dāng)中 還提供了廣泛的XML支持 安全套接字支持(通過SSL與TLS協(xié)議) 全新的I/O API 正則表達(dá)式 日志與斷言 在 年 月 是Java最近的一次發(fā)布 J SE (內(nèi)部版本號(hào) ) 代號(hào) Tiger 現(xiàn)已提供公開下載 Tiger包含了從 年發(fā)布 版本以來的最重大的更新 其中包括泛型支持 基本類型的自動(dòng)裝箱 改進(jìn)的循環(huán) 枚舉類型 格式化I/O及可變參數(shù) Java虛擬機(jī)(JVM)是一個(gè)軟件規(guī)范 相關(guān)軟件有責(zé)任遵守它 以運(yùn)行編譯為Java字節(jié)碼的程序 JVM是一個(gè)抽象的計(jì)算機(jī)制 并獨(dú)立于操作系統(tǒng) 具有編譯后的程序體積小 可防止執(zhí)行惡意代碼等特點(diǎn) 其沒有預(yù)先假設(shè)基于任何特定的實(shí)現(xiàn)技術(shù) 不管是硬件還是操作系統(tǒng) 通常我們有幾個(gè)常用的JVM軟件 其 位與 位版本性能有所不同 但它們都包括JIT編譯器和垃圾回收功能(GC) JIT編譯器從JDK 開始就是JVM的一部分了 當(dāng)時(shí)Java只是用于瀏覽器客戶端動(dòng)態(tài)效果顯示的一種技術(shù) JIT編譯器實(shí)現(xiàn)了程序執(zhí)行之前Java字節(jié)碼到硬件機(jī)器碼的動(dòng)態(tài)翻譯 其背后的思想在于 相比Java源代碼 字節(jié)碼更小也更容易編譯 但付出的代價(jià)是需要在Java字節(jié)碼編譯為機(jī)器碼時(shí)花上一點(diǎn)時(shí)間 但與直接把Java源代碼編譯為機(jī)器碼相比 時(shí)間還是少得多的 在 位與 位的JVM中 相應(yīng)的JIT在把Java字節(jié)碼編譯為最終的機(jī)器碼時(shí) 所花的時(shí)間稍微有所不同 但還能進(jìn)行一些優(yōu)化 另外 在IBM與Sun這兩個(gè)版本的客戶端與服務(wù)端程序上 總體性能也會(huì)有所不同 垃圾回收是一種自動(dòng)內(nèi)存管理系統(tǒng) 它會(huì)收回對(duì)象不再需要使用的內(nèi)存 從軟件工程的角度來看 垃圾回收最大的一個(gè)好處就是 程序員不用再操心那些低級(jí)的內(nèi)存管理細(xì)節(jié)了 同時(shí) 垃圾回收也去除了源代碼中兩個(gè)最大的bug 內(nèi)存未釋放(內(nèi)存泄漏)與過早釋放(指針崩潰) 內(nèi)存回收在Java程序運(yùn)行期間占了一個(gè)很重要的部分 因?yàn)樗仨毐唤?jīng)常執(zhí)行以釋放對(duì)象不再訪問的Java堆 由于在 位與 位平臺(tái)上 Java堆中的數(shù)據(jù)大小會(huì)有所變化 所以會(huì)因?yàn)?位與 位JVM的性能差異 導(dǎo)致相應(yīng)垃圾回收的性能也會(huì)有所不同
位背景介紹 位計(jì)算有幾個(gè)重要組成部分 第一就是 位尋址 實(shí)際上 位尋址是通過 位整數(shù)寄存器達(dá)到的(或RISC中所指的通用寄存器) 位寄存器允許 位的指針裝入到單個(gè)的寄存器中 而 位的指針 才是可以尋址訪問更大內(nèi)存的實(shí)質(zhì)所在 當(dāng) 位處理器只能訪問到 字節(jié)或 GB內(nèi)存時(shí) 位處理器理論上卻可尋址訪問 字節(jié)或 × GB內(nèi)存 在現(xiàn)代的 位系統(tǒng)中 可尋址的內(nèi)存的實(shí)際限制通常比理論值低一點(diǎn) 具體依賴于特定的硬件架構(gòu)和操作系統(tǒng) 舉例來說 在基于Linux的操作系統(tǒng)中 受限于當(dāng)前Linux內(nèi)核數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì) 可尋址的內(nèi)存最多為 字節(jié)或 GB 位計(jì)算的第二個(gè)重要方面 就是 位整數(shù)運(yùn)算 要提醒的是 這可不是簡單地因?yàn)橛辛丝纱鎯?chǔ)更多更大整數(shù)量 更寬的 位整數(shù)寄存器而帶來的必然結(jié)果 其最直接的影響就是對(duì)那些需要處理密集大數(shù)值整數(shù)運(yùn)算的程序而言 可帶來性能上的飛躍 第三個(gè)方面 即 位計(jì)算的特性 是 位操作系統(tǒng)與程序的應(yīng)用 相關(guān)的軟件必須全面支持硬件的 位特性 包括 位尋址和運(yùn)算 通常還有一些附帶的好處 如 可操作更多更大的文件 管理更大的磁盤等等 位計(jì)算所帶來的影響 目前已在許多程序中得到了體現(xiàn) 數(shù)據(jù)庫服務(wù)器現(xiàn)在可尋址更大的內(nèi)存 以維持更大的緩沖池 數(shù)據(jù)緩存 或在內(nèi)存中進(jìn)行排序以減少相關(guān)的I/O操作 也能給每個(gè)用戶分配更多的內(nèi)存 支持更多的用戶 或?qū)Ω蟮臄?shù)據(jù)文件進(jìn)行操作 仿真或其他計(jì)算密集的程序也將從中受益 如 現(xiàn)在可以在內(nèi)存中分配更大的數(shù)組了 最后 別忘了還有大量的Java程序 J EE應(yīng)用服務(wù)器 現(xiàn)在也能充分享受到 位計(jì)算所帶來的好處了 位計(jì)算的主要缺點(diǎn)是 與它們 位的兄弟相比 位二進(jìn)制文件一般都更大 因此 最終生成的機(jī)器碼體積也更大 在系統(tǒng)緩存與旁路轉(zhuǎn)換緩存(TLB)大小不變的情況下 可能會(huì)同時(shí)降低兩者的命中率 這就是說 在一定程度上性能會(huì)有所損失 性能評(píng)測 此處用于測試 位與 位JVM性能的系統(tǒng) 是兩臺(tái) 位雙CPU工作站 一臺(tái)是基于AMD 技術(shù)的Opteron系統(tǒng) 而另一臺(tái)是基于PowerPC 的Apple Power Mac G 兩臺(tái)工作站都分別運(yùn)行基于Linux的 位操作系統(tǒng) 受測試的JVM分別來自于IBM和Sun 將使用SPEC的SPECjvm 和SPECjbb 來測試相應(yīng)JVM的性能 其中SPECjvm 使用了以下項(xiàng)目測試客戶端性能 ·_ _press 一個(gè)流行的壓縮程序 ·_ _jess 一個(gè)Java版的NASA CLIPS基于規(guī)則的專家系統(tǒng) ·_ _db 數(shù)據(jù)管理基準(zhǔn)測試軟件 ·_ _javac JDK Java編譯器 ·_ _mpegaudio 一個(gè)MPEG 音頻解碼器 ·_ _mtrt 一個(gè)對(duì)圖像文件進(jìn)行處理的雙線程程序 ·_ _jack 一個(gè)分析程序生成器 SPECjbb (Java商業(yè)基準(zhǔn)程序)是一個(gè)用于服務(wù)端的基準(zhǔn)測試程序 其模仿了三層體系結(jié)構(gòu) 是一個(gè)通用類型的Java服務(wù)端應(yīng)用程序 通過運(yùn)行SPECjvm 以秒為單位記錄了每個(gè)基準(zhǔn)測試的運(yùn)行時(shí)長 時(shí)間越短越好 所有SPECjvm 測試的堆大小因JVM而有所變化 從最小值 MB至最大值 MB 在SPECjbb 測試中 記錄了在三種不同堆大小時(shí)的每秒執(zhí)行操作數(shù) 更高的值代表更高的性能 每一個(gè)測試程序都運(yùn)行三次 取成績最好的一次作為最后的結(jié)果 圖 與圖 顯示了在AMD 平臺(tái)上 Linux版本的Sun Java Standard Edition Development Kit (J SE )在SPECjvm 和SPECjbb 中 位與 位的性能測試結(jié)果 在SPECjvm 測試中 只有三項(xiàng) _ _press _ _mpegaudio _ _jack 在 位版本的JVM上比 位表現(xiàn)出更佳的性能 在SPECjbb 中 位版本的性能只在有足夠堆大小的情況下 才表現(xiàn)出更高的性能 其中在堆大小為 MB時(shí) 因?yàn)槟承┗顒?dòng)數(shù)據(jù)在 位JVM版本中體積更大 導(dǎo)致垃圾回收動(dòng)作更頻繁 從而降低了程序性能
圖 圖 圖 與圖 顯示了在AMD 平臺(tái)上 Linux版本的IBM Developer Kit for Linux Java Technology Edition Version GA在SPECjvm 和SPECjbb 中 位與 位的性能測試結(jié)果 其中 基準(zhǔn)測試程序中有三項(xiàng) _ _db _ _javac _ _jack 在 位環(huán)境下表現(xiàn)出了更佳的性能 另外 在SPECjbb 測試中 當(dāng)面對(duì)三個(gè)不同大小的測試堆時(shí) 位IBM版本的JVM都沒有表現(xiàn)出比 位版本更好的性能 圖 圖 圖 與圖 顯示了在PowerPC 平臺(tái)上 IBM Developer Kit for Linux Java Technology Edition Version GA在SPECjvm 和SPECjbb 中 位與 位的性能測試結(jié)果 此處 在所有SPECjvm 和SPECjbb 的測試中 位JVM的性能都不及 位平臺(tái) 圖 圖 結(jié)論 基于運(yùn)行Linux操作系統(tǒng)的PowerPC 平臺(tái)的測試結(jié)果 表明如果在此平臺(tái)上使用IBM的JVM 那么 那些不需要 位特性的程序 還是讓它們運(yùn)行在 位JVM中吧 因?yàn)樵诖似脚_(tái)的所有測試結(jié)果中 位JVM的性能都比 位平臺(tái)低 而基于運(yùn)行Linux操作系統(tǒng)的AMD 平臺(tái)的測試結(jié)果 表明不管是Sun還是IBM的JVM 位與 位的性能都在伯仲之間 要注意的是 性能的差異是依賴于具體的應(yīng)用程序與JVM的 如果需要最佳性能 就必須在某個(gè)特定的執(zhí)行環(huán)境中測試某個(gè)特定的程序 以評(píng)價(jià)轉(zhuǎn)換到 位所帶來的潛在性能提升 有幾件事情需重點(diǎn)注意 第一 盡管SPECjvm 與SPECjbb 都是工業(yè)標(biāo)準(zhǔn)的基準(zhǔn)測試程序 但它們的測試范圍有限 因此 就測試結(jié)果而言 只對(duì)一部分的Java程序正確 而不是所有 第二 隨著 位計(jì)算越來越被人們接受 我們期待 位程序會(huì)有所改進(jìn) 包括 位JVM 也許其在將來會(huì)大幅提高性能 第三 此處只組合測試了幾種特定的硬件平臺(tái) 操作系統(tǒng)與JVM 因此 如果要進(jìn)一步地說明問題 恐怕只有在 位Windows XP/ 及 位Mac OS X上的進(jìn)行JVM基準(zhǔn)測試了 lishixinzhi/Article/program/Java/hx/201311/26587
對(duì)于很多學(xué)習(xí)開發(fā)的人員來說,進(jìn)行性能優(yōu)化是一個(gè)非常復(fù)雜的問題,并且還需要大量的經(jīng)驗(yàn)和知識(shí)積累。想要優(yōu)化達(dá)到一定的效果是一件非常不容易的事情,很多人認(rèn)為需要在經(jīng)驗(yàn)非常豐富的情況下才能使用,其實(shí)在沒有獲得豐富經(jīng)驗(yàn)和知識(shí)之前也是可能進(jìn)行性能優(yōu)化的,北京電腦培訓(xùn)認(rèn)為只要掌握一定的方法和技巧就能創(chuàng)建出性能良好的程序。
在進(jìn)行性能調(diào)優(yōu)的過程中,主要是基于Java語言,但是也有一些是可以使用在應(yīng)用程序和編程語言中。那么在使用之前,北京IT培訓(xùn)為大家一起討論通用的性能調(diào)優(yōu)技巧。
1、先不要急著優(yōu)化
在必要之前,一定不要急著進(jìn)行優(yōu)化,這是一種非常重要的性能調(diào)優(yōu)方法。在進(jìn)行調(diào)優(yōu)過程中,我們應(yīng)該遵守最佳的實(shí)踐方法,這樣才能得到有效的實(shí)現(xiàn)。但是在使用過程中并不意味著需要證明必要性,最好的方法是使用標(biāo)準(zhǔn)庫或是構(gòu)建復(fù)雜進(jìn)行優(yōu)化。
在很多情況下,如果過早的進(jìn)行優(yōu)化會(huì)占用很大一部分的時(shí)間,還會(huì)出現(xiàn)代碼不好讀取和維護(hù)的情況。如果更嚴(yán)重,這樣的優(yōu)化是不會(huì)帶來任何好處的,很多時(shí)候你花費(fèi)大量時(shí)間進(jìn)行優(yōu)化的程序并非是最關(guān)鍵的地方。
2、使用分析器找到瓶頸
在確定應(yīng)用程序的某些部分需要優(yōu)化的時(shí)候,應(yīng)從哪里進(jìn)行入手呢?解決這種情況主要有兩種方法,昌平IT培訓(xùn)認(rèn)為首先就是了解代碼,找出看上去存在問題和可能產(chǎn)生疑惑的地方開始優(yōu)化。其次是可以使用分析器進(jìn)行優(yōu)化,分析器能夠獲取代碼中每個(gè)部分的性能詳細(xì)信息。
3、為應(yīng)用程序創(chuàng)建測試套件
這個(gè)一種能夠幫助你避免很多問題的方法,很多問題主要是發(fā)生在性能部署在生產(chǎn)環(huán)境之后。在使用過程中,你可以定義測試整個(gè)應(yīng)用程序的套件,這樣就能完成性能改造和運(yùn)行。在測試運(yùn)行的過程中,能夠幫助你更改功能和性能的影響,這樣才能讓利大于弊。如果在使用過程中,你的任務(wù)運(yùn)行于多個(gè)應(yīng)用程序的多個(gè)部分,例如數(shù)據(jù)庫、緩存等,這是非常重要的。
進(jìn)行Java性能調(diào)優(yōu)的技巧有很多種,在進(jìn)行性能調(diào)優(yōu)的過程中可以選擇適合自己的方法,在提高應(yīng)用程序的性能中,不需要做大量的工作。昌平電腦培訓(xùn)認(rèn)為最好的方法就是進(jìn)行稍微努力,這樣就能很好的應(yīng)用到代碼中。
1、介紹在開發(fā)中,性能測試是設(shè)計(jì)初期容易忽略的問題,開發(fā)人員會(huì)為了解決一個(gè)問題而“不擇手段”,所參與的項(xiàng)目中也遇到了類似問題,字符串拼接、大量的調(diào)用和數(shù)據(jù)庫訪問等等都對(duì)系統(tǒng)的性能產(chǎn)生了影響,可是大家不會(huì)關(guān)心這些問題,“CPU速度在變快”,“內(nèi)存在變大”,并且,“好像也沒有那么慢吧”。
有很多商業(yè)的性能測試軟件可供使用,如Jprofiler、JProbeProfiler等,但在開發(fā)當(dāng)中顯得有些遙遠(yuǎn)而又昂貴。
2、目標(biāo)本文將講述如何利用語言本身提供的方法在開發(fā)中進(jìn)行性能測試,找到系統(tǒng)瓶頸,進(jìn)而改進(jìn)設(shè)計(jì);并且在盡量不修改測試對(duì)象的情況下進(jìn)行測試。
3、預(yù)備知識(shí)面向?qū)ο缶幊掏ㄟ^抽象繼承采用模塊化的來求解問題域,但是模塊化不能很好的解決所有問題。
有時(shí),這些問題可能在多個(gè)模塊中都出現(xiàn),像日志功能,為了記錄每個(gè)方法進(jìn)入和離開時(shí)的信息,你不得不在每個(gè)方法里添加log("insomemethod")等信息。
如何解決這類問題呢?將這些解決問題的功能點(diǎn)散落在多個(gè)模塊中會(huì)使冗余增大,并且當(dāng)很多個(gè)功能點(diǎn)出現(xiàn)在一個(gè)模塊中時(shí),代碼變的很難維護(hù)。
因此,AOP(AspectOrientedProgramming)應(yīng)運(yùn)而生。
如果說OO(AobjectOrientedProgramming)關(guān)注的是一個(gè)類的垂直結(jié)構(gòu),那么AOP是從水平角度來看待問題。
動(dòng)態(tài)代理類可以在運(yùn)行時(shí)實(shí)現(xiàn)若干接口,每一個(gè)動(dòng)態(tài)代理類都有一個(gè)Invocationhandler對(duì)象與之對(duì)應(yīng),這個(gè)對(duì)象實(shí)現(xiàn)了InvocationHandler接口,通過動(dòng)態(tài)代理的接口對(duì)動(dòng)態(tài)代理對(duì)象的方法調(diào)用會(huì)轉(zhuǎn)而調(diào)用Invocationhandler對(duì)象的invoke方法,通過動(dòng)態(tài)代理實(shí)例、方法對(duì)象和參數(shù)對(duì)象可以執(zhí)行調(diào)用并返回結(jié)果。
說到AOP,大家首先會(huì)想到的是日志記錄、權(quán)限和事務(wù),是的,AOP是解決這些問題的好辦法。
性能測試主要包括以下幾個(gè)方面:計(jì)算性能:可能是人們首先關(guān)心的,北大青鳥認(rèn)為簡單的說就是執(zhí)行一段代碼所用的時(shí)間內(nèi)存消耗:程序運(yùn)行所占用的內(nèi)存大小啟動(dòng)時(shí)間:從你啟動(dòng)程序到程序正常運(yùn)行的時(shí)間可伸縮性(scalability)用戶察覺性能(perceivedperformance):不是程序?qū)嶋H運(yùn)行有多快,而是用戶感覺程序運(yùn)行有多快.